1

クライアントからサーバーへのログイン通信を行っています。

サーバー側で java.net.SocketException: break Pipe に遭遇しました。そして、問題をクライアント エンドの 1 行に絞り込みました。この行の位置を移動すると、コードが機能します。次のコードを参照してください。

クライアントエンド:

    Socket socket = new Socket(Const.destIp, 12101);
    ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
    out.writeObject(this.message);              
    out.close();//Line that cause problem   
    ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
    ServerToClientLogin msg = (ServerToClientLogin) in.readObject();
    //out.close();//move it to here, problem solved
    in.close();
    socket.close();

サーバー側:

   while (true) {
     socket = _serverSocket.accept();
     in = new ObjectInputStream(socket.getInputStream());
     msg = (ClientToServerLogin) in.readObject();

     ServerToClientLogin msgToSend = null;
     out = new ObjectOutputStream(socket.getOutputStream());
     msgToSend = handleLoginRequest(msg);
     if(msgToSend != null) out.writeObject(msgToSend);

     try { in.close(); } catch (IOException e) {e.printStackTrace();}
     try { out.close();} catch (IOException e) {e.printStackTrace(); }
     try { socket.close();} catch (IOException e) {e.printStackTrace();}

}

readObject と writeObject は呼び出しをブロックしているため、以前に閉じるとこのような問題が発生する理由がわかりません。

4

1 に答える 1

1

out.close();: この ( ) 出力ストリームを閉じout、このストリームに関連付けられているシステム リソースをすべて解放します。

APIはこちらを参照してください。

于 2013-05-05T04:09:50.760 に答える