Java/JavaFX服务器多客户端聊天程序
我不熟悉Java网络,并尝试创建服务器/多客户端聊天应用程序。下面是接受单个客户端请求的代码,数据在客户端和服务器之间完美流动 对于多客户端,我使用InetAddress来接受多客户端请求,但服务器一直挂起 希望获得有关服务器/多客户端聊天功能的帮助 这就是我正在编写的代码 Server.javaJava/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
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服务器。一旦它被调试并正常工作,是时候让它变得更漂亮了。我对此感到厌倦,但这对原因没有多大帮助。你需要问一个特定的问题。在服务器中处理多个请求的一种方法是将每个请求交给一个新线程。你能建议如何实现它吗。我使用了新线程(()->{});在服务器和手持客户端(套接字)中,但随后服务器和客户端之间的连接中断。