首页 > 开发 > PHP > 正文

php基于websocket搭建简易聊天室实践

2024-05-04 22:51:41
字体:
来源:转载
供稿:网友

本文实例讲述了php基于websocket搭建简易聊天室实践。分享给大家供大家参考。具体如下:
1、前言

公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室。于是搜集各种资料看文档、找实例自己也写了个简单的聊天室。

http连接分为短连接和长连接。短连接一般可以用ajax实现,长连接就是websocket。短连接实现起来比较简单,但是太过于消耗资源。websocket高效不过兼容存在点问题。websocket是html5的资源

2、前端

前端实现websocket很简单直接

//连接websocketvar ws = new WebSocket("ws://127.0.0.1:8000");//成功连接websoc的时候ws.onopen = function(){}//成功获取服务端输出的消息ws.onmessage = function(e){}//连接错误的时候ws.onerror = function(){}//向服务端发送数据ws.send();

3、后台

websocket的难点主要在后台

3.1websocket连接过程
websocket 通信图解 这是一个简易的客户端和服务端的通信图解,php主要就做的就是接受加密key  并返回 其中完成套接字的创建和握手操作

下图是一张详细的服务端处理websocket的流程图

3.2 代码实践

服务端做的流程大致是:

    挂起一个socket套接字进程等待连接 有socket连接之后遍历套接字数组 没有握手的进行握手操作,如果已经握手则接收数据解析并写入缓冲区进行输出

下面是示例代码(我写的是一个类所以代码是根据函数分段的),文底给出github地址以及自己遇到的一些坑
 1、首先是创建套接字
 

//建立套接字    public function createSocket($address,$port)    {      //创建一个套接字      $socket= socket_create(AF_INET, SOCK_STREAM, SOL_TCP);      //设置套接字选项      socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);      //绑定IP地址和端口      socket_bind($socket,$address,$port);      //监听套接字      socket_listen($socket);      return $socket;    }

2、将套接字放入数组

public function __construct($address,$port)    {      //建立套接字      $this->soc=$this->createSocket($address,$port);      $this->socs=array($this->soc);    }

3、挂起进程遍历套接字数组,主要操作都是在这里面完成的

public function run(){      //挂起进程      while(true){        $arr=$this->socs;        $write=$except=NULL;        //接收套接字数字 监听他们的状态        socket_select($arr,$write,$except, NULL);        //遍历套接字数组        foreach($arr as $k=>$v){          //如果是新建立的套接字返回一个有效的 套接字资源          if($this->soc == $v){            $client=socket_accept($this->soc);            if($client <0){              echo "socket_accept() failed";            }else{              // array_push($this->socs,$client);              // unset($this[]);              //将有效的套接字资源放到套接字数组              $this->socs[]=$client;            }          }else{            //从已连接的socket接收数据 返回的是从socket中接收的字节数            $byte=socket_recv($v, $buff,20480, 0);            //如果接收的字节是0            if($byte<7)              continue;            //判断有没有握手没有握手则进行握手,如果握手了 则进行处理            if(!$this->hand[(int)$client]){              //进行握手操作              $this->hands($client,$buff,$v);            }else{              //处理数据操作              $mess=$this->decodeData($buff);                //发送数据              $this->send($mess,$v);            }          }        }      }    }            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表