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 回答