我正在创建一个接受TCP套接字连接并显示它发送的信息的应用程序。这有效。我已经决定,我希望能够多次从客户端向服务器发送信息。现在这就是它发送的方式。
socketStream = socket.getOutputStream();
to_send.add(new String[][] {{
ips + ":" + socket.getPort(),
System.getProperty("user.name"),
System.getProperty("os.name")
}});
sendData(to_send);
while(!finished) {
socketStream = socket.getOutputStream();
oos = new ObjectOutputStream(socketStream);
oos.writeObject(new String[][] {{"Open","LOL"}});
oos.flush();
}
-
public void sendData(ArrayList<String[][]> d) {
try {
oos = new ObjectOutputStream(socketStream);
oos.writeObject(d);
oos.flush();
System.out.println("Sent: " + to_send.get(0));
} catch (Exception e) {
System.out.println(e.toString());
}
}
我收到此错误:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
at java.io.ObjectOutputStream.writeNonProxyDesc(Unknown Source)
at java.io.ObjectOutputStream.writeClassDesc(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeFatalException(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at Server.<init>(Server.java:57)
at Server.main(Server.java:26)
答案 0 :(得分:1)
请勿关闭sendData
中的套接字。您需要处理sendData
以外的代码中的结束。
编辑:当远程端终止连接时,可能会导致此异常。可能发生的情况是您使用两个ObjectOutputStream
导致服务器发生异常,这会强行终止连接。
答案 1 :(得分:0)
在完成套接字之前,请不要关闭输出流。关闭输出流或输入流将关闭套接字。
不要使用多个ObjectOutputStreams
和ObjectInputStreams
。在插座的两端使用其中一个,两端。否则你会遇到StreamCorruptedExceptions
。这些东西在构造时写入并期望标题,如果你在流的中间打开一个新的,另一端将是barf。