代码之家  ›  专栏  ›  技术社区  ›  George Makroglou

在不同线程中启动的ServerSocket使JavaFX应用程序冻结

  •  1
  • George Makroglou  · 技术社区  · 5 年前

    我正在尝试创建一个终端仿真器私人股份有限公司以及xterm.js公司. 我以前从未尝试过这样的事情,所以如果我说错话,我道歉,因为我没有正确理解。无论如何,终端应该显示在JavaFX中 WebView 网络视图 ServerSocket 在一个新的 Thread 但是当我测试应用程序并点击终端按钮时,应用程序就会冻结。我通过访问我的本地主机测试了服务器是否正在运行,它已经启动并运行。所以,我得到的是,应用程序的主线程在服务器线程启动时的优先级较低。我说得对吗?如果是这样的话,我该怎么解决呢?

    下面的函数在 initialize 从主控制器加载终端场景的方法。有人能解释一下为什么会这样吗?

        private void createServerToSpawnPty() {
    
            Thread thread = new Thread(() -> {
                try {
                    ServerSocket server = new ServerSocket(8080);
                    System.out.println("Created Java localhost server on port: 8080");
                    while (true) {
                        final Socket client = server.accept( );
                        System.out.println("client connected:+
                        client.isConnected( ));
                    }
    
                 }catch (IOException exception) {
                    exception.printStackTrace( );
                 }
             });
            thread.setDaemon(true);
            thread.run();
        }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   George Makroglou    5 年前

    这两个链接都提供了非常有用的信息,所以谢谢你们。因为此服务器不会等待来自任何其他客户端的连接 WebView Task 它在后台运行,也可以传递给 ExecutorService .

        private void startServerToSpawnPty() {
    
            Task<Void> serverTask = new Task<Void>( ) {
                @Override
                protected Void call() throws Exception {
                    ServerSocket server = new ServerSocket(8080);
                    System.out.println("Created Java localhost server on port: 8080");
                    final Socket client = server.accept( );
    
                   if (client.isConnected( )) {
                        System.out.println("client connected: " + client.isConnected( ));
                        System.out.println("You just connected with the Java localhost" +               
                        "server on port: 8080");
                    } else 
                        System.out.println("No connection found");
    
                    return null;
                }
            };
            ExecutorService service = Executors.newFixedThreadPool(1);
            service.execute(serverTask);
            service.shutdown();
        }