[英]Strange Java Socket Behavior (Connects, but Doesn't Send)
我有一个相当复杂的项目,可以归结为一个通过对象流进行通信的简单客户端/服务器。
对于两个连续的连接(我连接一次,工作,断开连接,然后再次连接,工作和断开连接),一切工作正常。 客户端进行连接,开展业务,然后关闭。 服务器成功关闭了对象输出流和套接字,没有IO错误。
当我尝试第三次连接时,连接似乎通过了(ServerSocket.accept()方法通过并成功创建了ObjectOutputStream)。 但是,没有数据传递。 inputStream.readUnshared()方法只是阻塞。
我已采取以下记忆预防措施:
有没有人遇到过类似的问题,或者有任何建议吗? 恐怕我的项目很大,因此复制代码是有问题的。
该项目归结为:
服务器主要
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
new WorkThread(serverSocket.accept()).start();
}
工作线程(服务器)
public void run() {
ObjectInputBuffer inputBuffer = new ObjectInputBuffer(new BufferedInputStream(socket.getInputStream()));
while (running) {
try {
Object myObject = inputBuffer.readUnshared();
// do work is not specified in this sample
doWork(myObject);
} catch (IOException e) {
running = false;
}
}
try {
inputBuffer.close();
socket.close();
} catch (Exception e) {
System.out.println("Could not close.");
}
}
客户
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表示流的结尾。 只有EOFException表示。 任何其他IOException都应打印或记录。 显然,您在这里遇到了其他一些异常而忽略了它。
(6)为什么继续发送相同的对象?
从ObjectInputStream API读取readUnshared():
从ObjectInputStream读取“非共享”对象。 此方法与readObject相同,除了它防止随后对readObject和readUnshared的调用返回对通过此调用获得的反序列化实例的附加引用。
这可能是问题吗? 使用readObject()代替。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.