1

私は次のような状況にあります。

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???

            }

しかし、これはネットワーキングの原則に反していますか?

4

2 に答える 2

0

私はそれを動かしました;-)

スレッドとクライアントクラスでudpポートを定義しました...クライアントクラスは引数を使用してポートを取得しました...スレッドにudpポートを与えました...両方にudpポートがありました;)

于 2012-11-04T01:08:30.417 に答える
0

最初のTCP接続を介してUDPポート番号をクライアントに送信する必要があります。次に、そのポート番号でクライアントのUDPデータグラムのリッスンを開始します。サーバー->クライアントからの他のすべての通信は、このudpソケット上で行われます。これはあなたの割り当てが示唆していることです

于 2012-10-26T23:35:42.433 に答える