0

UDP を使用してクライアント サーバー アプリケーションを作成しています。TCP の代わりに UDP を使用している理由を誰かが尋ねる前に、割り当てのためであると述べて答えさせてください。では質問をどうぞ!

UDP サーバーにパケットを送信するためにスレッドを生成するクライアント クラスを作成しました。メイン スレッドは入ってくるパケットをリッスンします。サーバー クラスはウェルカム メッセージのプッシュ サービスとして機能するだけでなく、クライアントのメッセージを全員に渡すための仲介者としても機能します。

2 つのクライアントを作成すると、最初のクライアントの出力は次のようになります。

Please enter your name for the server: 
James
Welcome to the server James
Hi all // User james types this
James: Hi all // Outputs his message to him once - that's fine
Hi mate // Output from another user

これが、すべてのクライアントがメッセージを送受信する方法です。しかし、2 番目のクライアントが同じことを行うと、次の出力が得られます。

Please enter your name for the server: 
Owen
Welcome to the server Owen
Hi all         // Client one (James wrote this)
Hi mate
Owen: Hi mate
Hi mate

ここでは同じメッセージを 2 回受信しましたが、最初のクライアントでは 1 回しか受信していないことに注意してください。クライアントにメッセージを送信するためのサーバー クラスのロジックは次のとおりです。

// Get the response
                String response = new String(packet.getData());

                // Test - send a message from the server to each user
                if( ports.size() > 1 )
                {
                    for( int i = 0; i < ports.size(); i++ )
                    {
                        System.out.println( "Values in port arraylist: "+ports );

                        if( packet.getPort() == ports.get(i) )
                        {

                        } else 
                        {
                            // String toSend = names.get(i).concat( ": "+response );
                            // System.out.println( toSend );
                            buf = response.getBytes();

                            System.out.println( "Packet Receieved from Port: "+packet.getPort()+"\nPorts.get: "+ports.get(i) );

                            // Could store all address in own arraylist for outside local host networking
                            int thisPort = ports.get(i);
                            packet = new DatagramPacket( buf, buf.length,packet.getAddress(),thisPort );
                            socket.send(packet);
                            System.out.println( "Sending message to port "+ports.get(i) );
                        }
                    }
                    System.out.println( "\n" );
                    packet = null;
                }

これをテストするために、ここで何が起こっているかを確認するためにいくつかの出力行を追加したところ、次のようになりました。

Values in port arraylist: [61493, 61494]
Values in port arraylist: [61493, 61494]
Packet Receieved from Port: 61493
Ports.get: 61494
Sending message to port 61494


Values in port arraylist: [61493, 61494]
Packet Receieved from Port: 61494
Ports.get: 61493
Sending message to port 61493
Values in port arraylist: [61493, 61494]
Packet Receieved from Port: 61493
Ports.get: 61494
Sending message to port 61494
4

1 に答える 1

0

なぜこれが行われたのかわかりませんが、比較のためにポートの一時値を保持するグローバル変数をコードに配置することで修正しました:/

于 2012-04-18T17:54:19.107 に答える