奇怪的Java套接字行为(连接,但不发送)
我有一个相当复杂的项目,可以归结为一个通过对象流进行通信的简单客户机/服务器 在两个连续的连接中(我连接一次,工作,断开连接,然后再次连接,工作,断开连接),一切都能完美地工作。客户端连接、执行其业务,然后关闭。服务器成功关闭对象输出流和套接字,没有IO错误 当我第三次尝试连接时,连接似乎通过了(ServerSocket.accept()方法通过了,并且成功创建了ObjectOutputStream)。但是,没有传递任何数据。readUnshared()方法只是阻塞 我已采取以下记忆预防措施:奇怪的Java套接字行为(连接,但不发送),java,sockets,objectoutputstream,Java,Sockets,Objectoutputstream,我有一个相当复杂的项目,可以归结为一个通过对象流进行通信的简单客户机/服务器 在两个连续的连接中(我连接一次,工作,断开连接,然后再次连接,工作,断开连接),一切都能完美地工作。客户端连接、执行其业务,然后关闭。服务器成功关闭对象输出流和套接字,没有IO错误 当我第三次尝试连接时,连接似乎通过了(ServerSocket.accept()方法通过了,并且成功创建了ObjectOutputStream)。但是,没有传递任何数据。readUnshared()方法只是阻塞 我已采取以下记忆预防措施:
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
new WorkThread(serverSocket.accept()).start();
}
工作线程(服务器)
客户端
public Client() {
Object myObject;
Socket mySocket = new Socket(address, port);
try {
ObjectOutputBuffer output = new ObjectOutputBuffer(new BufferedOutputStream(mySocket.getOutputStream()));
output.reset();
output.flush();
} catch (Exception e) {
System.out.println("Could not get an input.");
mySocket.close();
return;
}
// get object data is not specified in this sample. it simply returns a serializable object
myObject = getObjectData();
while (myObject != null) {
try {
output.writeUnshared(myObject);
output.reset();
output.flush();
} catch (Exception e) {
e.printStackTrace();
break;
} // catch
} // while
try {
output.close();
socket.close();
} catch (Exception e) {
System.out.println("Could not close.");
}
}
感谢所有能够提供帮助的人 (1)什么是ObjectInputBuffer和ObjectOutputBuffer?您是指ObjectInputStream和ObjectOutputStream吗
(2) 如果是这样,在创建ObjectOutputStream后立即调用reset()只会浪费时间和带宽
(3) 为什么在创建输出流的异常上打印“无法获取输入”
(4) 当你遇到异常时,你应该总是打印它的消息——不要完全用你自己的消息来代替它,那只是丢掉有用的信息
(5) 您假设读取时的任何IOException都意味着流的结束。只有EOFEException意味着这一点。应打印或记录任何其他IOException。很明显,您在这里遇到了一些其他异常,并且忽略了它
(6) 为什么一直发送相同的对象?来自ObjectInputStream API for readUnshared(): 从中读取“非共享”对象 ObjectInputStream。这种方法是可行的 与readObject相同,只是 它可以防止后续调用 readObject和readUnshared自 返回对 通过获取反序列化实例 这个电话
这可能是问题所在吗?改用readObject()。使用readUnshared和readObject有什么原因吗?我觉得这很危险。
public Client() {
Object myObject;
Socket mySocket = new Socket(address, port);
try {
ObjectOutputBuffer output = new ObjectOutputBuffer(new BufferedOutputStream(mySocket.getOutputStream()));
output.reset();
output.flush();
} catch (Exception e) {
System.out.println("Could not get an input.");
mySocket.close();
return;
}
// get object data is not specified in this sample. it simply returns a serializable object
myObject = getObjectData();
while (myObject != null) {
try {
output.writeUnshared(myObject);
output.reset();
output.flush();
} catch (Exception e) {
e.printStackTrace();
break;
} // catch
} // while
try {
output.close();
socket.close();
} catch (Exception e) {
System.out.println("Could not close.");
}
}