-1

UDP クライアント/サーバー プログラムを作成しています。クライアントはデータを収集し、サーバーに送信します。

クライアントはランダムなポート番号を持つデータグラムを特定の UDP ポート 6789 でサーバーに送信します。その後、クライアントとサーバーはランダムなポートを使用して情報を共有します。

私が抱えている問題は、1 つのクライアントしか接続できないことです。ポート 6789 が次のクライアントのために再開されないためだと思います。

これは、サーバーがポート 6789 で最初の接続を受信するためのコードです。

public class MonitorServer extends Thread{

    public static void main(String[] args) {

try{

    DatagramSocket connectSocket = new DatagramSocket(6789);     
    while( true )
    {
            String portString = "";
            int portInt = 0;
            byte [] buffer = new byte[100];

System.out.println("portTest 01 " +portInt);
            DatagramPacket portPacket = new DatagramPacket(buffer, buffer.length);
            connectSocket.receive(portPacket);
            portString = new String (portPacket.getData());
            connectSocket.disconnect();  
            connectSocket.close();

System.out.println("portTest 02 " +portString);
            portString = portString.replaceAll("[^0-9.,]+","");
            portInt = Integer.parseInt(portString);

System.out.println("portTest 03 " +portString);                    
            ClientConnection c = new ClientConnection(portInt);
            new Thread(c).start();

System.out.println("portTest 04 " +portString); //<<-- never prints
   }
  }

  catch (Exception e) {}
 }

}

コードのこのセクションは 1 回しか実行されないようです。トラブルシューティングに System.outs を追加しましたが、次の場所で停止するようです:

            ClientConnection c = new ClientConnection(portInt);
            new Thread(c).start();

System.out.println("portTest 04 ");  //<-- Never prints

接続を受け入れるために実行し続ける必要があります。私は何を間違っていますか?

4

2 に答える 2

0

あなたのコードでは、メソッド MonitorServer.startServer は、無限の while ループに入るため、戻りません。これは、MonitorServerのコンストラクターが戻らないことを意味します。つまり、 main の while ループが終了に到達せず、ループしないことを意味します。MonitorServer新しいThreadまたはで開始する必要がありますExecutor Service

于 2012-04-22T20:29:38.380 に答える
0

受信ループの外で、一度 5678 にソケットを作成する必要があります。毎回受け取るわけではありません。

NB UDP には、DatagramSocket.connect() が行う制限されたものを除いて、「connectig」のようなものはありません。これは、ピアには不明です。

于 2012-04-22T23:06:00.073 に答える