我有一个相当复杂的项目,归结为一个简单的客户端/服务器通过对象流进行通信。奇怪的Java套接字行为(连接,但不发送)
一切工作完美的连续两个连接(我连接一次,工作,断开,然后再次连接,工作,并断开连接)。客户连接,完成业务,然后关闭。服务器成功地关闭了对象输出流和套接字,没有IO错误。
当我第三次尝试连接时,连接似乎要经过(ServerSocket.accept()方法通过并成功创建ObjectOutputStream)。然而,没有数据通过。 inputStream.readUnshared()方法只是阻塞。
我采取了以下措施内存:
- 当谈到时间来关闭插座,所有正在运行的线程停止,所有的对象都清零了。
- 在每次调用writeUnshared()方法 后,ObjectOutputBuffer将被刷新并重置为 。
有没有人遇到类似的问题,或者没有人有任何建议吗?恐怕我的项目很大,所以复制代码是有问题的。
项目归结为:
服务器主
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.");
}
}
CLIENT
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.");
}
}
谢谢大家谁可能能够帮助!
你有使用readUnshared与readObject的原因吗?这看起来对我来说很危险。 – mdma 2010-05-21 21:12:27