thinkphp6.0+swoole使用socket.io 进行通讯

和网上其他文档不同之处

1.我是按照大神的教程配置. 但是出现了问题,问题如下,post请求都显示格式错误
thinkphp6.0+swoole使用socket.io 进行通讯_第1张图片
2.修改之处,添加socket.io的参数,使其使用websocket模式通讯
在这里插入图片描述

基础环境

thinkphp6.0+swoole使用socket.io 进行通讯_第2张图片

生成socket.io的监听类

通过tp的命令快速生成监听类
php think make:listener WebsocketTest
php think make:listener RoomLeave
php think make:listener RoomJoin

thinkphp6.0+swoole使用socket.io 进行通讯_第3张图片

配置thinkphp-swoole

thinkphp6.0+swoole使用socket.io 进行通讯_第4张图片

编辑监听类

三个类都差不多,主要是编辑 handle 这个方法


declare (strict_types = 1);

namespace app\listener;

use think\Container;
use think\swoole\Websocket;

class WebsocketTest
{
    public $websocket = null;
    /**
     * 注入容器管理类,从容器中取出Websocket类,或者也可以直接注入Websocket类,
     */
    public function __construct(Container $container)
    {
        $this->websocket = $container->make(Websocket::class);
    }

    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        //回复客户端消息
        $this->websocket->emit("testcallback", ['fuck' => 1, 'test' => $event['asd']]);
        //不同于HTTP模式,这里可以进行多次发送
        $this->websocket->emit("testcallback", ['aaaaa' => 1, 'getdata' => $event['asd']]);
        //群发
        $this->websocket->to('roomtest')->emit("testcallback", ['guangbo' => 1, 'getdata' => $event['asd']]);
        //$event 为从客户端接收的数据
        $this->websocket->emit("testcallback", ['aaaaa' => 1, 'getdata' => $event['asd']]);
        //增加如下内容,表示进行对指定room进行群发
        $this->websocket->to('roomtest')->emit("testcallback", ['guangbo' => 1, 'getdata' => $event['asd']]);
        //指定客户端发送,假设已知某一客户端连接fd为1,则发送如何
        $this->websocket->setSender(1)->emit("testcallback", ['guangbo' => 1, 'getdata' => $event['asd']]);
        //获取当前客户端fd
        $this->websocket->getSender();
        //关闭指定客户端连接,参数为fd,默认为当前链接
        $this->websocket->close();
    }    
}

前端例子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.socket.io/socket.io-1.4.4.js"></script>
    <script src="https://code.jquery.com/jquery-1.11.1.js"></script>
</head>
<body>

<div>
    <div>
        返回内容:
    </div>
    <div style="width: 600px;height: 600px" id="content">

    </div>
</div>
<div>
    在控制台中执行 socket.emit("test",{"asd":"我是内容"})
</div>
<div>
    在控制台中执行 socket.emit("join",{"room":"roomtest"})  加入房间
</div>
<div>
    在控制台中执行 socket.emit("leave",{"room":["roomtest"]})  离开房间
</div>
<script>

    var  socket = io('http://xxx.com:9999',{transports: ['websocket']});
    //xxx.com 这个自己替换成自己的环境thinkphp-swoole 的端口或者是nginx的代理端口
    //transports: ['websocket'] 一定要这个,改为websocket链接
    //polling 这个不支持,轮询会导致请求变成http请求,post请求全部拒接掉
    socket.emit('test',{"asd":"asd"});
    //自定义msg事件,发送‘你好服务器’字符串向服务器
    socket.on('testcallback',(data)=>{
        //监听浏览器通过msg事件发送的信息
        console.log(data);//你好浏览器
    });
    socket.emit('join',{"asd":"asd"});
    socket.on('roomJoin',(data)=>{
        console.log(data);//你好浏览器
    })
</script>
</body>
</html>

你可能感兴趣的:(php)