2

さまざまな FPS ゲームの IP アドレスを持つデータベースがあり、5 分で各サーバー 5 にクエリを実行する必要があります。クエリ メッセージの応答 (サーバーから受信) により、サーバーがオンラインかどうか、サーバーのプレイヤー数、およびその他のデータがわかりました。

私の問題は、すべてのサーバーがクエリに応答していないことです。

// Starting a listen server before sending any data to the servers.
new Thread(new ListenServer(socket)).start();

// Connecting and getting data from data base
MysqlData data = new MysqlData("localhost", "root", "abc123", "gm_database");
LinkedList<Map> query_data = data.mysql_fetch_assoc("SELECT * FROM gm_servers");

// Sending 16 bytes of data (Query message) for each server
for(Map<Integer, String> m : query_data){
   // m.get(0) is IP address, and m.get(1) is PORT
   send_packet = new DatagramPacket(buff, buff.length, InetAddress.getByName(m.get(0)), Integer.parseInt(m.get(1)));
   socket.send(send_packet);
}

System.out.println("Query header sent to " + query_data.size() + " servers. Total: " + query_data.size() * buff.length + " bytes of data.");

出力:

1200 台のサーバーに送信されるクエリ ヘッダー。合計: 19200 バイトのデータ。

ListenServer クラス (サーバーからすべての応答を取得するために 60 秒間リッスンします):

public class ListenServer implements Runnable{

   private DatagramSocket socket;

   public ListenServer(DatagramSocket socket){
      this.socket = socket;
   }

   @Override
   public void run(){
      long startTime = System.currentTimeMillis();

      int iServerResponse = 0;    

      // While is running for 60 seconds
      while(System.currentTimeMillis < startTime + 60000){
         byte[] buffer = new byte[256];

         DatagramPacket receive_packet = new DatagramPacket(buffer, buffer.length);
         socket.receive(receive_packet);

         iServerResponse++;

         // Reading bytes and other things...
      }

      System.out.println("Received response from " + iServerResponse + "servers.");
   }
}

出力:

651 台のサーバーから応答がありました。

ご覧のとおり、すべてのサーバーがクエリに応答したわけではありません。手動でチェックすると、応答が返ってきます。

私は何を間違っていますか?サーバーごとに X スレッドを開始する必要がありますか (1200 以上のスレッド + ExecutorServer など)? for-each サイクルだと思います。あまりにも多くのアドレスに対してあまりにも多くのデータを送信しています。または、リッスン サーバー クラスである可能性があります。

4

0 に答える 0