gpt4 book ai didi

java - Java 中的客户端-服务器通信

转载 作者:行者123 更新时间:2023-12-01 11:10:08 24 4
gpt4 key购买 nike

我正在尝试创建一个客户端-服务器 Java 应用程序,其中连接了 4 个用户,但是服务器类和客户端类之间的通信和消息交换存在一些问题。

这是服务器的代码:

public class Server {
private static final int port = 9991;
private static final String serverHost = "localhost";
private static ServerSocket serverSocket;
private static Socket socket;
private static DataInputStream serverInput;
private static DataOutputStream serverOutput;
private static String message;
private static int noOfUsers = 0;

public static void main(String args[]){
try{
serverSocket = new ServerSocket(port);
System.out.println("Server is up (Port: " + port + ")");

while (true){
socket = serverSocket.accept();
serverInput = new DataInputStream(socket.getInputStream());
serverOutput = new DataOutputStream(socket.getOutputStream());

message = serverInput.readUTF();
if (message.equals("C_Message1")){
System.out.println("Client has connected!");
serverOutput.writeUTF("S_Message1");
}
else if (message.equals("C_Message2")){
if (noOfUsers <= 3){
serverOutput.writeUTF("S_Message2");
noOfUsers++;
}
else {
serverOutput.writeUTF("S_Message3");
System.out.println("User rejected");
}
}

}
} catch (IOException e){
System.err.println(e.getMessage() + " -> " + e.getCause());
}

}
}

这是 Client 类的代码:

public class Client implements Runnable {
private static final int serverPort = 9991;
private static final String serverHost = "localhost";

private static Socket socket;
private static DataInputStream clientInput;
private static DataOutputStream clientOutput;

private static String message;

private static int userID;

@Override
public void run() {

try {
socket = new Socket(serverHost, serverPort);
System.out.println("Connection succesfull.");

clientInput = new DataInputStream(socket.getInputStream());
clientOutput = new DataOutputStream(socket.getOutputStream());

clientOutput.writeUTF("C_Message1");
System.out.println("Connected to server!");

while (true){
message = clientInput.readUTF();

if (message.equals("S_Message1")){
clientOutput.writeUTF("C_Message2");
}
else if (message.equals("S_Message2")){
System.out.println("Accepted on table!");
}
else if (message.equals("S_Message3")){
System.out.println("Rejected");
}
}
} catch (UnknownHostException e) {
System.out.println("Cannot find host.");
} catch (IOException e) {
System.out.println("IO Exception thrown");

}
}
}

我正在我的 GUI 类中创建一个 Client 实例,

Client client = new Client();
Thread clientThread = new Thread(client);
clientThread.start();

问题是消息交换无法正常工作。我从客户端发送 C_Message1 到服务器,当服务器收到此消息时,它会将 S_Message1 发送回客户端,然后客户端将 C_Message2 发送到服务器,依此类推。然而,当客户端尝试发送 C_Message2 时,消息交换会以某种方式停止。

最佳答案

在像这样的客户端服务器系统中,您必须(至少)处理客户端上的两个线程和服务器上的两个线程:

  • 一个线程发送消息
  • 一个线程接收消息

它是一个异步的,其工作原理如下:

  • 客户端上的发送者线程发送消息“Hello”
  • 服务器上的接收者线程接收消息“Hello”
  • 接收者线程创建一条新消息“我收到了你好消息”并将其放在服务器的接收者和发送者线程之间的共享列表中
  • 服务器的发送者线程看到共享列表中存在新消息
  • 发送者线程从列表中提取消息并将其发送给客户端
  • 客户端上的接收线程收到消息“我收到了问候消息”

我希望这个过程是清楚的。祝你好运

关于java - Java 中的客户端-服务器通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32477526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com