我是编程新手,想编写一个简单的客户端服务器系统,其中客户端发送命令,如“SAY house”,服务器将“SAY”关键字识别为命令,并返回关键字后面的所有内容(在这种情况下为“house”)。虽然有很多示例可以做到这一点,但我还想通过这个项目学习解决此类问题的良好设计模式。我不想只用Server.java和Client.java两个类来实现所有东西。
所以,我从一个Server类开始,它在一个端口上启动服务器并等待客户端。当他从客户端收到请求时,Server类将输入委托给一个名为“RequestHandler”的类。该类通过switch-case部分检测命令,例如“Say”或“SHUTDOWN”,并通过接口调用相应的方法。
这是一个好的模式吗?例如,“SHUTDOWN”服务的问题是,我必须始终带着Socket对象到执行命令的方法中。或者也许这种模式对于升级具有更多功能的服务器来说并不好?请帮助改进!
谢谢
所以,我从一个Server类开始,它在一个端口上启动服务器并等待客户端。当他从客户端收到请求时,Server类将输入委托给一个名为“RequestHandler”的类。该类通过switch-case部分检测命令,例如“Say”或“SHUTDOWN”,并通过接口调用相应的方法。
这是一个好的模式吗?例如,“SHUTDOWN”服务的问题是,我必须始终带着Socket对象到执行命令的方法中。或者也许这种模式对于升级具有更多功能的服务器来说并不好?请帮助改进!
谢谢
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是一个接口,用于对字符串进行操作并返回一个字符串,以便我可以将其发送回客户端。这个设计是否良好?
Server.java
代码,以便我们对你的实现方式有一个大致的了解。此外,你的问题比较宽泛,因为有很多方法可以实现你想要做的事情。 - px06