これは私が直面している本当に単純な問題であることを知っているので、私はグーグルで何時間も検索してきましたが、私の問題に対する簡単な解決策を見つけることができません。
私は本当に基本的な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();