博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP SOCKE实现聊天系统
阅读量:5256 次
发布时间:2019-06-14

本文共 3106 字,大约阅读时间需要 10 分钟。

费话不多讲,具体看代码

 1.服务端实现

class Ws{        private $host = '127.0.0.1';    private $port = 8080;    private $maxuser = 10;    private $socket;    public $accept = [];    private $isHand = [];    private $cycle = [];    public function __construct($host,$port,$maxuser)    {        $this->host = $host;        $this->port = $port;        $this->maxuser = $maxuser;    }        public  function start()    {        // 创建一个Socket        $this->socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);         //允许使用本地地址                socket_set_option($this->socket,SOL_SOCKET,SO_REUSEADDR,TRUE);        // 绑定地址和端口        socket_bind($this->socket,$this->host,$this->port);        //侦听        socket_listen($this->socket,$this->maxuser);        while(True){            $this->cycle = $this->accept;            $this->cycle[] = $this->socket;            //阻塞用,有新连接时才会结束            socket_select($this->cycle, $write, $except, null);            //轮询            foreach($this->cycle as $key =>$v){                                if($v === $this->socket){                    //当接受一个Socket不成功时,继续下一个                    if(($accept = socket_accept($v))<0){                        continue;                    }                    //添加到循环池                    $this->add_accept($accept);                    continue;                }                                // 获得当前连接健值                 $index = array_search($v,$this->accept);                                if($index === null){                    continue;                }                                // 接受客户端数据                if( !@socket_recv($v,$data,1024,0) || !$data){                                        $this->close($v);                    continue;                }                                // 握手并发送用户连接数                if(!$this->isHand[$index]){                    $this->upgrade($v,$data,$index);                    call_user_func_array('user_add_callback',array($this));                    continue;                }                $data = $this->decode($data);                // 发送数据                call_user_func_array('send_callback', array($data, $index, $this));            }                sleep(1);            }                            }

回调

function send_callback($data, $index, $ws) {    $data = json_encode(array(                        'text' => $data,                        'user' => $index,                        ));    send_to_all($data, 'text', $ws);}function send_to_all($data, $type, $ws){    $res = array(            'msg' => $data,            'type' => $type,            );    $res = json_encode($res);    $res = $ws->frame($res);    print_r($ws->accept);    foreach ($ws->accept as $key => $value) {        socket_write($value, $res, strlen($res));    }}function close_callback($ws) {    $data = count($ws->accept);    send_to_all($data, 'num', $ws);}function user_add_callback($ws) {    $data = count($ws->accept);     send_to_all($data, 'num', $ws);}

 

 

 

 

客户端实现

websocket聊天室

在线人数

 

转载于:https://www.cnblogs.com/LXJ416/p/5656650.html

你可能感兴趣的文章
【识记】 域名备案
查看>>
STL uva 11991
查看>>
MY SQL的下载和安装
查看>>
自定义OffMeshLink跳跃曲线
查看>>
寄Android开发Gradle你需要知道的知识
查看>>
简述spring中常有的几种advice?
查看>>
学习Redux之分析Redux核心代码分析
查看>>
ABAP 创建和调用WebService
查看>>
C# 实例化顺序
查看>>
CSS水平垂直居中总结
查看>>
委托又给我惹麻烦了————记委托链的取消注册、获取返回值
查看>>
ps怎么把白色背景变透明
查看>>
gource 安装教程
查看>>
字符串转 Boolean 的正确方式
查看>>
给你的网站404页面加上“宝贝寻亲”公益页面
查看>>
整理推荐的CSS属性书写顺序
查看>>
协程, IO阻塞模型 和 IO非阻塞模型
查看>>
ServerSocket和Socket通信
查看>>
css & input type & search icon
查看>>
jQuery插件开发详细教程
查看>>