可能重复:
java.net.SocketException: Software caused connection abort: recv failed
我正在尝试编写一个客户端服务器对,其中连接全天都在运行,客户端等待服务器发送消息。步骤是:
我可以让步骤1-4工作,但是如果我尝试重复步骤3,我会在标题中得到错误。
这是我在客户端的方法:
private static void waitForInput(SSLSocket sslsocket) throws IOException {
do {
try {
ObjectInputStream ois = new ObjectInputStream(sslsocket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getOutputStream());
Object o = (Object) (ois.readObject());
// excluded code to process data
oos.flush();
oos.writeObject(o);
oos.reset();
}
catch(ClassNotFoundException e){
System.err.println(e.getMessage());
}
} while ( true );
}
代码在第4行失败,它第一次阻塞并等待直到我得到下一位数据,但它不能工作两次。我做错了什么?
答案 0 :(得分:0)
连接中止当您等待从另一端已关闭的套接字读取时抛出IOException,如果您没有意外关闭套接字,请检查您的服务器端代码。 此外,可以上传服务器端代码以进行更深入的分析,也可以尝试发布堆栈跟踪,这将有助于分析。
答案 1 :(得分:0)
您可以将ois
和oos
的声明移出do ... while
循环,因为无需每次都重新声明它们,可能需要try ... catch
左右
private static void waitForInput(SSLSocket sslsocket) throws IOException {
ObjectInputStream ois = new ObjectInputStream(sslsocket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getOutputStream());
do {
try {
Object o = (Object) (ois.readObject());
// excluded code to process data
oos.writeObject(o);
oos.flush();
}
catch(ClassNotFoundException e){
System.err.println(e.getMessage());
}
} while ( true );
}
我删除了oos.reset();
并移动了oos.flush();
我认为问题是oos.reset();
,我永远不会重置一个应该持续数小时的连接,或者至少部分连接。
此外,该连接已有ois
,您不需要其中两个。