Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Пример кода как использовать RCON

Тема в разделе "Разработка плагинов для новичков", создана пользователем XjCyan1de, 4 май 2017.

Статус темы:
Закрыта.
  1. Автор темы
    XjCyan1de

    XjCyan1de Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    XjCyan1de
    Хотел бы посмотреть пример кода как можно выполнять RCON команду на другом сервере, гугли не нашёл
     
  2. Хостинг MineCraft
    <
  3. xDark

    xDark Активный участник Пользователь

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Как же это было сложно, держи. (c) разраб пхпмк
    Код:
    import static java.nio.ByteOrder.LITTLE_ENDIAN;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.InetSocketAddress;
    import java.net.Socket;
    import java.net.SocketAddress;
    import java.nio.ByteBuffer;
    
    class Main
    {
    
        /*
         * The constants are the packet types.
         */
        static final int EXECUTE_COMMAND_PACKET = 2;
        static final int AUTHORIZATION_PACKET = 3;
        static final int AUTHORIZATION_RESPONSE = 2;
        static final SocketAddress serverAddress = new InetSocketAddress("YOUR SERVER ADDRESS HERE", 27015);
        static final String rconPassword = "YOUR SERVER RCON PASSWORD";
        static InputStream inputStream;
        static OutputStream outputStream;
    
        /**
         * Starts the application.
         *
         * @param args command-line arguments
         * @throws IOException
         */
        public static void main(String[] args) throws IOException
        {
            /*
             * Prepare the socket and retrieve the streams.
             */
            Socket socket = new Socket();
            socket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
            socket.connect(serverAddress);
            inputStream = socket.getInputStream();
            outputStream = socket.getOutputStream();
    
            /*
             * Authorize the user and then send commands. Multiple commands can be sent, but the user may need to be
             * reauthorized after some time.
             */
            sendAuthorizationPacket();
            sendCommand("say Hello, world!");
    
            /*
             * Close the socket once its done being used.
             */
            socket.close();
        }
    
        /**
         * Sends a command to the server. The user must be authorized for the server to execute the commands.
         *
         * @param command the command
         * @throws IOException
         */
        static void sendCommand(String command) throws IOException
        {
            byte[] packet = createPacket(1000, EXECUTE_COMMAND_PACKET, command);
            outputStream.write(packet);
    
            /*
             * The server responds to command execution packets as well, but those responses are not very important.
             * However, it may be worthwhile to check if the server actually responded with text. If a response contains no
             * textual message, that usually means that the user needs to be reauthorized with the server. Another way to
             * check if the user needs to be reauthorized is simply by joining the server and seeing if the commands sent
             * have any effect.
             */
        }
    
        /**
         * Sends an authorization packet to the server.
         *
         * @return whether or not the user was authorized by the server
         * @throws IOException
         */
        static boolean sendAuthorizationPacket() throws IOException
        {
            /*
             * Create the authorization packet and send it.
             */
            byte[] packet = createPacket(1000, AUTHORIZATION_PACKET, rconPassword);
            outputStream.write(packet);
    
            /*
             * Read the response (the first packet is a junk one) and check if the server authorized the user. The user is
             * authorized if the server responds with the same packet ID as the one sent, which is 1000 in this case.
             */
            parsePacket();
            ByteBuffer response = parsePacket();
            return (response.getInt(8) == AUTHORIZATION_RESPONSE) && (response.getInt(4) == 1000);
        }
    
        /**
         * Creates an RCON packet.
         *
         * @param id the packet ID (not an opcode)
         * @param type the type
         * @param command the command
         * @return the bytes representing the packet
         */
        static byte[] createPacket(int id, int type, String command)
        {
            ByteBuffer packet = ByteBuffer.allocate(command.length() + 16);
            packet.order(LITTLE_ENDIAN);
            packet.putInt(command.length() + 12).putInt(id).putInt(type).put(command.getBytes()).putInt(0);
            return packet.array();
        }
    
        /**
         * Parses the next packet from the socket's input stream.
         *
         * @return the next packet
         * @throws IOException
         */
        static ByteBuffer parsePacket() throws IOException
        {
            /*
             * Read the length of the packet.
             */
            byte[] length = new byte[4];
            inputStream.read(length);
    
            /*
             * Create a buffer to contain the packet's payload.
             */
            ByteBuffer packet = ByteBuffer.allocate(4120);
            packet.order(LITTLE_ENDIAN);
            packet.put(length);
    
            /*
             * Read the payload.
             */
            for (int i = 0; i < packet.getInt(0); i++)
            {
                packet.put((byte) inputStream.read());
            }
    
            return packet;
        }
    }
     
  4. Автор темы
    XjCyan1de

    XjCyan1de Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    XjCyan1de
    [​IMG]
    По RCON у меня подключается, а вот команду say Hello World не отправляет.[DOUBLEPOST=1493989538,1493960435][/DOUBLEPOST]Погуглил и всё таки нашёл api для RCON: https://github.com/Kronos666/rkon-core
    Но всё равно спасибо. Тема закрыта
     
Статус темы:
Закрыта.

Поделиться этой страницей