Канал сокета - ошибка readIntoNativeBuffer()
Я уже давно сталкиваюсь с этой проблемой. Краткое объяснение системы:
Простое приложение будет читать данные через TCP-соединение. Приложение использует объект Socketchannel для установления линии передачи данных. Соединение с оборудованием установлено, и приложение обрабатывает примерно от 400 до 700 пакетов, прежде чем выдать ошибку:
в sun.nio.ch.SocketDispatcher.read0(собственный метод) в sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43) в sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:218) на солнце.nio.ch.IOUtil.read(IOUtil.java:186) в sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:359)
Я подозреваю, что это связано с буфером операционной системы (Windows 7), хотя я попытался несколько обойти (увеличение размера кучи JVM и создание дополнительных переменных реестра для настроек TCP), но безуспешно.
Изучая пакетные данные с помощью wireshark, можно увидеть следующую информацию, как только происходит ошибка
[TCP Window Full] 5001 > 49995 [PSH, ACK] Seq=123177 Ack=1 Win=200 Len=176 [TCP ZeroWindow] 49995 > 5001 [ACK] Seq=1 Ack=123353 Win=0 Len=0
Который затем сопровождается серией
[TCP Dup ACK 144#1] 5001 > 49995 [ACK] Seq=123353 Ack=1 Win=200 Len=0
пока соединение не будет разорвано.
Я надеюсь, что, возможно, кто-то сталкивался с подобной проблемой в прошлом или мог бы предложить некоторые рекомендации по поводу того, что я могу упустить из виду.
Вот пример кода, где данные читаются, и выдается ошибка.
try{
do{
socketChannel.read(syncBuf);
start = syncBuf.get(0);
int b = start;
System.out.println("start byte is " + b);
syncBuf.clear();
}while(start != INIT_BYTE);
}catch(Exception e){
e.printStackTrace();
}
packetBuf.order(ByteOrder.LITTLE_ENDIAN);
packetBuf.clear();
try{
while(socketChannel.read(packetBuf) != 206){
nrBytesRead += socketChannel.read(packetBuf);
}
}catch(Exception e){
ApplicationLogger.log("Error at INIT_BYTE loop ", "ERROR");
}
Большое спасибо.
1 ответ
Я думаю, у вас есть проблема здесь:
while(socketChannel.read(packetBuf) != 206)
{
nrBytesRead += socketChannel.read(packetBuf);
}
socketChannel.read(packetBuf)
вернет прочитанное число на этот раз, а не общее, и я думаю, что это 206, общее количество прочитанных.
Вы, вероятно, хотите сделать это:
do
{
nrBytesRead += socketChannel.read(packetBuf);
}
while (nrBytesRead != 206)