0

0

Php socket数据编码

php中文网

php中文网

发布时间:2016-06-23 13:46:27

|

1160人浏览过

|

来源于php中文网

原创

bytes.php  字节编码类

/** * byte数组与字符串转化类 * @author  * created on 2011-7-15 */class bytes {       /**     * 转换一个string字符串为byte数组     * @param $str 需要转换的字符串     * @param $bytes 目标byte数组     * @author zikie     */        public static function getbytes($str) {        $len = strlen($str);        $bytes = array();           for($i=0;$i<$len;$i++) {               if(ord($str[$i]) >= 128){                   $byte = ord($str[$i]) - 256;               }else{                   $byte = ord($str[$i]);               }            $bytes[] =  $byte ;        }        return $bytes;    }       /**     * 将字节数组转化为string类型的数据     * @param $bytes 字节数组     * @param $str 目标字符串     * @return 一个string类型的数据     */        public static function tostr($bytes) {        $str = '';        foreach($bytes as $ch) {            $str .= chr($ch);        }           return $str;    }       /**     * 转换一个int为byte数组     * @param $byt 目标byte数组     * @param $val 需要转换的字符串     * @author zikie     */       public static function integertobytes($val) {        $byt = array();        $byt[0] = ($val & 0xff);        $byt[1] = ($val >> 8 & 0xff);        $byt[2] = ($val >> 16 & 0xff);        $byt[3] = ($val >> 24 & 0xff);        return $byt;    }       /**     * 从字节数组中指定的位置读取一个integer类型的数据     * @param $bytes 字节数组     * @param $position 指定的开始位置     * @return 一个integer类型的数据     */        public static function bytestointeger($bytes, $position) {        $val = 0;        $val = $bytes[$position + 3] & 0xff;        $val <<= 8;        $val |= $bytes[$position + 2] & 0xff;        $val <<= 8;        $val |= $bytes[$position + 1] & 0xff;        $val <<= 8;        $val |= $bytes[$position] & 0xff;        return $val;    }    /**     * 转换一个shor字符串为byte数组     * @param $byt 目标byte数组     * @param $val 需要转换的字符串     * @author zikie     */       public static function shorttobytes($val) {        $byt = array();        $byt[0] = ($val & 0xff);        $byt[1] = ($val >> 8 & 0xff);        return $byt;    }       /**     * 从字节数组中指定的位置读取一个short类型的数据。     * @param $bytes 字节数组     * @param $position 指定的开始位置     * @return 一个short类型的数据     */        public static function bytestoshort($bytes, $position) {        $val = 0;        $val = $bytes[$position + 1] & 0xff;        $val = $val << 8;        $val |= $bytes[$position] & 0xff;        return $val;    }   }

 

socket.class.php  socket赋值类

