客户端异常:软件导致连接中止:recv失败

时间:2011-07-06 14:31:28

标签: java sockets tcp

我一直在玩我的Java客户端应用程序。行为与这篇文章(和其他人)非常相似:

java.net.SocketException: Software caused connection abort: recv failed

到目前为止,我还没有找到答案 - 因此这篇文章。我知道出了什么问题,但我不知道该怎么办。

协议很简单 - 读取一些数据,发回ACK并重复(直到终止)。

我一直在看WireShark发生了什么,似乎TCP窗口正在填满。我正在DataOutputStream上执行flush()(对于ACK)但是在一段时间后我没有改变这个事实我得到了这个异常(我可以在WireShark上看到在Java异常之前总是存在窗口问题)

那么如何在Java中确保我的TCP窗口/缓冲区是清楚的(我认为这是问题的根本原因?)似乎没有在DataInputStream上刷新。让我感到奇怪的是,虽然我可能正在阅读它,但TCP栈正在填满。

非常感谢

标记

我已经附上了下面的基本代码调用:

     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 :(得分:0)

这表示持续的网络错误。关于此错误,有几篇(重复的)MSDN文章,例如: this one