Ошибка fsockopen 10053 при записи символов в сокет Java
Правильно,
Я пытаюсь написать крошечный скрипт на 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 ответа
10053 - это код ошибки winsock для WSAECONNABORTED.
"Понятное" объяснение этого состояния ошибки можно найти по адресу http://www.chilkatsoft.com/p/p_299.asp
Попробуйте плагин HTTPConsole и
и используйте функцию, подобную этой, для выполнения команды:
function exec_shell_command($command) {
$command = urlencode($command);
$url = "http://127.0.0.1:25560/console?command=$command";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$out = curl_exec($ch);
curl_close($ch);
return $out;
}
$retval = exec_shell_command("say this is a server message");
Я не уверен, что если вы делаете то, что вы хотите, когда вы говорите "отправить сообщение чата", это отправляет консольное сообщение на сервер.