0

クライアントクラスとサーバークラスがあります。サーバーを呼び出すために使用するクライアント メソッドがあり、jvm セッション中にこのメソッドを複数回使用しようとすると、コードがハングします。

クライアント コードのメイン メソッド:

methodA();
methodA();
ois.close(); //ObjectInputStream
oos.close(); //ObjrctOutputStream
is.close(); //InputStream
os.close(); //OutputStream
socket.close();

クライアントコードは次のmethodA()ようになります。

os = socket.getOutputStream();
oos = new ObjectOutputStream(os);
oos.writeObject(obj);
is = socket.getInputStream();
ois = new ObjectInputStream(is);
Object o = ois.readObject();

サーバー コードのメイン メソッドは次のようになります。

while (true) {
    Socket socket = serverSocket.accept();
    is = socket.getInputStream();
    ois = new ObjectInputStream(is);
    Object o = ois.readObject();
    servermethod();
}
oos.close();
ois.close();
is.close();
os.close();
serverSocket.close();

サーバーは次のserverMethod()ようになります。

os = socket.getOutputStream();
oos = new ObjectOutputStream(os);
Object ob = getObject() ; //this method is working fine
oos.writeObject(ob);

私がやりたかったのは、クライアントが を使用してサーバーを数回呼び出すことでしたmethodA()。ストリームを正しく処理していない可能性があります。何か助けはありますか?

4

2 に答える 2

2

このコードには間違いなくいくつかの問題があります。

  • 同じストリームの上に ObjectInputStream と ObjectOutputStream を繰り返し作成しています。これは、それらの使用方法ではありません。あなたがすべきことは、ObjectXxxStream を 1 回作成してから、同じ ObjectXxxStream で readObject または writeObject を複数回呼び出すことです。同じオブジェクトを複数回送信する場合はreset、オブジェクトを再度書き込む前に呼び出す必要があります。

  • ストリームをフラッシュしていません。書き込み後にフラッシュしない場合、シリアル化された表現が相手に送信されるという保証はありません...バイトが到着するのを何かが待っているところです。

于 2013-04-23T06:16:15.043 に答える
0

サーバー エンド コードは、1 つのオブジェクトのみを読み取り、新しく作成された に 1 つのオブジェクトのみを書き込むように記述されていSocketます。したがってSocket、2回目またはn回目を再利用しようとすると、サーバーからの応答が返されません。それを修正するには2つの方法があります。

  1. サーバー側で修正できます。これは手の込んだ変更になりますが、リソースをより有効に使用できます。ストリームが閉じられるまで、ストリームの読み取りを停止しません。

  2. クライアント エンドで修正します。メソッドのSocket外側を作成する代わりに、内側を作成します。しかし、簡単で汚い解決策。mainSocketMethodA()

于 2013-04-23T06:00:39.417 に答える