Created
November 25, 2015 09:29
-
-
Save forthxu/50da9174348720f91726 to your computer and use it in GitHub Desktop.
try write a php client to learn the pocketmine-pe
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| //error_reporting(0); | |
| header("Content-type:text/html;charset=utf-8"); | |
| function __autoload($class_name) { | |
| require_once ('/workspace/minecraft/pocket/src/'.str_replace('\\','/',$class_name) . '.php'); | |
| } | |
| function test($f=array()){ | |
| $magic = "\x00\xff\xff\x00\xfe\xfe\xfe\xfe\xfd\xfd\xfd\xfd\x12\x34\x56\x78"; | |
| $re = null; | |
| $config=array_merge(array('ip'=>'192.168.54.245','port'=>19121),$f); | |
| $client = @stream_socket_client("udp://".$config['ip'].":".$config['port'], $errno, $errstr); //非阻塞Socket | |
| if(!$client){ | |
| $re = false; | |
| }else{ | |
| stream_set_timeout($client , 1); | |
| //-----------------0x05 0x06 | |
| $r1 = new raklib\protocol\OPEN_CONNECTION_REQUEST_1(); | |
| $r1->encode(); | |
| $date_send = $r1->buffer; | |
| fwrite($client, $date_send); | |
| $data_receive = fread($client, 65535); | |
| echo "\r\n".'send_id:'.'0x'.dechex($r1::$ID).' send_len:'.strlen($date_send).' receive_len:'.strlen($data_receive)."\r\n"; | |
| if ($data_receive != "") { | |
| var_dump('0x'.dechex(ord($data_receive{0}))); | |
| $rs1 = new raklib\protocol\OPEN_CONNECTION_REPLY_1(); | |
| $rs1->buffer=$data_receive; | |
| $rs1->decode(); | |
| var_dump($rs1); | |
| }else{ | |
| $re = 'no_data'; | |
| } | |
| //-----------------0x07 0x08 | |
| $r2 = new raklib\protocol\OPEN_CONNECTION_REQUEST_2(); | |
| $r2->serverAddress=$config['ip']; | |
| $r2->serverPort=$config['port']; | |
| $r2->encode(); | |
| $date_send = $r2->buffer; | |
| fwrite($client, $date_send); | |
| $data_receive = fread($client, 65535); | |
| echo "\r\n".'send_id:'.'0x'.dechex($r2::$ID).' send_len:'.strlen($date_send).' receive_len:'.strlen($data_receive)."\r\n"; | |
| if ($data_receive != "") { | |
| var_dump('0x'.dechex(ord($data_receive{0}))); | |
| $rs2 = new raklib\protocol\OPEN_CONNECTION_REPLY_2(); | |
| $rs2->buffer=$data_receive; | |
| $rs2->decode(); | |
| var_dump($rs2); | |
| }else{ | |
| $re = 'no_data'; | |
| } | |
| //-----------------0x09 0x10 | |
| $pk = new raklib\protocol\CLIENT_CONNECT_DataPacket(); | |
| $pk->clientID=1343475902; | |
| $pk->sendPing=21310322131032; | |
| $pk->encode(); | |
| $sendPacket = new raklib\protocol\EncapsulatedPacket(); | |
| $sendPacket->reliability = 0; | |
| $sendPacket->buffer = $pk->buffer; | |
| $packet = new raklib\protocol\DATA_PACKET_0(); | |
| if ($sendPacket->needACK) { | |
| $packet->packets[] = clone $sendPacket; | |
| $sendPacket->needACK = false; | |
| } else { | |
| $packet->packets[] = $sendPacket->toBinary(); | |
| } | |
| $packet->encode(); | |
| $date_send = $packet->buffer; | |
| fwrite($client, $date_send); | |
| $data_receive = fread($client, 65535); | |
| echo "\r\n".'send_id:'.'0x'.dechex($pk::$ID).' send_len:'.strlen($date_send).' receive_len:'.strlen($data_receive)."\r\n"; | |
| if ($data_receive != "") { | |
| //多个合成包 | |
| var_dump('0x'.dechex(ord($data_receive{0}))); | |
| $packet = new raklib\protocol\DATA_PACKET_0(); | |
| $packet->buffer=$data_receive; | |
| $packet->decode(); | |
| // var_dump($packet); | |
| //压缩包 | |
| var_dump($packet->packets[0]); | |
| var_dump('0x'.dechex(ord($packet->packets[0]->buffer{0}))); | |
| // $sendPacket = new raklib\protocol\EncapsulatedPacket(); | |
| // var_dump($sendPacket->fromBinary($packet->packets[0]->buffer)); | |
| //数据包 | |
| $rs = new raklib\protocol\SERVER_HANDSHAKE_DataPacket(); | |
| $rs->buffer=$packet->packets[0]->buffer; | |
| $rs->decode(); | |
| var_dump($rs); | |
| }else{ | |
| $re = 'no_data'; | |
| } | |
| //-----------------0x13 | |
| $pk = new raklib\protocol\CLIENT_HANDSHAKE_DataPacket(); | |
| $pk->address=$config['ip']; | |
| $pk->port=$config['port']; | |
| $pk->sendPing=$rs->sendPing; | |
| $pk->sendPong=bcadd($rs->sendPing, "1000");; | |
| $pk->encode(); | |
| $sendPacket = new raklib\protocol\EncapsulatedPacket(); | |
| $sendPacket->reliability = 0; | |
| $sendPacket->buffer = $pk->buffer; | |
| $packet = new raklib\protocol\DATA_PACKET_0(); | |
| if ($sendPacket->needACK) { | |
| $packet->packets[] = clone $sendPacket; | |
| $sendPacket->needACK = false; | |
| } else { | |
| $packet->packets[] = $sendPacket->toBinary(); | |
| } | |
| $packet->encode(); | |
| $date_send = $packet->buffer; | |
| fwrite($client, $date_send); | |
| echo "\r\n".'send_id:'.'0x'.dechex($pk::$ID).' send_len:'.strlen($date_send)."\r\n"; | |
| //-----------------0x82 | |
| $pk = new pocketmine\network\protocol\LoginPacket(); | |
| $pk->username='forthxu'; | |
| $pk->protocol1=27; | |
| $pk->protocol2=27; | |
| $pk->clientId=1299218856; | |
| $pk->slim=true; | |
| $pk->encode(); | |
| $sendPacket = new raklib\protocol\EncapsulatedPacket(); | |
| $sendPacket->reliability = 0; | |
| $sendPacket->buffer = $pk->buffer; | |
| $packet = new raklib\protocol\DATA_PACKET_4(); | |
| // if ($sendPacket->needACK) { | |
| // $packet->packets[] = clone $sendPacket; | |
| // $sendPacket->needACK = false; | |
| // } else { | |
| $packet->packets[] = $sendPacket->toBinary(); | |
| // } | |
| $packet->encode(); | |
| $date_send = $packet->buffer; | |
| fwrite($client, $date_send); | |
| $data_receive = fread($client, 65535); | |
| echo "\r\n".'send_id:'.'0x'.dechex($pk::NETWORK_ID).' send_len:'.strlen($date_send).' receive_len:'.strlen($data_receive)."\r\n"; | |
| if ($data_receive != "") { | |
| var_dump('0x'.dechex(ord($data_receive{0}))); | |
| }else{ | |
| $re = 'no_data'; | |
| } | |
| } | |
| fclose($client); | |
| $re='end'; | |
| return $re; | |
| } | |
| $f=array(); | |
| var_dump(test($f)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment