Я играл с моим клиентским приложением 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;
}