2011-08-03 90 views
0

这是Java的信使项目的一部分连接。由于客户端使用直接连接进行聊天,因此我希望eavry客户端在某个端口上侦听,而其他客户端则需要为该地址创建一个套接字。但是当我在另一个线程中调用ServerSocket.accept()时,看起来所有的线程都被挂起了。这意味着执行该命令后会发生nothings。这是创建新线程的代码。监听在一个单独的线程

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"); 
        } 
       } 
      }); 

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

+0

应该阻止大部分时间里,公交车有时要响应其他 –

+1

@kvphxga,麦格理指的是事实,你问Stack Overflow上的八个问题,但接受的答案,只是其中之一。这被认为是粗鲁的,除非你真的觉得没有人充分回答你的任何问题。 – Dan

回答

3

,当我在另一个线程中调用的ServerSocket.accept()似乎 所有线程都被暂停

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

+0

该程序的GUI未正确加载。顺便说一下......这段代码在构造函数中。 –

+0

此代码位于JFrame的构造函数中。它是否在AWT线程中? –

+0

感谢...你帮了我很多:) –

1

Socket.accept()并阻止当前线程。只有在收到连接后才会显示“flag2”。但它只阻止CURRENT线程。

我怀疑你没有正确运行单独的线程(你打电话yourThreadHere.start(),而不是.RUN(),对吧?)。

+0

不......我已经更新了问题...ü可以看到。 –

+0

EJP是正确的,您正在AWT/Swing Thread中执行该代码,这将冻结您的所有程序界面。阅读AWT/Swing线程模型。 –

+0

嗯......这是什么线程?此代码位于JFrame对象的构造函数中。它在AWT/SWING线程中吗? –