带有 java.net Socket 网络的异步 JavaFX GUI

Foz*_*zey 3 java sockets javafx

我正在尝试使用 JavaFX 编写服务器/客户端套接字程序和客户端 GUI。我面临的问题是 GUI 和套接字连接不能独立运行,这意味着当我运行客户端程序时,会显示 GUI 并且不会发生套接字连接。然后,在关闭 GUI 窗口后,套接字连接将按照最初的方式进行初始化。对java和javafx/socket编程也没有太多经验,只是想学习。

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){

        }
    }



}
Run Code Online (Sandbox Code Playgroud)
import javafx.application.Application;
import javafx.stage.Stage;


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

        gameWindow.show();
    }

}
Run Code Online (Sandbox Code Playgroud)
import javafx.application.Application;


public class Client {

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

    }


}
Run Code Online (Sandbox Code Playgroud)

我尝试过一些小步骤,比如让套接字连接本身正常工作,然后尝试在其旁边实现 javafx GUI。我仍然无法让它同时运行 GUI 和套接字连接。我假设 JavaFX GUI 处于某种循环状态,一旦启动就会停止自身关闭,然后保持套接字程序从启动直到 GUI 完成运行。所以只有当GUI关闭时,socket程序才会启动。

jew*_*sea 5

为什么您的套接字在应用程序关闭之前无法连接

\n

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

\n

特别参见launch()方法文档:

\n
\n

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

\n
\n

在此代码中,套接字连接将\xe2\x80\x99t启动,直到JavaFX平台退出:

\n
public static void main(String[] args) {\n    Application.launch(ClientWindow.class, args);\n    ClientSocket.startConnection();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如何修复它

\n

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

\n

相关示例和资源

\n\n

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

\n

异步操作模式对编程来说更具挑战性。仅当您的应用程序在套接字流上有长时间运行的阻塞调用时,才可能需要异步调用。

\n

如果你使用异步调用模式,那么我建议学习:

\n\n

StackOverflow 上的 JavaFX 并发问题和解答也可能对您有所帮助。

\n