Клиентское исключение: программное обеспечение вызвало разрыв соединения: сбой recv - PullRequest
0 голосов
/ 06 июля 2011

Я играл с моим клиентским приложением Java.Поведение очень похоже на этот пост (и другие):

java.net.SocketException: сбой соединения из-за программного обеспечения: сбой recv

Пока я не нашелответ - отсюда и этот пост.У меня есть идея, что не так, но я не уверен, что с этим делать.

Протокол прост - считайте некоторые данные, отправьте обратно ACK и повторите (пока не прекратится).

Я смотрел на то, что происходит с WireShark, и кажется, что окно TCP заполняется.Я выполняю flush () для DataOutputStream (для ACK), но через некоторое время я не изменяю факт получения этого исключения (я вижу на WireShark, что перед окном Java всегда возникает проблема с окном).

Итак, как мне убедиться в том, что мои окна / буферы TCP ясны (что, я думаю, является основной причиной проблемы?), Кажется, не сбрасывается в DataInputStream.Удивительно, что пока я читаю его, стек TCP заполняется.

Большое спасибо

Mark

Я прикрепил вызовы основного кода ниже:

     public void connectToServer()
 {
     //Create socket connection      
     try
     {
         if (lSocket == null)
         {
             lSocket = new Socket("localhost", 7651);
             lSocket.setSoTimeout(0);
             lInDataStream = new DataInputStream(lSocket.getInputStream());
             lOutDataStream = new DataOutputStream(lSocket.getOutputStream());
         }
     }
     catch (UnknownHostException e)
     {
         System.out.println("Unknown host: localhost");
     }
     catch  (IOException e)
     {
         System.out.println("No I/O");
     }       
 }

 public void readSocket() throws IOException
 {
     //Receive data from ROS SerialtoNetwork server
     if (lSocket != null)
     {
        lInDataStream.readInt();    
        lInDataStream.readFully(cbuf);

        lOutDataStream.writeBytes("Ack");
        lOutDataStream.flush();

        //String lstr = new String(cbuf);
        //System.out.print(lstr);
        //System.out.println(""); 
    }
 }

 public String getDataBuffer()
 {
     String lstr = new String(cbuf);
     return lstr;
 }

1 Ответ

0 голосов
/ 07 июля 2011

Это указывает на постоянные сетевые ошибки.Есть несколько (повторяющихся) MSDN статей об этой ошибке, например this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...