Канал сокета - ошибка 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)
Другие вопросы по тегам