我一直在谷歌上搜索几个小时,因为我知道这是我面临的一个非常简单的问题,但我找不到一个简单的解决方案来解决我的问题。
我正在编写一个非常基本的 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();