我一直在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();
答案 0 :(得分:2)
一位朋友看了一下这段代码,发现问题与我调用Thread的方式有关。基本上我需要打电话:
serverListener.start();
而不是
serverListener.run();
这解决了这个问题,我的IRC客户端现在正确连接到服务器。