<?phpdefine("CONNECTED", true);define("DISCONNECTED", false);/** * Socket class *  *   * @author Seven  */Class Socket{    private static $instance;    private $connection = null;        private $connectionState = DISCONNECTED;        private $defaultHost = "127.0.0.1";        private $defaultPort = 80;        private $defaultTimeout = 10;        public  $debug = false;        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;    }    /**     * Connects to the socket with the given address and port     *      * @return void     */    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.<br>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;    }    /**     * Sends a command to the server     *      * @return string Server response     */    public function sendRequest($command)    {        if($this->validateConnection())        {            $result = socket_write($this->connection,$command,strlen($command));            return $result;        }        $this->_throwError("Sending command \"{$command}\" failed.<br>Reason: Not connected");    }                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);        }    }               /**     * Gets the server response (not multilined)     *      * @return string Server response     */    public function getResponse()    {        $read_set = array($this->connection);            while (($events = socket_select($read_set, $write_set = NULL, $exception_set = NULL, 0)) !== false)         {            if ($events > 0)            {                foreach ($read_set as $so)                {                    if (!is_resource($so))                    {                        $this->_throwError("Receiving response from server failed.<br>Reason: Not connected");                        return false;                    }elseif ( ( $ret = @socket_read($so,4096,PHP_BINARY_READ) ) == false){                        $this->_throwError("Receiving response from server failed.<br>Reason: Not bytes to read");                        return false;                    }                    return $ret;                }            }        }                return false;    }    public function waitForResponse()    {        if($this->validateConnection())        {            return socket_read($this->connection, 2048);        }                $this->_throwError("Receiving response from server failed.<br>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();    }}?>

PacketBase.class.php  打包类

<?php/** * PacketBase class *  * 用以处理与c++服务端交互的sockets 包 *  * 注意:不支持宽字符 *  * @author Seven <seven@qoolu.com> *  */class PacketBase extends ContentHandler{    private $head;    private $params;    private $opcode;    /**************************construct***************************/    function __construct()    {        $num = func_num_args();        $args = func_get_args();        switch($num){                case 0:                    //do nothing 用来生成对象的                break;                case 1:                        $this->__call('__construct1', $args);                        break;                case 2:                        $this->__call('__construct2', $args);                        break;                default:                        throw new Exception();        }    }    //无参数    public function __construct1($OPCODE)    {            $this->opcode = $OPCODE;            $this->params = 0;    }    //有参数    public function __construct2($OPCODE,  $PARAMS)    {            $this->opcode = $OPCODE;            $this->params = $PARAMS;    }    //析构    function __destruct()    {        unset($this->head);        unset($this->buf);    }        //打包    public function pack()    {        $head = $this->MakeHead($this->opcode,$this->params);        return $head.$this->buf;    }    //解包    public function unpack($packet,$noHead = false)    {                $this->buf = $packet;        if (!$noHead){        $recvHead = unpack("S2hd/I2pa",$packet);        $SD = $recvHead[hd1];//SD        $this->contentlen = $recvHead[hd2];//content len        $this->opcode = $recvHead[pa1];//opcode        $this->params = $recvHead[pa2];//params                $this->pos = 12;//去除包头长度                if ($SD != 21316)        {            return false;        }        }else         {            $this->pos = 0;        }        return true;       }    public function GetOP()    {        if ($this->buf)        {            return $this->opcode;        }        return 0;    }    /************************private***************************/    //构造包头    private function MakeHead($opcode,$param)    {        return pack("SSII","SD",$this->TellPut(),$opcode,$param);    }        //用以模拟函数重载    private function __call($name, $arg)    {        return call_user_func_array(array($this, $name), $arg);    }            /***********************Uitl***************************/    //将16进制的op转成10进制    static function MakeOpcode($MAJOR_OP, $MINOR_OP)    {        return ((($MAJOR_OP & 0xffff) << 16) | ($MINOR_OP & 0xffff));    }}/** * 包体类 * 包含了对包体的操作 */class ContentHandler{    public $buf;    public $pos;    public $contentlen;//use for unpack        function __construct()    {        $this->buf = "";        $this->contentlen = 0;        $this->pos = 0;    }    function __destruct()    {        unset($this->buf);    }        public function PutInt($int)    {        $this->buf .= pack("i",(int)$int);    }    public function PutUTF($str)    {        $l = strlen($str);        $this->buf .= pack("s",$l);        $this->buf .= $str;    }    public function PutStr($str)    {        return $this->PutUTF($str);    }            public function TellPut()    {        return strlen($this->buf);    }            /*******************************************/        public function GetInt()    {        //$cont = substr($out,$l,4);        $get = unpack("@".$this->pos."/i",$this->buf);        if (is_int($get[1])){            $this->pos += 4;            return $get[1];        }        return 0;    }      public function GetShort()    {        $get = unpack("@".$this->pos."/S",$this->buf);        if (is_int($get[1])){            $this->pos += 2;            return $get[1];        }        return 0;    }    public function GetUTF()    {        $getStrLen = $this->GetShort();                if ($getStrLen > 0)        {            $end = substr($this->buf,$this->pos,$getStrLen);            $this->pos += $getStrLen;            return $end;        }        return '';    }    /***************************/      public function GetBuf()    {        return $this->buf;    }        public function SetBuf($strBuf)    {        $this->buf = $strBuf;    }        public function ResetBuf(){        $this->buf = "";        $this->contentlen = 0;        $this->pos = 0;    }}?>

格式

ecshop
ecshop

本版本全面兼容php5.6+,并且修复了许多官方程序的低级代码bug。在apache 2.4.17+php5.6.15环境下测试通过,人格保证无毒无木马,仅仅是一名ecshop热爱者心血来潮之作。ecshop编译更新日志:1、加入最新官方补丁。2、修改数据库连接底层为mysqli, 现在完美无缺了。3、再次对所有代码进行细节修复。4、adminers更新至1.1.2, 在线管理数据库的神器。5、测

下载

立即学习PHP免费学习笔记(深入)”;

struct header{int type;     // 消息类型int length;     // 消息长度}struct MSG_Q2R2DB_PAYRESULT{int serialno; int openid; char payitem[512];int billno; int zoneid;int providetype;  int coins; }调用的方法,另外需require两个php文件,一个是字节编码类,另外一个socket封装类,其实主要看字节编码类就可以了!

调用测试

public function index() {        $socketAddr = "127.0.0.1";            $socketPort = "10000";            try {                        $selfPath = dirname ( __FILE__ );            require ($selfPath . "/../Tool/Bytes.php");            $bytes = new Bytes ();                        $payitem = "sdfasdfasdfsdfsdfsdfsdfsdfsdf";            $serialno = 1;            $zoneid = 22;            $openid = "CFF47C448D4AA2069361567B6F8299C2";                        $billno = 1;            $providetype = 1;            $coins = 1;                        $headType = 10001;            $headLength = 56 + intval(strlen($payitem ));                        $headType = $bytes->integerToBytes ( intval ( $headType ) );            $headLength = $bytes->integerToBytes ( intval ( $headLength ) );            $serialno = $bytes->integerToBytes ( intval ( $serialno ) );            $zoneid = $bytes->integerToBytes ( intval ( $zoneid ) );            $openid = $bytes->getBytes( $openid  );            $payitem_len = $bytes->integerToBytes ( intval ( strlen($payitem) ) );            $payitem =  $bytes->getBytes($payitem);                        $billno = $bytes->integerToBytes ( intval ( $billno ) );            $providetype = $bytes->integerToBytes ( intval ( $providetype ) );            $coins = $bytes->integerToBytes ( intval ( $coins ) );                        $return_betys = array_merge ($headType , $headLength , $serialno , $zoneid , $openid,$payitem_len ,$payitem,$billno,$providetype,$coins);                        $msg = $bytes->toStr ($return_betys);            $strLen = strlen($msg);            $packet = pack("a{$strLen}", $msg);            $pckLen = strlen($packet);                        $socket = Socket::singleton ();            $socket->connect ( $socketAddr, $socketPort ); //连服务器                        $sockResult = $socket->sendRequest ( $packet); // 将包发送给服务器             sleep ( 3 );            $socket->disconnect (); //关闭链接        } catch ( Exception $e ) {            var_dump($e);            $this->log_error("pay order send to server".$e->getMessage());        }    }


热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

手把手实现数据传输编码
手把手实现数据传输编码

共1课时 | 757人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号