有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的ClientServer通信

我正在尝试创建一个客户机-服务器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());
        }

    }
}

下面是客户端类的代码:

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 = new Client();
Thread clientThread = new Thread(client);
clientThread.start();

问题是消息交换无法正常工作。 我将C_消息1从客户端发送到服务器,当服务器收到此消息时,它将S_消息1发送回客户端,然后客户端将C_消息2发送到服务器,依此类推。 然而,当客户端试图发送C_消息时,消息交换不知何故停止了


共 (1) 个答案

  1. # 1 楼答案

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

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

    它是一种异步的,基本上如下所示:

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

    我希望过程是明确的。祝你好运