在单独的线程中侦听连接

时间:2011-08-03 00:04:12

标签: java sockets network-programming

这是java中messenger项目的一部分。由于客户端使用直接连接进行聊天,因此我希望eavry客户端可以侦听某个端口,而其他客户端则可以使用该地址进行套接字。但是当我在另一个线程中调用ServerSocket.accept()时,似乎所有线程都已被挂起。这意味着在执行该命令后会发生无意义的事情。这是创建新线程的代码。

java.awt.EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        while(true){
                            System.out.println("flag1");
                            Socket socket = listeningSocket.accept();
                            System.out.println("flag2");
                            new Chat(socket).setVisible(true);;
                            jTextArea1.append("successfully connected\n");
                        }
                    } catch (NullPointerException e) {
                        System.out.println("i know");
                    }
                    catch (IOException e) {
                        e.printStackTrace();
                        jTextArea1.append("error in recieving connection\n");
                    }
                }
            });

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

  

当我在另一个线程中调用ServerSocket.accept()时,它会出现   所有主题都已被暂停

出现怎么样? accept()只阻止当前线程。你在AWT线程中调用它吗?例如actionPerformed()方法?不要在这些方法中进行任何网络操作,使用单独的线程。

答案 1 :(得分:1)

Socket.accept()DOES阻塞CURRENT线程。只有在收到连接后才能看到“flag2”。但它只阻止CURRENT线程。

我怀疑你没有正确运行单独的线程(你正在调用yourThreadHere.start(),而不是.run(),对吧?)。