Java 如何正确查询服务器信息?
我想查询游戏服务器的playercount。此图显示了可以从服务器获取的信息类型 到目前为止,我正在使用此代码:Java 如何正确查询服务器信息?,java,string,byte,Java,String,Byte,我想查询游戏服务器的playercount。此图显示了可以从服务器获取的信息类型 到目前为止,我正在使用此代码: import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketTimeoutException; public static void main(String[
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketTimeoutException;
public static void main(String[] args) {
String hostname = "85.190.155.70";
int port = 27017;
try {
InetAddress address = InetAddress.getByName(hostname);
DatagramSocket socket = new DatagramSocket();
byte[] readonly = { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 0x54, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x45, 0x6E, 0x67, 0x69, 0x6E, 0x65, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x00 };
DatagramPacket request = new DatagramPacket(readonly, readonly.length, address, port);
socket.send(request);
byte[] receiveData = new byte[900];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
socket.receive(receivePacket);
String sentence = new String( receivePacket.getData(), 0, receivePacket.getLength(), "utf-8");
System.out.println("RECEIVED: " + sentence);
socket.close();
} catch (SocketTimeoutException ex) {
System.out.println("Timeout error: " + ex.getMessage());
ex.printStackTrace();
} catch (IOException ex) {
System.out.println("Client error: " + ex.getMessage());
ex.printStackTrace();
}
}
我的问题是,我似乎只是得到字符串类型(图像中的类型;服务器名称、地图、文件夹、游戏、版本)作为响应。以下是我得到的确切信息(无法复制粘贴):
我必须改变什么才能得到玩家计数作为响应
其他信息:
服务器正在使用我解决并共享它
我的坏代码sry
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
DatagramSocket socket = null;
try {
String ip = null;
if (Server[3].equals("1")) {
ip = GetIP(Server[2]);
} else {
ip = Server[2];
}
int port = Integer.parseInt(Server[4]);
InetAddress address = InetAddress.getByName(ip);
byte[] readonly = { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x54, (byte) 0x53,
(byte) 0x6F, (byte) 0x75, (byte) 0x72, (byte) 0x63, (byte) 0x65, (byte) 0x20, (byte) 0x45,
(byte) 0x6E, (byte) 0x67, (byte) 0x69, (byte) 0x6E, (byte) 0x65, (byte) 0x20, (byte) 0x51,
(byte) 0x75, (byte) 0x65, (byte) 0x72, (byte) 0x79, (byte) 0x00 };
DatagramPacket request = new DatagramPacket(readonly, readonly.length, address, port);
socket = new DatagramSocket();
socket.send(request);
byte[] receiveData = new byte[1400];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
socket.setSoTimeout(2000);
socket.receive(receivePacket);
int headlength = 4;
int protocollength = 2;
int i;
int namelength = 0;
for (i = 6; i < 1400; i++) {
if (receiveData[i] == 0) {
namelength = i - 6;
break;
}
}
byte[] name = new byte[namelength];
for (i = 6; i < namelength + 6; i++) {
name[i - 6] = receiveData[i];
}
String nameString = new String(name, StandardCharsets.UTF_8);
int maplength = 0;
for (i = 6 + namelength + 1; i < 1400; i++) {
if (receiveData[i] == 0) {
maplength = i - 6 - 1 - namelength;
break;
}
}
byte[] map = new byte[maplength];
for (i = 6 + 1 + namelength; i < namelength + maplength + 6 + 1; i++) {
map[i - 6 - 1 - namelength] = receiveData[i];
}
String mapString = new String(map, StandardCharsets.UTF_8);
int folderlength = 0;
for (i = 6 + 1 + 1 + namelength + maplength; i < 1400; i++) {
if (receiveData[i] == 0) {
folderlength = i - 6 - 1 - 1 - namelength - maplength;
break;
}
}
int gamelength = 0;
for (i = 6 + 1 + 1 + 1 + namelength + maplength + folderlength; i < 1400; i++) {
if (receiveData[i] == 0) {
gamelength = i - 6 - 1 - 1 - 1 - namelength - maplength - folderlength;
break;
}
}
int IDlength = 1;
byte players = receiveData[6 + namelength + maplength + folderlength + gamelength + 4 + 1 + 1];
byte playersMax = receiveData[1 + 6 + namelength + maplength + folderlength + gamelength + 4 + 1 + 1];
list.add(nameString);
list.add(mapString);
list.add(String.valueOf(players));
list.add(String.valueOf(playersMax));
list.add("1");
return list;
}
}
publicstaticvoidmain(字符串[]args){
ArrayList=新建ArrayList();
DatagramSocket套接字=空;
试一试{
字符串ip=null;
如果(服务器[3]。等于(“1”)){
ip=GetIP(服务器[2]);
}否则{
ip=服务器[2];
}
int port=Integer.parseInt(服务器[4]);
InetAddress=InetAddress.getByName(ip);
字节[]只读={(字节)0xFF,(字节)0xFF,(字节)0xFF,(字节)0xFF,(字节)0xFF,(字节)0x54,(字节)0x53,
(字节)0x6F,(字节)0x75,(字节)0x72,(字节)0x63,(字节)0x65,(字节)0x20,(字节)0x45,
(字节)0x6E,(字节)0x67,(字节)0x69,(字节)0x6E,(字节)0x65,(字节)0x20,(字节)0x51,
(字节)0x75,(字节)0x65,(字节)0x72,(字节)0x79,(字节)0x00};
DatagramPacket请求=新的DatagramPacket(只读,只读.length,地址,端口);
套接字=新的DatagramSocket();
socket.send(请求);
字节[]接收数据=新字节[1400];
DatagramPacket receivePacket=新的DatagramPacket(receiveData,receiveData.length);
插座.设置插座输出(2000年);
套接字。接收(接收数据包);
内部头长=4;
int protocollength=2;
int i;
int namelength=0;
对于(i=6;i<1400;i++){
if(接收数据[i]==0){
namelength=i-6;
打破
}
}
字节[]名称=新字节[名称长度];
对于(i=6;i
请您描述一下您的代码好吗?