Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确查询服务器信息?_Java_String_Byte - Fatal编程技术网

Java 如何正确查询服务器信息?

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[

我想查询游戏服务器的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[] 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
请您描述一下您的代码好吗?