Я создал SocketChannel на удаленном сервере для отправки и получения сообщений на Tomcat. Для получения сообщений с удаленного компьютера я использовал поток, посвященный задаче (только этот поток будет читать из сокета, ничего больше).
Когда некоторые байты получены в SocketChannel (я продолжаю опрашивать SocketChannel в неблокирующем режиме для получения новых данных), я сначала читаю 4 байта, чтобы получить длину следующего сообщения, затем выделяю и считываю x байтов из SocketChannel, что составляет затем декодируется и реконструируется в сообщение.
Ниже приведен мой код для принимающего потока:
@Override
public void run() {
while (true) { //Don't exit thread
//Attempt to read the size of the incoming message
ByteBuffer buf = ByteBuffer.allocate(4);
int bytesread = 0;
try {
while (buf.remaining() > 0) {
bytesread = schannel.read(buf);
if (bytesread == -1) { //Socket was terminated
}
if (quitthread) break;
}
} catch (IOException ex) {
}
if (buf.remaining() == 0) {
//Read the header
byte[] header = buf.array();
int msgsize = (0xFF & (int)header[0]) + ((0xFF & (int)header[1]) << 8)
+ ((0xFF & (int)header[2]) << 16) + ((0xFF & (int)header[3]) << 24);
//Read the message coming from the pipeline
buf = ByteBuffer.allocate(msgsize);
try {
while (buf.remaining() > 0) {
bytesread = schannel.read(buf);
if (bytesread == -1) { //Socket was terminated
}
if (quitthread) break;
}
} catch (IOException ex) {
}
parent.recvMessage(buf.array());
}
if (quitthread) {
break;
}
}
}
Первые байты, которые я получил от SocketChannel, в порядке, и я успешно расшифровал сообщение. Однако в следующий раз, когда я читал из SocketChannel, сокет пропустил примерно 100 байтов вперед, что привело к чтению и интерпретации неправильных байтов как длины, что привело к повреждению всего.
Что не так с кодом? Ни один другой поток не читает из SocketChannel.