オブジェクトストリームを介して通信する単純なクライアント/サーバーに要約されるかなり複雑なプロジェクトがあります。
2 つの連続した接続では、すべてが問題なく動作します (1 回接続し、動作し、切断し、再度接続し、動作し、切断します)。クライアントは接続し、ビジネスを行い、終了します。サーバーは、IO エラーなしで、オブジェクト出力ストリームとソケットの両方を正常に閉じます。
3 回目の接続を試みると、接続が確立されているように見えます (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.");
}
}
クライアント
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.");
}
}
助けていただけるかもしれないすべての人に感謝します!