java-客户端/服务器设计模式
作者:互联网
我是编程新手,我想编写一个简单的客户端服务器系统,其中客户端发送诸如“ SAY house”之类的命令,并且服务器将关键字“ SAY”检测为命令并返回该关键字之后的所有内容(在本例中为“ house” ”).如何执行此操作有很多示例,但是我也想从该项目中学到的是解决此类问题的良好设计模式.我不想仅在2个类(如Server.java和Client.java)中实现所有功能.
因此,我从Server类开始,该类在端口上启动服务器并等待客户端.当他从客户端收到请求时,Server类将输入委派给类“ RequestHandler”.此类执行切换情况部分以检测“ Say”或“ SHUTDOWN”之类的命令,并通过接口调用相应的方法.
这是一个好模式吗?问题例如是服务“关机”.我必须将Socket Object和我一起带到执行命令的方法中.还是这种模式不利于升级具有更多功能的服务器?请帮助改善!
谢谢
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,因此我可以将其发送回客户端.
这是好产品还是好设计应该如何?
解决方法:
This class does the switch-case part to detect a command like “Say”
or “SHUTDOWN” and calls over an interface the corresponding method.Is this a good pattern?
通常,除非事先确定所有案例,否则不应该使用转换案例.如果我们知道有扩展名(如您的情况),则根本不要使用开关盒.
对于您的情况,您可以根据需要使用Command或Strategy.如果您的一组操作在逻辑上非常相似,请使用“策略”,否则使用“命令”.
当我读到您的问题时,我认为Command更适合您.
我试图通过命令模式实现来概述解决方案,但是很难理解您的某些代码片段.通常,只要您的代码对阅读它的局外人没有太大的反省,就应该使用注释.我想您可以从我提到的来源中了解.
另外,如果要将字符串从客户端映射到所需的Command对象,请使用Java Map.不要使用开关盒或if-else梯子,这肯定会使它变得凌乱.请提出任何问题. :))
标签:client-server,java,design-patterns 来源: https://codeday.me/bug/20191118/2025437.html