我想做的就是启动一个线程来侦听某个端口上的通信。
我通过在jDialog上设置'ok'按钮来启动它。单击“确定”后,jDialog应隐藏自身( HostClientDialog.setVisible(false); ),当线程起始行不在其中时,它将起作用。
try {
HostClientDialog.setVisible(false);
// start a thread that listens for incoming messages
new gameCycle().start();
} catch (Exception e) { }
new gameCycle()。start(); 行正在调用以下代码:
public class gameCycle extends Thread {
//public gameCycle(){
// super();
//}
@Override
public void run() {
try {
ServerSocket connection = new ServerSocket(4242);
// Wait for connection
Socket s = connection.accept();
// Socket input
BufferedReader in = new BufferedReader(new
InputStreamReader(s.getInputStream()));
// for receiving moves
while (true) {
String message = "";
message = in.readLine();
if (message != null && !message.equals("")) {
// do something with message
}
sleep(100);
} // end while
} catch (Exception e) { }
} // end run
} // end class
我理解上面的代码要循环,直到收到消息,然后对消息做一些事情。但是当您执行此代码时,会立即再次生成jDialog框,并重新提示用户单击“确定”。它不会让用户通过jDialog框,它会不断地重新提示它们。
我对线程相当新手(我没有比使用多线程打印更多的东西),所以我觉得我可能会错误地实现它。但我已经四处寻找例子了,他们似乎或多或少都是我的。
编辑(2010年11月29日美国东部时间凌晨1:30)
似乎我并不像我想的那样对TCP通信有所了解。线程和后续while循环的目标如下:
一直允许用户不断使用GUI。
答案 0 :(得分:1)
看起来不错,但我怀疑那个空的挡块。或者可能再次调用该方法?
同样,如果message == null,你必须退出读取循环并关闭套接字,睡眠是没有意义的:如果没有数据,readline()将阻塞。当您即将在下一行中分配它时,初始化'消息'也毫无意义。
答案 1 :(得分:1)
我理解上面的代码要在收到消息之前循环
不完全。这一行:
Socket s = connection.accept();
将阻止执行线程,直到建立连接。你确定发生了吗?可能是你的程序只是坐在那里等待连接但没有正在进行(无论如何都成功)。
也许发布更多信息,比如请求连接的类看起来像。
答案 2 :(得分:1)
我说你提供的代码对我来说很好。
我会实现取消整个线程而不是使用while(true)循环的可能性。 改为使用布尔值,并使其他线程可以访问布尔值。如果你需要帮助,请回到我身边。
我认为问题在于我们在这里看不到的代码。 我对你的线程上的.start()调用周围的代码片段感兴趣。之后会发生什么?
欢呼声
编辑:
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
final JDialog dia = new JDialog();
JButton btn = new JButton("Foo");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
dia.setVisible(false);
Runnable t = new Runnable() {
public void run() {
System.out.println("foo");
}
};
t.run();
}
});
dia.getContentPane().add(btn);
dia.setSize(500, 400);
dia.setVisible(true);
}
}
这对我来说非常有用 - 抱歉,我无法重现您在评论中所述的错误。请考虑提供更多代码:)
编辑#2:编辑#2: 不要直接在线程中设置任何变量。而是使用观察者 - 监听器模式。当有新消息传入时,让线程触发propertyChangeEvent。 http://download.oracle.com/javase/1.4.2/docs/api/java/beans/PropertyChangeListener.html也许你应该尝试实现一些更微不足道的东西..先进行快速简单的聊天。 http://www.ashishmyles.com/tutorials/tcpchat/index.html
如果你失败了,那就考虑一下你的项目。也许阅读有关摆动的多线程可能会有所帮助? http://java.sun.com/developer/technicalArticles/Threads/swing/