В настоящее время я отлаживаю два Java-приложения, которые обмениваются данными через TCP-соединение.
Одно из приложений, TCP-клиент, периодически отправляет срочные данные другому, TCP-серверу, вызывая Разъем # sendUrgentData (INT) .На 18-й попытке отправить срочные данные клиент TCP выдает следующее исключение
java.io.IOException:BrokenPipe
at java.net.PlainSocketImpl.socketSendUrgentData(Native Method)
at java.net.PlainSocketImpl.sendUrgentData(PlainSocketImpl.java:541)
at java.net.Socket.sendUrgentData(Socket.java:927)
Сервер TCP выдает это исключение
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
Я полагаю, что исключения вызваны попыткойдля записи / чтения в закрытое соединение / сокет.Я не понимаю, почему соединение или сокет закрывается после вызова sendUrgentData () 17 раз.Я могу повторить это, и это происходит всегда после 17 раз.
Если я запускаю клиент и сервер в Windows, проблема возникает.Если я запускаю клиент и сервер в Solaris, проблема не возникает.Если я запускаю клиент на Solaris и сервер на Windows, проблема возникает.Если я запускаю клиент в Windows и сервер в Solaris, проблема не возникает.Это заставляет меня думать, что это может быть связано с Windows?
Использование Wireshark Я вижу следующий трафик на соединении
--> = from TCP client to TCP server
<-- = from TCP server to TCP client
--> [PSH, ACK, URG] (Seq=1, Ack=1)
<-- [ACK] (Seq=1, Ack=2)
--> [PSH, ACK, URG] (Seq=2, Ack=1)
<-- [ACK] (Seq=1, Ack=3)
...
--> [PSH, ACK, URG] (Seq=17, Ack=1)
<-- [RST, ACK] (Seq=1, Ack=18)
Я написал несколько простых тестовых классов, которые показывают проблему.
TCPServer.java IP_Address Port
public class TCPServer
{
public static void main(String[] args) throws Exception
{
ServerSocket socket = new ServerSocket();
socket.bind(new InetSocketAddress(args[0], Integer.parseInt(args[1])));
System.out.println("BOUND/" + socket);
Socket connection = socket.accept();
System.out.println("CONNECTED/" + connection);
int b;
while ((b = connection.getInputStream().read()) != -1) {
System.out.println("READ byte: " + b);
}
System.out.println("CLOSING ..");
connection.close();
socket.close();
}
}
TCPClient.java IP_Address Port Interval_Between_Urgent_Data
public class TCPClient
{
public static void main(String[] args) throws Exception
{
final Socket socket = new Socket();
socket.connect(new InetSocketAddress(InetAddress.getByName(args[0]), Integer.parseInt(args[1])));
System.out.println("CONNECTED/"+socket);
Timer urgentDataTimer = new Timer(true);
urgentDataTimer.scheduleAtFixedRate(new TimerTask()
{
int n = 0;
public void run() {
try {
System.out.println("SENDING URGENT DATA ("+(++n)+") ..");
socket.sendUrgentData(1);
System.out.println("SENT URGENT DATA");
} catch (Exception e) {
e.printStackTrace();
}
}
}, 1000, Integer.parseInt(args[2]));
int b;
while ((b = socket.getInputStream().read()) != 1) {
System.out.println("READ byte: " + b);
}
System.out.println("CLOSING ..");
urgentDataTimer.cancel();
socket.close();
}
}
Может ли кто-нибудь объяснить, что здесь происходит?
Спасибо.