1

ObjectInputStreamメインスレッドとは別のスレッドでを使用して TCP メッセージを読み取るクライアントを作成しました。私はEclipseを使用していますが、コンソールに例外はスローされませんが、ランダムにデバッグウィンドウが開き、スレッドスタックトレースであると思われるものに次のエラーが表示されます。

Thread[Thread-5](Suspended (exception ThreadDeath))
  objectinputstream.readobject() line: not available [local variables unavailable]
  ReceiveRunnable.run()line:25
  Thread.run()line:not available

これは、例外が指すコードです。

class ReceiveRunnable implements Runnable {
  Object receivedObject;

  public void run() {
    while (true) {
      try {             
        receivedObject = client.objectInStream.readObject();  //line 25
      } catch (IOException e) {
        // client.reconnectToServer();

        // System.out.println("IO exception in run()");
    // System.out.println(e);
        e.printStackTrace();
  } catch (ClassNotFoundException e) {
    System.out.println("Class Not Found exception in run()");
        System.out.println(e);
    e.printStackTrace();
      } catch (Exception e) {
    System.out.println("Exception in ReceiveRunnable.run()");
        System.out.println(e.toString());
    e.printStackTrace();
      }
    }
  }
}

client.objectInStreamクラスで作成されClientます:

void connectToServer(){
    try {
        connected = false;

        socket = new Socket(host, port);

        System.out.println("<Connected> " + socket);

        objectInStream = new ObjectInputStream(socket.getInputStream());

        objectOutStream = new ObjectOutputStream(socket.getOutputStream());

        receiveThread = new Thread(new ReceiveRunnable(this, "receive"));

        receiveThread.start();

        /* used to periodically ping the server*/
        long delay = 0;
        long period = 5000;

        connTimer.schedule(clientCheckConnTimerTask, delay, period);

        connected = true;

        sendString("[conn]" + clientUUID);
    } catch (IOException e) {
        msgBox.set2LineOkMessage("Can not connect to server.", "");
        msgBox.show();
    }
}

問題の原因と解決方法を教えてください。

4

1 に答える 1

1

その後に、ソケットを閉じてループから抜け出すtrya が続かない場合、コードは正しくありません。catch (EOFException exc)

後でではなく、常に同じソケットのObjectOutputStream前にを作成する必要があります。そうしないと、デッドロックが発生する可能性があります。ObjectInputStream

于 2013-04-30T01:41:17.950 に答える