我有一个相当复杂的项目,归结为通过对象流进行通信的简单客户端/服务器。
对于两个连续的连接(我连接一次,工作,断开连接,然后重新连接,工作和断开连接),一切都完美无瑕。客户端连接,执行其业务,然后关闭。服务器成功关闭对象输出流和套接字,没有IO错误。
当我尝试第三次连接时,连接似乎经过(ServerSocket.accept()方法通过并成功创建了ObjectOutputStream)。但是,没有数据通过。 inputStream.readUnshared()方法只是阻塞。
我采取了以下内存预防措施:
有没有人遇到过类似的问题,或者有没有人有任何建议?我担心我的项目相当大,因此复制代码是有问题的。
该项目归结为:
SERVER MAIN
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
new WorkThread(serverSocket.accept()).start();
}
WORK THREAD(SERVER)
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.");
}
}
感谢所有可能提供帮助的人!
答案 0 :(得分:2)
答案 1 :(得分:0)
来自ObjectInputStream API的readUnshared():
从中读取“非共享”对象 ObjectInputStream的。这个方法是 与readObject相同,除了 它会阻止后续调用 readObject和readUnshared from 返回附加的引用 通过获得的反序列化实例 这个电话。
这可能是问题吗?改为使用readObject()。