我一直在玩我的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;
}