2012-02-15 1 views
0

現在、私はこのコードを実験中です(目的に合わないことがわかります)。 私は3つのソースから同時に(UDPテストツール)送信しようとしましたが、それは大丈夫だと思われますが、2Kが同時に送信している10Kクライアントのフォームの場合、パケットのサイズは約70バイトです。私はコンテンツのいくつかの簡単な操作を行い、結果をデータベースに書き込むことになっています。10000(無相関)接続に拡張できるUDPサーバーを作成するにはどうすればよいですか?

パブリッククラスTest {

public static void main(String [] args){ 

    int PACKETSIZE=1400; 
    int port=5555; 
    byte[] bytes = new byte[PACKETSIZE]; 
    //ByteBuffer bb = ByteBuffer.allocate(4); 
    //Byte lat=null; 

    try 
    { 
    DatagramSocket socket = new DatagramSocket(port); 
    System.out.println("The server is runing on port " + port +"\n"); 

     while (true) 
     { 
      DatagramPacket packet = new DatagramPacket(bytes, bytes.length); 

      socket.receive(packet); 

      System.out.println("Packet length = " + packet.getLength());             
      System.out.println("Sender IP = " + packet.getAddress() + " Port = " + packet.getPort()); 
      for(int i=0; i<=packet.getLength();i++){System.out.print(" "+ packet.getData()[i] + " ");} 

答えて

2

はまずUDPソケットは、「接続」の数は無意味であるように配向接続されません。実際に気にかけている数字は、1秒あたりのデータグラムの数です。通常は見過ごされているもう一つの問題は、データグラムがIPパケットにまたがるかどうかです。これは、パケットの組み立てに時間がかかり、最終的にはどれだけ高価になるかということになります。パケットサイズは1,400で、イーサネットフレームに快適に収まります。

ここで、複数のスレッド、キュー、またはその他の処理スキームを使用して処理時間を制限する必要があります。受信スレッドがデータグラムをワイヤから引き出し、ワーカーが処理するために他の場所に置くことを望みます。これは長年にわたって使用されてきた共通の処理イディオムです。ネットワークI/Oからのデータ処理を分離することができれば、ニーズに合わせて拡張する必要があります。

非同期またはイベントドリブンIOを使用して、ソケットから直接データグラムを読み取るスレッドを持たないようにすることもできます。 Java NIOについては、this questionを参照してください。

これは宿題であるかどうかわかりませんが、この件に関してはThe C10K problem Dan Kegelの優れた記事をお読みください。私はあなたがたぶんそれが最も少ないことを言うことを啓発していると思うでしょう。

関連する問題