Как правильно запрашивать информацию о сервере? - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу запросить у игрового сервера его игровой счет. Это изображение показывает, какую информацию вы можете получить с сервера. types

Я использовал этот код до сих пор:

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();
    } 
}

Моя проблема в том, что я просто получаю типы строк (те, что на изображении; Имя сервера, Карта, Папка, Игра, Версия) в качестве ответа. Вот что я получаю в точности (не могу скопировать и вставить): response

Что я должен изменить, чтобы получить количество игроков в ответ?

Дополнительная информация: Сервер использует Протокол запросов к серверу Valve

1 Ответ

0 голосов
/ 28 января 2019

решаю и делюсь мой плохой код 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;
    }
}
...