Hi there, I keep getting “BufferUnderflow” exception in my 2D spaceship multiplayer game. I’m using NIO’s UDP, in my network class, all the communication between clients and server for game initialization worked fine, data did get through and processed. however when game starts, whenever server sends client something(eg, other client’s command, server game state), client encounters that BufferUnderflow. Following is the code where the problem occurs, any help will be really appreciated.
//***client's receiving method***
//***this is the method throws BufferUnderflow exception***
public void cReceive(long rStartTime) {
do {
readBuffer.clear(); //read buffer is initialized in constructor
SocketAddress sourceAddr = null;
// read from the channel into our buffer
try {
sourceAddr = dChannel.receive(readBuffer);
}
catch (Exception ioe) {
System.out.println(ioe);
}
// check for end-of-stream
if (sourceAddr == null) {
break;
}
else {
readBuffer.flip();
int i = 0;
//***following line, will throw the underflow exception***
int thePnum = readBuffer.getInt();
i++; // i is 1 here
int value = readBuffer.getInt();
System.out.println("No underflow until got packet num and type.");
......
}
}
while ((System.currentTimeMillis()-rStartTime)<10);
}
//***server's sending code***
public void broadcastGameState() {
ByteBuffer gameStateBuffer = ByteBuffer.allocate(3072); //enough for holding 100 objects
//consider use compression later on
Vector userGameState=null;
for (int u=2; u<nextAvailableUserId; u++) {
if (clientsAddrs[u-1]!=null) {
gameStateBuffer.clear();
userGameState = gameEngine.getUserGameState(u);
if (userGameState == null) {
continue;
} else {
gameStateBuffer.clear();
///put packet num, type, (server id?), frame num
gameStateBuffer.putInt(0, -1); //packetNum
gameStateBuffer.putInt(4, 19); //type is 19
gameStateBuffer.putInt(8, SERVER_USER_ID);
gameStateBuffer.putInt(12, currentFramesEnd);
for (int k=0; k<userGameState.size(); k++) {
int[] theObj = (int[]) userGameState.elementAt(k);
for (int j=0; j<7; j++) {
gameStateBuffer.putInt(k*28+j*4+16, theObj[j]);
}
}
gameStateBuffer.flip();
try {
dChannel.send(gameStateBuffer, clientsAddrs[u-1]);
} catch (Exception e) {
System.out.println("Exception when broadcasting game state: "+e);
}
}
}
}
}