1

これは私が直面している本当に単純な問題であることを知っているので、私はグーグルで何時間も検索してきましたが、私の問題に対する簡単な解決策を見つけることができません。

私は本当に基本的なIRCクライアントを書いています。コーディングを行ってから長い時間が経ち、後でやりたいプロジェクトがあるので、Javaのロープを再学習するためです。

私はソケットリスナーで立ち往生していますが、必要に応じてコードを提供できますが、本当に必要なのは、ソケットをリッスンしてすでに作成されているループを作成し、データを受信するとすぐに何かを実行する方法に関する簡単なチュートリアルです。このループは、ソケットが閉じられるまで(ユーザーがサーバーから切断するまで)継続する必要があります

私の現在のコードの問題は、リスナーがデータを受信するまでプログラム全体をハングさせているように見えることです。別のスレッドにwhileループを配置して、データが到着するまでそのスレッドをハングさせることができるようにしましたが、それでもプログラム全体がハングします。

答えを言われたくない、答えを見つける方法を知りたい。イベントドリブンリスナーの作成も検討しましたが、それは私が必要としているものにとっては非常に複雑に思えました。

コードを投稿する必要がないことを望んでいたのは、コードを機能させるために行ったすべての編集の後で混乱するためですが、これまでのところ、次のようになっています。

ListenToServer.java:

class ListenToServer extends Thread{

JTextPane outputDestination = null;
Socket establishedSocket = null;

public void kickStartprep(Socket establishedSocket, JTextPane outputDestination){
    this.establishedSocket = establishedSocket;
    this.outputDestination = outputDestination;
}


@Override
public void run(){

    UpdateServerStatusWindow("Thread is running!", outputDestination);


    BufferedReader inFromServer = null;

  try{
  inFromServer = new BufferedReader(new InputStreamReader(establishedSocket.getInputStream()));

      while (inFromServer.readLine().isEmpty() == false){
        UpdateServerStatusWindow(inFromServer.readLine(), outputDestination);  
      }


  }
  catch (Exception e){
      UpdateServerStatusWindow(e.toString(), outputDestination);
  }
}


public void UpdateServerStatusWindow(String message, JTextPane destination){

    StyledDocument doc = destination.getStyledDocument();
    try
{
doc.insertString(doc.getLength(), '\n' + message, null);    
}
catch(Exception e){ 
    JOptionPane.showMessageDialog(null, "There was an error updating the server     message output window in the TCP Listner!");
    JOptionPane.showMessageDialog(null, e);

}

}
}

次に、次のように呼び出します。

MainGUI.java

 ListenToServer serverListener = new ListenToServer();
    serverListener.kickStartprep(establishedConnection, ServerMessageOutput);
    serverListener.run();
4

1 に答える 1

2

友人がこのコードを見て、問題は私がスレッドを呼び出す方法にあることを発見しました。基本的に私は電話する必要がありました:

serverListener.start();

それ以外の

serverListener.run();

これで問題は解決し、IRCクライアントはサーバーに正しく接続できるようになりました。

于 2013-03-25T20:09:03.477 に答える