可以根据客户端处理多个请求的客户端-服务器应用程序

Client-Server application that can process multiple request depending on the client-side

我有一个客户端驱动的 GUI (Swing),我需要处理不止一个请求。我可以处理一个请求,例如 'logging in, the user',但我无法从服务器发出任何其他请求,例如 'fetch all users'。

如何在服务器上处理多个请求以及如何在客户端进行设置。

客户端

    private Socket server;

    public ClientConnection() {
        try {
            server = new Socket("127.0.0.1", 12345);
        } catch(IOException e) {
            System.out.println("Connection Error - Client: " + e.getMessage());
        }
    }

    public void loginUser(User user) {
        try {
            ObjectOutputStream out = new ObjectOutputStream(server.getOutputStream());
            out.flush();
            ObjectInputStream in = new ObjectInputStream(server.getInputStream());

            //How would I write the request type to the server
            
            out.writeObject((User) user);
            out.flush();
            
            User getUserInfo = (User) in.readObject();
            //System.out.println("Response from the server: " + getUserInfo.getRole());
            
            out.close();
            in.close();
            server.close();
        } catch(IOException e) {
            System.out.println(e.getMessage());
        }
    }

服务器端

    private ServerSocket serverListener;
    private Socket client;
    
    public ServerConnection() {
        try {
            serverListener = new ServerSocket(12345, 10);
        } catch(IOException e) {
            System.out.println("Server-Side Error: Connection" + e.getMessage());
        }
    }
    
    public void server() {      
        try {
            System.out.println("Server is listening");
            client = serverListener.accept();

            //How can I make a request and then process it depending on the type of 
            //request

            //Gets the ObjectOutputStream and the ObjectInputStream and send a User object back to 
            //the client-side
            loginUser(); 

        } catch(IOException e) {
            System.out.println(e.getMessage());
            e.getStackTrace();
        }

    }

我最初的想法是有一个具有不同请求类型的枚举 class,然后在我的 server() 方法中有一个 switch 语句,并根据请求的类型调用一个方法来执行这些操作,但我不确定如何向服务器发送请求类型,以及在 server() 方法中处理请求类型是否是最佳实践。

您需要考虑的是如何定义您的客户端和服务器之间的通信。定义协议和消息结构。

假设您要引入多种请求类型。这些请求类型将由您决定,但将要发生的是您将引入逻辑来处理客户端和服务器上的新请求类型。

就像在 REST 中一样,客户端和服务器都知道 GET/POST 是什么 - 您还需要为您的通信定义这些协议。

例如,您的客户端正在发送 fetch-all-users 类型的请求。构造它的一种方法是:

{
   "requestType": "fetch-all-users",
   "body": "..."
}

您可以为枚举类型创建一个通用模块,这取决于您。

接下来,我们将讨论您希望如何在服务器端处理请求的问题。

一个简单的解决方案是添加 if-else 逻辑以根据提供的类型处理正确的请求类型。

但是为了避免 if else 逻辑,您可以使用设计模式。

为您的 requestProcessingActions 创建工厂:

class ActionFactory {

   public Action resolve(RequestType requestType) {
     final Action resolvedAction;

     switch(requestType) {
       case fetch-all-users:
          resolvedAction = fetchAllUsers();
          break;
       case log-in-user:
          resolvedAction = logInUser();
          break;         
     }
      
     return resolvedAction;
   }
}

并在您的服务器中调用它:

public void server() {      
        try {
            System.out.println("Server is listening");
            client = serverListener.accept();
             
            RequestType type = getRequestTypeFromRequest();
            
            ActionFactory.resolve(type);
        }
    }