+
Skip to content

firedtoad/psproto

Repository files navigation

Sproto PHP Extension Bind

The future net protocol Sproto was implemented by many language listed in sproto_wiki how does it can be absenced in php world Here is the php implementation

#prerequisite

generate c2s.spb and s2c.spb with sprotodump

	lua sprotodump.lua -spb c2s.proto -o c2s.spb
	lua sprotodump.lua -spb s2c.proto -o s2c.spb

#How To use

	<?php
	require 'sproto.php';
	$sproto=new Sproto();
	$sproto->load_proto_from_file('s2c', 's2c.spb');
	$sproto->load_proto_from_file('c2s', 'c2s.spb');
	$sproto->dumpproto('s2c');//see if the dumped proto right
	$sproto->dumpproto('c2s');//see if the dumped proto right
	//encde and decode
	$buffer=$sproto->encode('c2s', 'get.request', array('what'=>'want_some_key'));
	$ret=$sproto->decode('c2s', 'get.request', $buffer);
	var_dump($ret);
	//make request 
	//notice the request session id must be the same with the response session id
	$reqbuffer=$sproto->request('c2s', 'get', array('what'=>'wanted'),10001);
	$ret=$sproto->dispath('c2s', $reqbuffer);
	var_dump($ret);
	//make response
	//notice the response session id must be the same with the request session id
	$resbuffer=$sproto->response('c2s', 'get', array('result'=>'wanted_is_here'),10001);
	$ret=$sproto->dispath('c2s', $resbuffer);
	var_dump($ret);

#Here is a complicated example

    require 'sproto.php';
	$sproto=new Sproto();
	$sproto->load_proto_from_file('s2c', 's2c.spb');
	$sproto->load_proto_from_file('c2s', 'c2s.spb');
	$e=0;$t=0;
	$send_session=1;
	//assume skynet gate server listen on 127.0.0.1:8888
	$s=fsockopen('127.0.0.1',8888,$e,$t,1000);
	stream_set_blocking($s, 0);
	//send the handshake to server
	$hand=$sproto->request('c2s', 'handshake', array(),$send_session++);
	fwrite($s, Sproto::netpack($hand));
	//set something 
	// $hand=$sproto->request('c2s', 'set', array('what'=>'hello','value'=>'hello from c programmer dietoad'),10001);
	// fwrite($s, Sproto::netpack($hand));
	$hand=$sproto->request('c2s', 'set', array('what'=>'yes','value'=>'yes message from php'),$send_session++);
	fwrite($s, Sproto::netpack($hand));
	// stream_set_blocking(STDIN,0);
	while(1)
	{
	    $len=array();
	    $header=fread($s, 2);
	    if($s&&$header)
	    {
	        //header size is a 2bytes big endian unsigned short  
	        $len=unpack('nlen', $header);
	        var_dump($len);
	    }
	    if(!empty($len['len']))
	    {
	        $len=$len['len'];
	        $left=$len;
	        $readed=0;
	        $r='';
	        $buffer='';
	        //read until we have enough bytes 
	        while($readed!=$len)
	        {
	            $r=fread($s, $left);
	            $buffer.=$r;
	            $read_len=strlen($r);
	            $readed+=$read_len;
	            $left-=$read_len;
	        }
	        //unpacked the netpackage receive from the server
	        $unpacked=Sproto::unpack($buffer);
	        $disp=$sproto->dispath('c2s',$unpacked);
	        print_r($disp);
	        $receive_session=!empty($disp['session'])?$disp['session']:0;
	        if($receive_session==($send_session-1))
	        {
	            echo "type hello or yes and press enter\n";
	            $cx=fgets(STDIN);
	            if($cx)
	            {
	                $reqbuffer=$sproto->request('c2s','get',array('what'=>trim('yes')), $send_session++);
	                echo strlen($reqbuffer),"\n";
	                fwrite($s, Sproto::netpack($reqbuffer));
	            }
	        }
	       
	    }
	    usleep(100000);
	}

#Problems there is some naughty BUGS in the php master version 7.2

About

sproto for php

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载