в моем клиент-серверном приложении я обнаружил странную ошибку. Я получил следующие методы:
sendLoginResponse();
sendPlayerList();
sendCurrentLevelState();
Каждый метод отправляет массив байтов на клиентскую сторону.
Если я вызываю только 2 из них, все работает нормально, и клиентская сторона получает все отправленные массивы байтов. Но если я вызову все 3 из них, только первый и второй прибудут к клиенту, порядок следующих методов не имеет значения. но Сервер говорит, что все они были отправлены. Чтобы написать клиенту iam, используя метод write(byte[] b, int off, int len);
, все длины внутри пакетов также имеют смысл. А вот и странный момент:
если я добавлю Thread.sleep(1000);
после второго метода, третий теперь прибывает к клиенту после сна. Я также пытался сбросить DataOutputStream после каждого вызова записи, но это не помогло.
РЕДАКТИРОВАТЬ:
Итак, скажем, я бы отправил 3 входа-ответа
Метод, который дает мне байт []:
public byte[] getLoginResponse(int playerID){
byte[] msg = new byte[4];
short shortMsgLength = 4;
byte[] msgLength = shortToBytes(shortMsgLength);
msg[0] = 2;
msg[1] = msgLength[0];
msg[2] = msgLength[1];
msg[3] = (byte) playerID;
return msg;
}
private byte[] shortToBytes(short value) {
byte[] returnByteArray = new byte[2];
returnByteArray[0] = (byte) (value & 0xff);
returnByteArray[1] = (byte) ((value >>> 8) & 0xff);
return returnByteArray;
}
И метод отправки:
private void sendLoginResponse() {
try{
byte[] msg = rfcObject.getLoginResponse(playerID);
out.write(msg,0,msg.length);
}catch(Exception e){
System.err.println(e.getMessage());
System.exit(0);
}
}
Итак, если я вызову sendLoginResponse();
три раза подряд, клиент получит только 2 байтовых массива, но сервер скажет, что он был отправлен 3 раза. Если я добавлю
Thread.sleep(1000); `after the second Method-Call, everything works fine..`
Клиент, который читает сообщение, работает в потоке:
public void run(){
while(true){
try {
byte[] data = new byte[MAX_DATA_SIZE]; // MAX_DATA = 255
byteCount = in.read(data);
} catch (IOException ex) {
handleExceptionError(ex);
}
}
}
спасибо!
byteCount
? И нет, это не «единственный способ облегчить чтение». Вам вообще не нужен методgetLoginResponse()
. Я бы переименовал его вsendLoginRespinse()
и предоставил емуDataOutputStream
для записи. И наоборот, код чтения должен использоватьreadByte()
,readShort()
, а затемreadFully()
. Не нужно изобретать велосипед. - person user207421   schedule 13.10.2016