ソケット例外:ソケットが閉じている

私は複数のクライアントと接続できるサーバーを作成したい。 私の主な機能は:

ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(5556);
    } catch (IOException ex) {
        Logger.getLogger(MakaoServer.class.getName()).log(Level.SEVERE, null, ex);
    }
    while (true) {
        try {
            Socket connection = serverSocket.accept();
            PlayerConnection playerConn = new PlayerConnection(connection);
            playerConn.start();
        } catch (IOException ex) {
            System.out.println("Nie można było utworzyć gniazda.");
        }
    }

PlayerConnectionはThreadクラスです。実行方法:

public void run() {
    InputStream input = null;
    while (true) {
        try {
            input = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            String msg = reader.readLine();
            System.out.println(msg);

        } catch (IOException ex) {
            Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex);
        } finally {

        }
    }
}

クライアントを実行してサーバーにメッセージを送信すると、受信されましたが、次のwhileループ反復connection.getInputStream();ソケット例外をスローするソケットがクローズされています。どうして?

java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at makaoserver.PlayerConnection.run(PlayerConnection.java:38)
4
readLine() null を返すとき、読込みループは終了する必要があります。現在、ピアが接続を閉じると、 null メッセージの無限ストリームが得られます。
追加された 著者 EJP,

2 答え

入力ストリームとバッファされたリーダーをループの外側に置きます。

同じ入力ストリームに複数のストリームが接続されている可能性があります。

6
追加された
複数のストリームを作成しても、この問題は発生しません。それらを閉じます。
追加された 著者 EJP,
入力ストリームのハンドルを持たなければ初期化を続ける必要はありません。あなたのreadlineは依然としてメッセージを収集するループになります。
追加された 著者 Sid Malani,
ロガーを取り外してe.printStackTraceを置いて、ここにトレースを印刷できますか?
追加された 著者 Sid Malani,
あなたのクライアントは接続を終了していると思います。サーバーコードに何も問題はないようです。クライアントコードも貼り付けることができますか?入力ストリームのバッファ付きリーダのイニシャルをループの外に移動する必要があります
追加された 著者 Sid Malani,
しかし、私はクライアントから複数のメッセージを取得したい。入力ストリームとバッファされたリーダーをループの外側に置くと、私はただ一つのメッセージしか得られません。
追加された 著者 latata,
私は同じ例外を得る:(
追加された 著者 latata,
質問が編集されました
追加された 著者 latata,

お試しください

public void run() {
    InputStream input = null;
    input = connection.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(input));

    while (true) {
        お試しください {
            String msg = reader.readLine();
            System.out.println(msg);
        } catch (IOException ex) {
            Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex);
        } finally {

        }
    }
}

また、あなたがそれらで完了したときにソケットを閉じることを忘れないでください

お試しください {
 //Create objects
 //do stuff
} finally {
  if (obj != null) obj.close();
}
0
追加された
@latata、なぜ OutputStream を開くとソケットが閉じられるのですか?
追加された 著者 AlikElzin-kilaka,
このコードはストリームの終わりに永遠に回転します。 readLine()の結果をNULLチェックする必要があります。
追加された 著者 EJP,
あなたは、接続を閉じた例外は、ループを介して2番目のパスでconnection.getInputStream()にスローされたと述べた。この行はもはやループにはなく、ここでは例外がどこにスローされますか?また、サーバー側からの接続を閉じる可能性があるので、PlayerConnectionのコードの一部を表示してください。
追加された 著者 David Waters,
私はそれをやったが、私はまだ同じ例外を取得します。
追加された 著者 latata,
私はこの問題を解決しました。 :)例外を発生させたOutputStreamも開いていました。
追加された 著者 latata,