线程的简单问题

时间:2010-11-29 05:25:29

标签: java multithreading sockets tcp

我想做的就是启动一个线程来侦听某个端口上的通信。

我通过在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上的内容,然后返回等待更多消息

一直允许用户不断使用GUI。

3 个答案:

答案 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/

相关问题