Java/JavaFX服务器多客户端聊天程序

Java/JavaFX服务器多客户端聊天程序,java,multithreading,sockets,javafx,networking,Java,Multithreading,Sockets,Javafx,Networking,我不熟悉Java网络,并尝试创建服务器/多客户端聊天应用程序。下面是接受单个客户端请求的代码,数据在客户端和服务器之间完美流动 对于多客户端,我使用InetAddress来接受多客户端请求,但服务器一直挂起 希望获得有关服务器/多客户端聊天功能的帮助 这就是我正在编写的代码 Server.java import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene

我不熟悉Java网络,并尝试创建服务器/多客户端聊天应用程序。下面是接受单个客户端请求的代码,数据在客户端和服务器之间完美流动

对于多客户端,我使用InetAddress来接受多客户端请求,但服务器一直挂起

希望获得有关服务器/多客户端聊天功能的帮助

这就是我正在编写的代码

Server.java

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.*;
import javafx.scene.text.Font;
import javafx.stage.Stage;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DecimalFormat;
import java.util.Date;

public class Server extends Application {

    TextArea serverDetails = new TextArea();
    TextField serverTextFld = new TextField();


    @Override
    public void start(Stage stage) throws Exception {
        serverDetails.setFont(Font.font(14));
        serverDetails.setPrefHeight(550);
        serverDetails.setEditable(false);

        VBox root = new VBox(20, serverDetails, serverTextFld);
        Scene scene = new Scene(root, 500, 500);
        stage.setTitle("Server");
        stage.setScene(scene);
        stage.show();

        new Server();
    }

    public class Server implements Runnable {

        ServerSocket serversocket;
        DataInputStream  inFromClient;
        DataOutputStream outToClient;
        Socket socket;
        Thread t1, t2;
        String dataIn = "", dataOut = "";

        public Server() {
            try {
                t1 = new Thread(this);
                t2 = new Thread(this);
                serversocket = new ServerSocket(5000);
                serverDetails.appendText("Waiting for client \n");
                Platform.runLater(() -> {
                    try {
                        socket = serversocket.accept();
                        t1.start();
                        t2.start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });

                System.out.println(socket.getLocalPort());


            } catch (Exception e) {
            }
        }

        public void run() {
            try {
                if (Thread.currentThread() == t1) {
                    serverTextFld.setOnAction(e-> {
                        String userInput1 = serverTextFld.getText();
                        serverTextFld.clear();
                        try {
                            outToClient = new DataOutputStream(socket.getOutputStream());
                        } catch (IOException ioException) {
                            ioException.printStackTrace();
                        }
                        dataIn=userInput1;
                        Platform.runLater(() -> {
                            serverDetails.appendText("Server: "+ userInput1 + '\n');
                        });
                        try {
                            outToClient.writeUTF(userInput1);
                        } catch (IOException ioException) {
                            ioException.printStackTrace();
                        }
                    });

                } else {
                    do {
                        inFromClient = new DataInputStream((socket.getInputStream()));
                        dataOut = inFromClient.readUTF();
                        serverDetails.appendText("Client: "+ dataOut + '\n');
                    } while (!dataOut.equals("END"));
                }
            } catch (Exception e) {
            }
        }

    }
}
Client.java

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.*;
import javafx.scene.text.Font;
import javafx.stage.Stage;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DecimalFormat;
import java.util.Date;

public class Client extends Application {

    TextArea clientDetails = new TextArea();
    TextField clientTextFld = new TextField();

    @Override
    public void start(Stage stage) throws Exception {
        clientDetails.setFont(Font.font(14));
        clientDetails.setPrefHeight(550);
        clientDetails.setEditable(false);

        VBox root = new VBox(20, clientDetails, clientTextFld);
        Scene scene = new Scene(root, 500, 500);
        stage.setTitle("Client");
        stage.setScene(scene);
        stage.show();

        new Client();

    }

    public class Client implements Runnable {
        DataInputStream  inFromServer;
        DataOutputStream outToServer;
        Socket socket;
        Thread t1, t2;
        String dataIn = "", dataOut = "";

        public Client() {
            try {
                t1 = new Thread(this);
                t2 = new Thread(this);
                socket = new Socket("localhost", 5000);
                t1.start();
                t2.start();

            } catch (Exception e) {
            }
        }

        public void run() {

            try {
                if (Thread.currentThread() == t2) {
                    clientTextFld.setOnAction(e->{
                        String userInput1 = clientTextFld.getText();
                        clientTextFld.clear();
                        try {
                            outToServer = new DataOutputStream(socket.getOutputStream());
                        } catch (IOException ioException) {
                            ioException.printStackTrace();
                        }
                        dataIn=userInput1;
                        Platform.runLater(() -> {
                            clientDetails.appendText("Client: "+ userInput1 + '\n');
                        });
                        try {
                            outToServer.writeUTF(userInput1);
                        } catch (IOException ioException) {
                            ioException.printStackTrace();
                        }
                    });
                } else {
                    do {
                        inFromServer = new DataInputStream((socket.getInputStream()));
                        dataOut = inFromServer.readUTF();
                        clientDetails.appendText("Server: "+ dataOut + '\n');
                    } while (!dataOut.equals("END"));
                }
            } catch (Exception e) {
            }

        }
    }
}

为什么将服务器创建为图形化操作会使事情变得过于复杂。我只想让它成为一个bog标准java服务器。一旦它被调试并正常工作,是时候让它变得更漂亮了。我对此感到厌倦,但这对原因没有多大帮助。你需要问一个特定的问题。在服务器中处理多个请求的一种方法是将每个请求交给一个新线程。你能建议如何实现它吗。我使用了新线程(()->{});在服务器和手持客户端(套接字)中,但随后服务器和客户端之间的连接中断。