Java UDP发送和接收数千个数据

Java UDP发送和接收数千个数据,java,udp,Java,Udp,我有一个具有不同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 fr

我有一个具有不同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.");
//在向服务器发送任何数据之前启动侦听服务器。
新线程(新ListenServer(套接字)).start();
//连接并从数据库获取数据
MysqlData data=newmysqldata(“localhost”、“root”、“abc123”、“gm_数据库”);
LinkedList query_data=data.mysql_fetch_assoc(“从gm_服务器中选择*);
//为每个服务器发送16字节的数据(查询消息)
用于(地图m:查询数据){
//m.get(0)是IP地址,m.get(1)是端口
send_packet=newdatagrampacket(buff,buff.length,InetAddress.getByName(m.get(0)),Integer.parseInt(m.get(1));
socket.send(发送_包);
}
System.out.println(“发送到“+Query_data.size()+”服务器的查询头。总计:“+Query_data.size()*buff.length+”字节数据”);
输出:

查询头发送到1200台服务器。总计:19200字节的数据

ListenServer类(正在侦听60秒以获取来自服务器的所有响应):

公共类ListenServer实现可运行{
专用DatagramSocket套接字;
公用ListenServer(DatagramSocket套接字){
this.socket=socket;
}
@凌驾
公开募捐{
long startTime=System.currentTimeMillis();
int iServerResponse=0;
//当它运行60秒时
而(System.currentTimeMillis
输出:

收到来自651台服务器的响应

如您所见,并非所有服务器都响应了该查询。如果我进行手动检查,我会得到响应


我做错了什么?我是否需要为每个服务器启动X个线程(1200多个线程+Executor服务器,等等)?我认为这是每个周期的问题,我发送的数据太多,地址太多。或者它可能是listen服务器类。

您的计算机正在使用netstat之类的工具接收多少数据?您应该能够判断您的应用程序是否实际接收发送到您的计算机的所有内容。您知道UDP不可靠吗?
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.");
   }
}