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);
}