使用java.net Socket网络的异步JavaFX GUI

3

我正试图使用JavaFX编写一个服务器/客户端套接字程序和一个客户端GUI。我的问题是GUI和套接字连接无法独立运行,这意味着当我运行客户端程序时,GUI会显示,但套接字连接不会发生。然后在关闭GUI窗口后,套接字连接将初始化,就像原本应该的那样。 对于Java和JavaFX/套接字编程并没有太多经验,只是在尝试学习。

import java.io.*;
import java.lang.*;
import java.net.Socket;

public class ClientSocket {

    public Socket socket;
    public BufferedReader bufferedReader;
    public BufferedWriter bufferedWriter;

    public ClientSocket(Socket socket) {

        try {
            this.socket = socket;
            this.bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            this.bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        } catch (IOException e) {
            closeConnection(socket, bufferedReader, bufferedWriter);
        }
    }
    public static void startConnection() {
        try {
            Socket socket = new Socket(Configuration.serverAddress, Configuration.serverPort);
            System.out.println("Client: Connected to server on " + Configuration.serverAddress +
                    " " + Configuration.serverPort + ".");
        } catch (IOException e) {
            System.out.println("Client: Error connecting to server on " + Configuration.serverAddress +
                    " " + Configuration.serverPort + ".");
        }
    }

    public static void closeConnection(Socket socket, BufferedReader bufferedReader, BufferedWriter bufferedWriter) {
        try {

            if (socket != null) {
                socket.close();
                System.out.println("Client: Socket connection has been closed to " + Configuration.serverAddress +
                        " " + Configuration.serverPort + ".");
            }
            if (bufferedReader != null) {
                bufferedReader.close();
            }
            if (bufferedWriter != null) {
                bufferedWriter.close();
            }
        }catch(IOException e){

        }
    }



}

import javafx.application.Application;
import javafx.stage.Stage;


public class ClientWindow extends Application{
    public void start(Stage gameWindow) {

        gameWindow.show();
    }

}

import javafx.application.Application;


public class Client {

    public static void main(String[] args) {
        Application.launch(ClientWindow.class, args);
        ClientSocket.startConnection();

    }


}

我尝试了一些小步骤,比如让套接字连接单独正常工作,然后再试着在其旁边实现JavaFX GUI。但我仍然无法同时运行GUI和套接字连接。我猜测JavaFX GUI可能在一个循环中,导致它启动后不会立即关闭,这就使得套接字程序无法开始运行,直到GUI完成运行。所以只有在GUI关闭后,套接字程序才会启动。

1个回答

5

为什么在应用程序关闭之前,套接字连接不会建立

阅读JavaFX Application的javadoc以了解JavaFX应用程序的生命周期。

特别要注意launch()方法的文档:

launch方法在应用程序退出之前不会返回,除非通过调用Platform.exit()或关闭所有应用程序窗口来退出。

在这段代码中,套接字连接直到JavaFX平台退出后才会开始:

public static void main(String[] args) {
    Application.launch(ClientWindow.class, args);
    ClientSocket.startConnection();
}

如何修复它

要在Application初始化或启动时执行某些操作,请在重写的init()方法或start()方法中实现您的代码。类似地,stop()用于释放资源,例如关闭应用程序可能打开的其他线程或持久连接。

相关示例和资源

此示例使用JavaFX应用程序中的套接字。它演示了同步和异步操作模式。

异步操作模式在编程上更具挑战性。只有当应用程序在套接字流上有长时间阻塞的调用时,才可能需要使用异步调用。
如果您使用异步调用模式,我建议您学习以下内容: StackOverflow上关于JavaFX并发的问题和答案也可能对您有所帮助。

谢谢回复,我已经解决了这个问题。我将GUI的独立类移除,并添加到客户端类中,并使用init()方法启动GUI,同时将clientsocket的startconnection方法添加进去,现在GUI和socket连接可以同时启动和运行了。 - Fozzey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接