правый
Я пытаюсь написать крошечный скрипт на PHP, который отправит пакет игрового чата в Minecraft.
//Deliberately low timeout
$mc = fsockopen("localhost", 25565, $errno, $err, 3);
Теперь, если это успешно установлено, я отправляю 2 "пакета".
Один байт с целым числом 3, указывающим Minecraft, что он должен обрабатывать входящий сетевой трафик как «пакет» Packet3Chat:
fwrite( $mc, strrev( pack( "C", 3 ) ) );
Это похоже на работу A-OK **.
Второй требуемый «пакет» - это длина строки: короткое число со знаком .
$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 10053 в какой-то момент во время отправки символов - т.е. EOFException
выбрасывается readChar()
.
Я использую модифицированный Minecraft Server в Windows 7 и использую XAMPP на той же машине с PHP 5.x.
Есть идеи, почему соединение будет "закрыто программным обеспечением"? И почему он закрывается только во время отправки символов / строки, а не во время отправки байта / короткого текста?
** Да, я использовал
System.out.println
для проверки данных, полученных Minecraft.