【问题标题】:Client-Server application that can process multiple request depending on the client-side可以根据客户端处理多个请求的客户端-服务器应用程序
【发布时间】:2021-11-20 19:17:07
【问题描述】:

我有一个客户端驱动的 GUI (Swing),我需要处理多个请求。我可以处理一个请求,例如“登录,用户”,但我无法从服务器发出任何其他请求,例如“获取所有用户”。

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

客户端

    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();
        }

    }

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

【问题讨论】:

  • 如果我理解正确,您希望能够根据收到的内容处理多种行为?
  • 是的@Flav 我将如何在客户端和服务器端处理它?

标签: java server client client-server


【解决方案1】:

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

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

就像在 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);
        }
    }

【讨论】:

  • server() 方法中添加一个循环来处理下一个传入请求可能是明智的
  • 如何将请求类型和信息从客户端发送到服务器端。因为我只能将一个对象读取到服务器,所以我没有得到另一个对象。例如,如果我需要向我的服务器发送请求类型和用户对象,我可以如何/使用什么类来帮助我在服务器端处理这两个对象?
  • 感谢@Bon 的详细回答。不完全是我要找的东西,但我可以看到你要去哪里。您提供的请求类型示例是 JSON(如果我没记错的话),我如何使用 JSON,因为我没有使用框架,并且我希望它使用纯 Java(不使用框架)。如果有更简单的方法来处理 JSON 的这个问题,我会怎么做?
  • 是的,我明白,我在回答前的一个原因是您需要考虑定义消息结构。您在服务器中收到的请求只是一个字节流 - 如何解释这些字节取决于您。 JSON 是构造请求的一种方式,因为它被正确定义,您可以使用 java 序列化/反序列化将字节流具体化为适当的 java 类,反之亦然。框架与库不同 - java 有序列化库,无论您是否使用框架,您都可以使用它们。
  • 如果您真的想避免使用 JSON - 您可以制作自己的字节流阅读器,其中包含有关如何正确读取请求的逻辑。例如,您可以发送带有字符串“fetch-all-users;body;”的请求,并在服务器上配置一个知道如何读取它的读取器。例如-好的,请求类型直到第一个';'特点。你现在在写序列化逻辑,这对学习很有好处,当然在java中使用JSON及其序列化库会更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2015-02-24
  • 2012-09-11
  • 1970-01-01
相关资源
最近更新 更多