私はプログラミングが新しく、クライアントが「SAYハウス」のようなコマンドを送信し、サーバがコマンドとして「SAY」というキーワードを検出し、後にあるものを返す単純なクライアントサーバシステムをコーディングしたいキーワード(この場合は「家」)。これを行うには多くの例がありますが、私もこのプロジェクトで学びたいことは、このような問題の良い設計パターンです。私は、Server.javaやClient.javaのような2つのクラスだけですべてを実装したくない。クライアント/サーバのデザインパターン
私はポートでサーバーを起動してクライアントを待つServerクラスを使い始めました。クライアントからRequestを受け取ると、Serverクラスは入力を "RequestHandler"クラスに委譲します。このクラスは、 "Say"や "SHUTDOWN"のようなコマンドを検出するswitch-case部分を行い、対応するメソッドをインターフェイス上で呼び出します。
これは良いパターンですか?問題は、たとえば、サービス「シャットダウン」です。コマンドを実行するメソッドに、私と一緒にソケットオブジェクトを持っていく必要があります。または、このパターンは、より多くの機能を持つサーバーをアップグレードするために良いのではないでしょうか?改善のために助けてください!
おかげ
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で何かをやっインタフェースであり、私がクライアントに戻ってそれを送ることができるように文字列を返します。 。 これは良いですか、それとも良いデザインになるべきでしょうか?
「サーバー」のコードを表示すると便利です。あなたがあなたがそれをやっているかについての一般的な考えを得るために書いたと言った、「java」です。また、あなたがしようとしていることを達成するための多くのアプローチがあるため、あなたの質問はかなり広範なものです。 – px06