JAVA - Socket.accept()冻结了ui

biz*_*zr3 4 java sockets swing multithreading

我正在尝试使用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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

npi*_*nti 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();
Run Code Online (Sandbox Code Playgroud)

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


dty*_*dty 6

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


log*_*off 5

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

  • 公平地说,它不会“冻结您的应用程序”,它只是阻止调用它的单个线程。所有其他线程都可以自由地做自己的事情。 (2认同)