2012-03-26 82 views
4

我想用java制作一个多线程的服务器/客户端应用程序!这个代码是用于听()方法在一个类中的该命名Bsocket(iserver.core.socket)封装的:JAVA - Socket.accept()冻结用户界面

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没有工作!这里有什么不对?

+0

问题充分了解!!!但一些信息是optinal!你喜欢-1嗯? :) 好 !看看'dty'答案! – bizzr3 2012-03-26 12:49:42

+1

你应该看看这个[关于SwingWorkers的教程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html) – assylias 2012-03-26 12:50:08

+0

嘿,我解开了-1,一旦我发现你不知道UI系统如何工作。我对日志输出和jframes的讨论感到困惑。 – Gray 2012-03-26 13:12:43

回答

4

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

+0

你能告诉我更多关于分离这些图层吗? – bizzr3 2012-03-26 12:52:36

+1

这是一个有很大回应的简短问题。你需要学习一些关于并发的概念。开发UI应用程序非常重要。 Oracle提供了一些有趣的[与Swing应用程序中的并发相关的教程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 – logoff 2012-03-26 12:57:22

+0

感谢您的关注 – bizzr3 2012-03-26 12:59:50

6

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

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(); 

注意:此代码未经测试,但它应该让你知道你需要做什么。