0

Java デスクトップ サーバーと、ソケットを使用する複数の Android タブレット クライアントがあります。2 つまたは 3 つのクライアントのそれぞれが短いテキスト メッセージをサーバーに送信し、サーバーは応答メッセージを送信します。どちらも短文。

サーバーは、クライアント接続ごとに個別のスレッドを起動します。

問題は、2 つのクライアントをセットアップし、それぞれからテキスト メッセージを送信していたところ、メッセージを送信した後、クライアントの 1 つが常にフリーズし、それ以上メッセージを送受信できなくなったことです。常にではありませんが、約 50% の確率で。

ソケットのタイムアウト時間を調整し、出力ストリームに bufferedWriter を追加してみました。しかし、これらの変更はどちらも役に立ちませんでした。

デスクトップJavaアプリケーション、サーバー:

致命的: Fatal excepiton, null, java.net.SocketTimeoutException: Read timed out

Android タブレットの 1 つであるクライアントは、次のようになります。

 03-01 17:31:13.740: W/System.err(2992): java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)

これには一般的な原因がありますか、それとも私が試すことができるものはありますか?

以下に示す完全なサーバーログキャット:

2013/03/01 17:33:17 com.example.lotterygame.MultiThreader run
致命的: null
java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
    at java.io.InputStreamReader.read(InputStreamReader.java:167)
    at java.io.BufferedReader.fill(BufferedReader.java:136)
    at java.io.BufferedReader.readLine(BufferedReader.java:299)
    at java.io.BufferedReader.readLine(BufferedReader.java:362)
    at jp.co.forever.lotterygame.MultiThreader.run(MultiThreader.java:43)
    at java.lang.Thread.run(Thread.java:662)

編集、

null の送信元の行をサーバーに追加し、

以下のコードの行 ---> while((line = in.readLine())!= null){

    @Override
public void run() {
    try {       
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

     System.out.println("streams are setup from new thread\n");

     String line ="";

            while((line = in.readLine())!= null){

                SocketPack spk = new SocketPack(socket, line.trim());
                this.messageFromClient(spk);


            }

              out.close();
              in.close();
              socket.close();
    } // end run
    catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    } // end run

    public void messageFromClient(SocketPack msgc){
        this.setChanged();
        this.notifyObservers(msgc);
    }
4

1 に答える 1

0

「null」は、IOException をキャッチしたときに nullをログに記録する独自のコードから来ています。

関連するのはタイムアウトです。これは、読み取りタイムアウトを設定したために発生します。つまり、ピアはその時間内に何も送信しませんでした。

「接続のリセット」は、おそらくピアでのタイムアウトの結果であり、ピアが接続を閉じたり、終了したりします。

于 2013-03-01T21:46:54.170 に答える