Java TCP侦听器循环

Java TCP侦听器循环,java,tcp,irc,Java,Tcp,Irc,我在谷歌上搜索了几个小时,因为我知道这是我面临的一个非常简单的问题,但我找不到一个简单的解决方案 我正在编写一个非常基本的IRC客户端,只是为了重新学习Java的诀窍,因为我已经很久没有做过任何编码了,我有一个项目我想稍后再做 不过,我仍然停留在套接字侦听器上,如果需要,我可以提供代码,但我真正需要的是一个简单的教程,介绍如何创建一个侦听并已创建套接字的循环,并在收到任何数据后立即执行某些操作。此循环应继续,直到套接字关闭(用户断开与服务器的连接) 我当前代码的问题是侦听器似乎挂起整个程序,直到

我在谷歌上搜索了几个小时,因为我知道这是我面临的一个非常简单的问题,但我找不到一个简单的解决方案

我正在编写一个非常基本的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();

一位朋友查看了这段代码,发现问题在于我调用线程的方式。基本上我需要打电话:

serverListener.start();
而不是

serverListener.run();

这已经解决了问题,我的IRC客户端现在已正确连接到服务器。

您确定使用了
Thread.start()
而不是
Thread.run()
?这是因为线程阻止了套接字上的读写。如果您将代码放在这里,将非常有用。添加了我讨厌的代码。。。。我尝试过各种各样的方法,比如放入if语句,所以如果缓冲区中没有数据,就什么也不做。。。