Верно,
Я пытаюсь написать крошечный скрипт на PHP, который отправит пакет игрового чата в Minecraft.
//Deliberately low timeout
$mc = fsockopen("localhost", 25565, $errno, $err, 3);
Теперь, если это успешно соединяется, я отправляю 2 «пакета».
Один байт с целым числом 3, чтобы сообщить Minecraft, что он должен обрабатывать входящий сетевой трафик как «пакет» Packet3Chat:
fwrite( $mc, strrev( pack( "C", 3 ) ) );
Кажется, это работает отлично**.
Второй необходимый «пакет» — это длина строки в виде подписанный шорт.
$my_string = "Hello World!";
//119 character limit on Minecraft chat messages
$processed_string = substr($my_string, 0, 119);
fwrite($mc, strrev( pack( "s", strlen( $processed_string ) ) ) );
И это также работает A-OK**.
И теперь все, что осталось сделать, это отправить фактическую строку, в виде символов.
Я попытался разделить строку, используя str_split
, и отправить каждый символ самостоятельно, используя оба:
//Signed char
fwrite($mc, strrev( pack( "c", $character ) ) );
и
//Unsigned char
fwrite($mc, strrev( pack( "C", $character ) ) );
И я также пытался просто отправить всю строку этими методами, не разбивая ее, однако мне не удалось успешно распечатать символы, полученные readChar()
(System.out.println
просто печатает пустую строку), и я получаю fwrite error 10053 в какой-то момент во время отправки символов, т. е. readChar()
генерирует EOFException
.
Я запускаю модифицированный сервер Minecraft в Windows 7 и запускаю PHP 5.x с использованием XAMPP на том же компьютере.
Любые идеи, почему соединение будет «закрыто программным обеспечением»? И почему он закрывается только при отправке символов/строки, а не при отправке байта/шорта?
** Да, я использовал
System.out.println
для проверки данных, полученных Minecraft.