私は次のような状況にあります。
Serverクラスがあります。Clientクラスがあります。MultiServerThreadクラスがあります。
クライアントがサーバーに接続すると、サーバーは新しいMultiServerThreadを作成し、クライアントからの入力を処理します。そうすれば、複数のクライアントを持つことができます。ここまでは順調ですね。接続はTCP経由で行われます。
簡単な例:
サーバークラス:
...
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
boolean listening = true;
try {
serverSocket = new ServerSocket(9999);
} catch (IOException e) {
System.err.println("Could not listen on port: " + serverSocket.getLocalPort() + ".");
System.exit(-1);
}
while (listening) {
new MultiServerThread(serverSocket.accept()).start();
}
serverSocket.close();
}
...
クライアントクラス:
...
public static void main(String[] args) throws IOException {
socket = new Socket(hostname, port);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
stdIn = new BufferedReader(new InputStreamReader(System.in));
String fromServer;
String fromUser;
while ((fromServer = in.readLine()) != null) {
System.out.println("Server: " + fromServer);
if (fromServer.equals("Bye.")) {
break;
}
fromUser = stdIn.readLine();
if (fromUser != null) {
System.out.println("Client: " + fromUser);
out.println(fromUser);
}
}
out.close();
in.close();
stdIn.close();
socket.close();
}
...
MultiServerThreadクラス:
...
public MultiServerThread(Socket socket) throws SocketException {
super("MultiServerThread");
this.socket = socket;
// dSocket = new DatagramSocket(4445);
}
public void run() {
try {
PrintWriter myOutput = new PrintWriter(socket.getOutputStream(), true);
BufferedReader myInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
myOutput.println("Connected to client and ready to accept commands.");
while ((clientInput = myInput.readLine()) != null) {
//A SIMPLE LOGIN A USER
if (clientInput.contains("!login")) {
//save some string given by client into loggedUser
String loggedUser = clientInput.substring(7);
}
myOutput.close();
myInput.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
私が必要なのは:
たとえば、ユーザー名が「Bob」の場合、サーバーからの通知を実装する必要があります。ユーザー名が「Bob」の場合、サーバーはクライアントに「Bob is hereagain!」という通知を送信する必要があります。私のプロジェクト/宿題では、これはJavaのデータグラムを使用して行う必要があります。
したがって、clientinputが "!login bob"の場合、メッセージ( "Bob is here again!")を含むデータグラムパケットをクライアントに送信する必要があります。
質問:データグラムリクエストのコードを正確にどこに配置する必要がありますか?データグラムパケットリクエストをMultiServerThreadまたはクライアントに入れることはできますか?
MultiServerThreadはすでに!loginを処理しているため、より簡単になります。ここ:
if (clientInput.contains("!login")) {
//save some string given by client into loggedUser
String loggedUser = clientInput.substring(7);
//send datagram request to Server???
}
しかし、これはネットワーキングの原則に反していますか?