JAVA - Socket.accept()冻结了ui

时间:2012-03-26 12:44:21

标签: java multithreading swing sockets

我正在尝试使用java制作多线程服务器/客户端应用程序!此代码用于名为Bsocket(iserver.core.socket)的包的类中的listen()方法:

 try {
     serverSocket = new ServerSocket(port);
 }catch(IOException e ){
     ui.log(e.toString());//*
 }
while (true){
    try{
        clienSocket = serverSocket.accept();
        ui.log("Incomming Connection.");//*
        new connectionHandler(clienSocket, ui);
    }catch(IOException e ){
        ui.log(e.toString());
    }
}

ui.log("Incomming Connection.");是Bgui(iserver.core.ui)主类下面的一个方法.Bgui是一个包含textarea和其他内容的jframe!问题是当执行accept方法时,ui.log不起作用!什么错了?

3 个答案:

答案 0 :(得分:7)

由于.accept是阻止呼叫,因此您需要在单独的线程上启动服务器。您可能想要这样做:

(new Runnable() {
    @Override
    public void run()
    {
         try {
              serverSocket = new ServerSocket(port);
          }catch(IOException e ){
              ui.log(e.toString());//*
          }
         while (true){
             try{
                 clienSocket = serverSocket.accept();
                 ui.log("Incomming Connection.");//*
                 new connectionHandler(clienSocket, ui);
             }catch(IOException e ){
                 ui.log(e.toString());
             }
         }
    }
}).start();

注意:此代码未经过测试,但它可以让您了解需要执行的操作。

答案 1 :(得分:6)

Socket.accept()阻塞,直到有接收的传入连接(请参阅文档)。你不应该从你的UI线程进行任何阻塞调用 - 否则它会......你知道......阻止!

答案 2 :(得分:4)

您需要将UI线程与您自己的网络服务线程分开。 accept()正在阻塞(显然)并冻结你的应用程序,直到你得到一个新的客户端,并再次冻结等待更多的客户端。