Java TCP侦听器循环

时间:2013-03-24 08:19:30

标签: java tcp irc

我一直在google上搜索几个小时,因为我知道这是一个非常简单的问题,但我无法找到解决问题的简单方法。

我正在编写一个非常基本的IRC客户端,只是为了重新学习Java的绳索,因为我已经做了很长时间的编码,而且我有一个项目,我想稍后做。

我仍然坚持使用套接字监听器,如果需要我可以提供代码,但我真正需要的是一个简单的教程,介绍如何创建一个监听并已经创建套接字的循环,并尽快做一些事情。接收任何数据。此循环应该继续,直到套接字关闭(用户断开与服务器的连接)

我当前代码的问题是监听器似乎挂起整个程序UNTIL它接收数据。我甚至在一个单独的线程中放置了一个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();

1 个答案:

答案 0 :(得分:2)

一位朋友看了一下这段代码,发现问题与我调用Thread的方式有关。基本上我需要打电话:

serverListener.start();

而不是

serverListener.run();

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