0

クライアントのリクエストを待って、クライアントに応答を送信するUDPserverがあります。クライアントがオンラインかどうかを確認するには、クライアントにメッセージを送信する必要があります(確認するため)。しかし!クライアントの PC ユーザーは、メッセージを選択してサーバーに送信し、サーバーからの応答を待つことができます。そのようなことを行う方法-ユーザーはサーバーにメッセージを送信できますが、同時にクライアントはサーバーからメッセージを受信できますか?クライアントreadLineをあるスレッドとrecieve別のスレッドに入れますか?

これがクライアントのメインループです(ds - DatagramSocket.Client - 自分のクラス)

while(true){
        try{
            //variable client we use it in every condition
            Client obj = null;
            ds = null;
            //REGR - registration FNDI - find ip FNDM - find mask GETL - get all CHKA - check all
            System.out.println("PORT - ");
            int port = Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
            ds = new DatagramSocket(port);
            //wait for user's choice
            System.out.println("Commands - REGR,FNDI,FNDM,GETL,CHKA");
            String cmd = new BufferedReader(new InputStreamReader(System.in)).readLine();
            if (cmd.equals("REGR"))
            {
                //sending data to server and waiting for its response
            }
            else if (cmd.equals("FNDI"))
            {
                //same
            }   
            else if (cmd.equals("FNDM"))
            {
                //same
            }
            else if (cmd.equals("GETL"))
            { 
                //same
            }
            else if(cmd.equals("CHKA"))//CHKA
            {
                //same
            }
        }catch(Exception exc)
        {
            System.out.println(exc);
            return;
        }
        finally
        {
            if (ds!=null)
                ds.close();
        }
}

メインサーバーのループ

  while(!stop){
        myfile.write(aam.InputMsg.name());
        System.out.println(aam.InputMsg);
        DatagramPacket pack = new DatagramPacket(buf,buf.length);
        socket.receive(pack);
        //ports.add(pack.getPort());
        //object from pack
        Object o = Deserialize.Deserialization(buf);
        //ok. first - REGR - so check on Client
        if (o instanceof Client)//registration
        {
            //perform some task
        }
        else if (o instanceof InetAddress)//find client by IP
        {
            //same
        }
        else if (o instanceof String)//different messages - name to find, start test.
        {   
            //same
        }
        else
        {
            throw new Exception("SOME WRONG DATA FROM CLIENT");
        }
    }
    System.out.println("Server stopped");
}
catch(Exception exc)
{
    System.out.println(exc);
}
finally{
    if (socket!=null){
        socket.close();
    }
}
}
4

2 に答える 2

3

C/C++ ソケットでは、通常、「select()」呼び出しを使用して、発生したテキスト (キーボード、ファイル、またはネットワーク) の入力を処理します。

Java ソケットでは、「nio」を調べることを検討してください。

http://tutorials.jenkov.com/java-nio/nio-vs-io.html

于 2012-04-05T15:08:23.847 に答える
1

はい、クライアントの少なくとも一部を別のスレッドに配置する必要があります。

おそらく、クライアント入力ループを別のスレッドに入れることから始めます。

Thread t_input = new Thread() {
    public void run() {
        BufferedReader br_in = new BufferedReader(new InputStreamReader(System.in));
        String cmd = br_in.readLine();
        while(cmd != null) {
            if(cmd.equals("exit")) { //stop the user input
                client_Shutdown();
                break;
            }
            //handle other user input
            cmd = br_in.readLine();
        }
    }
};

t_input.start();
于 2012-04-05T15:28:56.547 に答える