Я не уверен, что вы делаете то, что хотите, когда вы говорите «отправить сообщение в чат». Это отправляет консольное сообщение на сервер.

льно,

Я пытаюсь написать крошечный скрипт на 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 и работаю с PHP 5.x, используя XAMPP на той же машине.

Есть идеи, почему соединение будет «закрыто программным обеспечением»? И почему он закрывается только во время отправки символов / строки, а не во время отправки байта / короткой строки?

** Да, я использовалSystem.out.println проверить данные, полученные Minecraft.

Ответы на вопрос(2)

Ваш ответ на вопрос