客户机已禁用cpu:客户机 /服务器设计模式(client server pattern)

我是编程新手,我想编写一个简单的客户端服务器系统,客户端发送命令,如“SAY house”,服务器检测关键字“SAY”作为命令,并返回关键字之后的任何内容(在这种情况下为“house”)。

所以我从一个在端口上启动服务器并等待客户端的 Server 类开始。当他从客户端获得请求时,Server 类将输入委托给类“RequestHandler”。这个类执行 switch-case 部分来检测像“Say”或“SHUTDOWN”这样的命令,并通过接口调用相应的方法。

这是一个很好的模式吗?问题是例如服务“SHUTDOWN”。我必须将 Socket Object 与我一起带到执行命令的方法。或者也许这种模式不适用于使用更多功能升级 Server?请帮助进行改进!

谢谢

public class Server {
private int port;
private ServerSocket server;
public Server(int port) throws Exception{
    this.port = port;
    try{
          server = new ServerSocket(port);      
     }catch(Exception e){
          System.out.println("Server kann nicht gestartet werden: "+e.getMessage());
          throw e;
     }
}
public Server(int port){
    this.port = port;
}
public void start(){
    Socket client;
    Thread thread;
    while (true) {
        try {
            client = server.accept();
            // Verbindung eingegangen, Objekt erzeugen und in Thread laufen lassen
            System.out.println("Verbindung von "+client.getInetAddress());
            CommandHandler handler = new CommandHandlerImpl(client,new ControllerImpl());
            thread = new Thread(handler);
            thread.start();
        }
        catch (Exception e) {
          System.out.println("Verbindungsfehler: "+e);
        }
      }
}

}

public class CommandHandlerImpl implements CommandHandler{
private final String regex = " ";
private IController controller;
private Socket client;
public CommandHandlerImpl(Socket client, IController controller){
    this.client = client;
    this.controller = controller;
}
@Override
public String getCommand(String abstractString) throws Exception {
    String result;
    String[] arr = abstractString.split(regex);
    String command = arr[0];
    String s = "";
    if(arr.length > 1){
        s = arr[1];
    }
    switch (command) {
    case "CAPITALIZE":
        result = controller.capitalize(s);
        break;
    case "BYE":
        result = controller.sayBye();
        break;
    case "SHUTDOWN":
        result = controller.shutdown(s);
        break;
    default:
        result="Command nicht gefunden!!!";
    }
    return result;
}
@Override
public void run() {
    String line, res;
    try {
        PrintWriter out = new PrintWriter(client.getOutputStream());
        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        while (true) {
            line = in.readLine();
            System.out.println(line);
            res = null;
            if (line != null){
                res = getCommand(line);
            }
            if (res == null){
                break;
            }
            out.println(res);
            out.flush();
        }
          System.out.println("Verbindung von "+client.getInetAddress()+" beenden.");
          client.close();
    } catch (IOException e) {
        e.printStackTrace();
    }catch(Exception e){
        e.printStackTrace();
    }
}

}

IController 是一个用 String 做一些事情的接口,并返回一个 String,所以我可以将它发送回客户端。

6

这个类执行 switch-case 部分来检测像“Say”或“SHUTDOWN”这样的命令,并通过接口调用相应的方法。

这是一个好的模式吗?

一般不应该使用 switch-cases,除非所有的 cases 都是finishedbefore-hand.If we know there are extension,as in your case,we shouldnotuse switch-cases at all.

对于您的情况,您可以根据需要使用CommandStrategy。如果您的操作在逻辑上非常相似,请使用策略,否则使用命令

当我读到你的问题时,我认为命令更适合你。

我试图用 Command 模式实现来概述解决方案,但它有点难以理解你的一些代码片段。通常你应该使用注释,每当你的代码不是 pretty much reflecting for an outsider who reads it.I think you can understand with the source I have mentioned.

此外,如果您想将 String 从客户端映射到所需的 Command 对象,请使用 Java Map。不要使用 Switch-cases 或 if-else ladders,这肯定会使它变得混乱。如果有问题,请提出问题。:))

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(890)
C Event:C# 事件继承(one x event)
上一篇
Colles骨折手法复位:胡迪尼骨折组(voronoi fracture)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(71条)