java - 在不同线程中启动的 ServerSocket 导致 JavaFX 应用程序卡住

标签 java javafx serversocket xtermjs

我正在尝试使用 pty.js 和 xterm.js 创建一个终端模拟器。我以前从未尝试过这样的事情,所以如果我说错了什么,我很抱歉,因为我没有正确理解它。无论如何,终端应该显示在 JavaFX WebView 内所有 GUI 均已准备就绪并经过测试。根据我的发现,我了解到必须有一个服务器在本地主机上运行,​​以便 pty.js 在那里生成 shell,并通过 WebView 上的 xterm.js 传达结果。 。现在,我尝试使用 ServerSocket 创建服务器在新的Thread但是当我测试应用程序并单击“终端”按钮时,应用程序卡住了。我已经通过访问我的本地主机测试了服务器是否正在运行,并且它已启动并正在运行。因此,我得到的是,在服务器线程启动时,应用程序的主线程的优先级较低。我对吗?如果是这样,我该如何解决这个问题?

initialize 中调用以下函数从主 Controller 加载的终端场景的方法。有人可以解释一下为什么会发生这种情况吗?

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

最佳答案

这两个链接都提供了非常有用的信息,所以谢谢你们。由于该服务器不会等待来自 WebView 之外的任何其他客户端的连接,因此我最终以另一种方式实现了该方法,更具体地说,我删除了 while 循环并将所有内容包装在 中无论如何在后台运行的任务,也可以传递给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();
    }

关于java - 在不同线程中启动的 ServerSocket 导致 JavaFX 应用程序卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57560586/

相关文章:

java - 如何创建自己的按钮并将其与 Scene Builder for javafx 一起使用

Java 逻辑 XOR ("^") 与逻辑 NOT ("!")

java - Jar 文件在 Windows 上运行但不显示 GUI

java - 套接字传输文件

java - 在Java中创建另一个任务时取消当前任务并重用同一线程

java - 使用 apache-commons-net TelnetClient 发送终端命令时如何禁用回显

java下载文件大小超过8K时不起作用?

java - 永久使用 Socket 来处理 ClientSession 或为每个请求创建一个新的 ClientSession

java - Socket clientSocket = serverSocket.accept();无法解决

java - 使用 :if and th:replcae in thymeleaf 动态更改页面