我有一个具有不同 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 等)?我认为这是每个循环,我为太多地址发送了太多数据。或者它可能是监听服务器类。