protoc gen php,protobuf-php和socket的使用方法

本文主要和大家分享protobuf-php和socket的使用方法,主要以代码的方式和大家讲解,希望能帮助到大家。

vi login.protopackage login;

message ReqCheckVerifyVerLoginClient

{

required int32 game = 1; ///< 游戏类型编号 required bytes version = 2; ///< 游戏版本号}

message AnsCheckVerifyVerLoginClient

{

required uint32 ret_code = 1; //返回码 optional uint32 forbid_flag = 2; //冻结时间 optional uint32 time_diff = 3; //剩余解封时间}

protoc --plugin=/usr/local/php/bin/protoc-gen-php --php_out=. -I. login.proto

得到login.phpnamespace login { class ReqCheckVerifyVerLoginClient extends \DrSlump\Protobuf\Message { /** @var int */ public $game = null;

/** @var string */ public $version = null;

/** @var \Closure[] */ protected static $__extensions = array();.........

使用login.php

function.php<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/3/23 * Time: 19:26 */require 'socket.php';require 'structNum.php';function socket($ip,$port,$packed){ try{

$socket = Socket::singleton();

$socket->connect($ip,$port); if(count($packed) >1){ foreach ($packed as $key){

$sockResult = $socket->sendRequest($key);// 将包发送给服务器 sleep(3);

}

}

$getrepost = $socket->getResponse();

$socket->disconnect (); //关闭链接 } catch (Exception $e) {

var_dump($e);

$this->log_error(" error send to server".$e->getMessage());

} return $getrepost;

}function unPackData($data){

$rev_len = unpack("L*",substr($data,0,4));

$rev_num = unpack("S*",substr($data,4,2));

$rev_data = substr($data,6,2);

$data_array = array( 'num' =>$rev_num, 'data'=>$rev_data

); return $data_array;

}

$structNum;function StructNum($num){

$class = $GLOBALS['structNum'][$num]; return $class;

}

socket.php<?phpdefine ("CONNECTED", true);

define("DISCONNECTED", false); Class Socket { private static $instance; private $connection = null; private $connectionState = DISCONNECTED; private $defaultHost = "192.168.128.198"; private $defaultPort = 9301; private $defaultTimeOut = 60; public $debug = false; public function __construct()

{

} /** * Singleton pattern. Returns the same instance to all callers * * @return Socket */ public static function singleton()

{ if (self::$instance == null || ! self::$instance instanceof Socket)

{ self::$instance = new Socket();

} return self::$instance;

} public function connect($serverHost=false,$serverPort=false,$timeOut=false)

{ if($serverHost == false)

{ $serverHost = $this->defaultHost;

} if($serverPort == false)

{ $serverPort = $this->defaultPort;

}

$this->defaultHost = $serverHost;

$this->defaultPort = $serverPort; if($timeOut == false)

{ $timeOut = $this->defaultTimeOut;

}

$this->connection = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if(socket_connect($this->connection,$serverHost,$serverPort) == false)

{

$errorString = socket_strerror(socket_last_error($this->connection));

$this->_throwError("Connecting to {$serverHost}:{$serverPort} failed.
Reason: {$errorString}");

}else{

$this->_throwMsg("Socket connected!");

}

$this->connectionState = CONNECTED;

} /** * Disconnects from the server * * @return True on succes, false if the connection was already closed */ public function disconnect()

{ if($this->validateConnection())

{

socket_close($this->connection);

$this->connectionState = DISCONNECTED;

$this->_throwMsg("Socket disconnected!"); return true;

} return false;

} public function sendRequest($data)

{ if($this->validateConnection())

{

$result = socket_write($this->connection,$data,strlen($data)); return $result;

}else{

$this->_throwError("Sending command \"{$data}\" failed.
Reason: Not connected");

}

} public function getResponse()

{ if($this->validateConnection())

{ if( ($ret = socket_read($this->connection,8192)) == false){

$this->_throwError("Receiving response from server failed.
Reason: Not bytes to read"); return false;

} else{ return $ret;

}

}

} public function isConn()

{ return $this->connectionState;

} public function getUnreadBytes()

{

$info = socket_get_status($this->connection); return $info['unread_bytes'];

} public function getConnName(&$addr, &$port)

{ if ($this->validateConnection())

{

socket_getsockname($this->connection,$addr,$port);

}

} public function waitForResponse()

{ if($this->validateConnection())

{ return socket_read($this->connection, 2048);

}

$this->_throwError("Receiving response from server failed.
Reason: Not connected"); return false;

} /** * Validates the connection state * * @return bool */ private function validateConnection()

{ return (is_resource($this->connection) && ($this->connectionState != DISCONNECTED));

} /** * Throws an error * * @return void */ private function _throwError($errorMessage)

{ echo "Socket error: " . $errorMessage;

} /** * Throws an message * * @return void */ private function _throwMsg($msg)

{ if ($this->debug)

{ echo "Socket message: " . $msg . "\n\n";

}

} /** * If there still was a connection alive, disconnect it */ public function __destruct()

{

$this->disconnect();

}

}

structNum.php // 类的字典<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/3/26 * Time: 17:54 */$structNum = array( 46=>new \login\ReqCheckVerifyVerLoginClient(), 47=>new \login\AnsCheckVerifyVerLoginClient(),

);

vi use_login.php<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/3/26 * Time: 15:20 */require_once 'DrSlump/Protobuf.php';

\DrSlump\Protobuf::autoload();require 'login.php';require 'function.php';//实例化 class 46$login = StructNum(46);

$login->setGame(3);

$login->setVersion('0.0.1');

$first_data = pack("I*",24063);//一个可识别的ID

$first_len = pack("I*",4);

$second_data = $login->serialize();//序列化

$second_len = pack("I*",strlen($second_data) + 2);

$second_num = substr(pack("I*",46),0,2);

$first_pack = $first_len.$first_data; //字节 包体

$second_pack = $second_len.$second_num.$second_data;//长度 协议 内容(protobuf)

$port = 9301;

$ip = "192.168.128.198";

$pack = array($first_pack,$second_pack);

$result = socket($ip,$port,$pack);//连接 发送 接受数据 数据为长度 协议 内容(protobuf)

$unPackDatas = unPackData($result);//拆分数据(按需拆分) 按 4 2 2 拆分//实例化 class 46$reLogin = StructNum($unPackDatas['num'][1]);

$reLogin->parse($unPackDatas['data']);//拆分后的内容 再反序列化

$reLogin->getRetCode();

$reLogin->getForbidFlag();

$reLogin->clearTimeDiff();

var_dump($reLogin);

相关推荐:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值