Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TP5.1.18+swoole实现聊天室

TP5.1.18+swoole实现聊天室

作者头像
李昊天
发布于 2019-05-26 02:50:19
发布于 2019-05-26 02:50:19
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

TP是最新版本的; 大概实现的有,用户注册,注册完毕之后跳转到登录页面; 登录之后生成身份令牌(token)存到Redis; 在聊天界面没有任何ajax请求,只要在握手的时候有一个http请求,实在是搞不懂一些人,在聊天界面发布消息用ajax去发布,

做了一些处理,一个浏览器里面只能用一个账号,所以测试的时候必须用两个浏览器

之后跳转到聊天界面,然后建立WebSocket握手,在握手的同时携带toekn,以及对方的ID(朋友的ID) ;

后台服务器在OnOpen的时候做一系列的操作,例如(检测token,检测朋友的ID,将自己的ID和fd更新到数据表,fd绑定uid等..); 这些检测都通过之后获取聊天记录,为了效率是拉取和朋友的15条聊天记录;

在OnMessage中获取了发送的数据! 在发送之后检测对方是否在线,如果不在线就不用发送给对方,如果对方在线就将信息push给他!

心跳检测: 每5秒检测一次,如果在100秒没有任何操作将断开连接,断开连接的同时将数据库中的fd清空!

代码很简单,,,但是有个别的问题没有解决,比如在线统计(connections)

下面贴上Socket_Server.php的代码 其他的都是没有什么逻辑的代码!

完整的等之后写完了再发出来吧,大家共同进步!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
/**
 * User: 李昊天
 * Date: 18/7/03
 * Time: 上午4:19
 * Email: haotian0607@gmail.com
 */

namespace app\index\controller;

use app\index\model\Message;
use app\index\model\User as UserModel;
use app\tool\Tool;
use think\facade\Cache;
use swoole_websocket_server;

class Swoole extends \think\swoole\Server
{
    protected static $token;
    protected $host = '127.0.0.1';
    protected $port = 9508;
    protected $serverType = 'socket';
    protected static $uid = '';
    protected $option = [
        'worker_num' => 4, // 设置启动的Worker进程数 
        'daemonize' => false, //守护进程化。
        'backlog' => 128, //Listen队列长度,
        'dispatch_mode' => 2,
        'heartbeat_check_interval' => 5,
        'heartbeat_idle_time' => 100,
    ];


    public function onOpen(swoole_websocket_server $server, \swoole_http_request $req)
    {
        $fd = $req->fd;
        $token = $req->get['token'] ?? '';    //拿到客户端用户ID
        if (!$token) {
            $server->push($fd, Tool::showAjax(['status' => 3, 'message' => '请先登录!']));
            $server->close($fd);
            return;
        }

        $userData = Cache::get($token);
        if (!$userData) {
            $server->push($fd, Tool::showAjax(['status' => 2, 'message' => '用户身份无效,请重新登录!']));
            $server->close($fd);
            return;
        }

        self::$uid = $req->get['friendId'];
        if (self::$uid == $userData['uid']) {
            $server->push($fd, Tool::showAjax(['status' => 2, 'message' => '非法操作!']));
            $server->close($fd);
        }
        $server->bind($fd, $userData['uid']);
        $messages = Message::getMessage($userData['uid']);

        (new UserModel())->where('id', $userData['uid'])->update(['fd' => $req->fd]);
        $arr = $messages->toArray();
        sort($arr);

        $server->push($fd, Tool::showAjax(['status' => 1, 'message' => 'success', 'data' => $arr]));
    }

    public function onMessage(swoole_websocket_server $server, \swoole_websocket_frame $frame)
    {

        $message = $frame->data;
        if (empty($message)) return;
        $data = [
            'uid1' => $server->getClientInfo($frame->fd)['uid'],
            'uid2' => self::$uid,
            'message' => htmlspecialchars($message),
            'send_uid' => $server->getClientInfo($frame->fd)['uid']
        ];
        try {
            (new Message())->save($data);
        } catch (\Exception $e) {
            $server->push($frame->fd, Tool::showAjax(['status' => '2', 'message' => '发送数据失败!']));
        }

        $messages = Message::getMessage($server->getClientInfo($frame->fd)['uid']);
        $friendData = UserModel::geUserDataFd(self::$uid);
        $arr = $messages->toArray();
        sort($arr);


        if ($friendData) {
            $server->push($friendData, Tool::showAjax(['status' => 1, 'message' => 'success', 'data' => $arr]));
        }
        $server->push($frame->fd, Tool::showAjax(['status' => 1, 'message' => 'success', 'data' => $arr]));
    }

    function onClose(\swoole_server $server, int $fd, int $reactorId)
    {
        (new UserModel())->where('fd', $fd)->update(['fd' => '']);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Swoole跟thinkphp5结合开发WebSocket在线聊天通讯系统教程
这里的路径,是因为我绑定了home模块为默认模块,tp5默认情况是:php public/index.php index/Websocket/start)
猿哥
2019/03/29
1.9K0
Swoole跟thinkphp5结合开发WebSocket在线聊天通讯系统教程
​语音聊天程序源码——简单的聊天室搭建
安装好swoole后开始搭建 前段 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>聊天室</title> </head> <style> #set_name{ margin: auto; text-align: center; } </style> <body> <h3 style="text-align: center">亮亮的聊天室</h3> <d
nicai123
2019/10/07
3.8K0
​语音聊天程序源码——简单的聊天室搭建
PHP进阶之利用Swoole实现一个简单的WebSocket多人聊天室
其实这个聊天室的DEMO我早都发到Github上了,之前学习Swoole的时候就已经练过手了
沈唁
2018/09/18
3.6K0
PHP进阶之利用Swoole实现一个简单的WebSocket多人聊天室
用php+swoole编写一个简易聊天室,麻雀虽小却五脏俱全
使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。使用 PHP + Swoole 作为网络通信框架,可以使企业 IT 研发团队的效率大大提升,更加专注于开发创新产品。
程序猿的栖息地
2022/04/29
5010
socket编程之swoole开发框架
Swoole:面向生产环境的 PHP 异步网络通信引擎,使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。
老雷PHP全栈开发
2020/07/02
4520
Swoole 源码分析之 WebSocket 模块
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时数据传输。
码农先森
2024/06/26
1160
用swoole+websocket和redis实现web一对一聊天
Redis 实现每个连接websocket的服务都唯一绑定一个用户。通过 用户账号 = websocket fd 存到redis中。
程序猿的栖息地
2022/04/29
5370
用swoole+websocket和redis实现web一对一聊天
玩了一下websocket 原
nginx配置 location /wsapp/ { proxy_pass http://0.0.0.0:9501; proxy_htt
domain0
2018/08/02
2160
Swoole - webSocket客服IM消息系统方案实践篇
基于Swoole的websocket服务,再之前的消息系统系列的第4篇,实现了更加复杂的业务场景,是对消息推送的完善和优化,代码本身就是不断自我优化的过程。
stark张宇
2023/03/12
4.1K0
Swoole - webSocket客服IM消息系统方案实践篇
easyswoole实现在线聊天室功能
一 : 安装easyswoole,可参考http://www.php20.cn/article/82
仙士可
2019/12/19
2.1K0
easyswoole实现在线聊天室功能
2018年swoole实战2-异步非阻塞投递任务服务端客户端启动服务代码解析
项目中,总有一些场景会触发耗时比较长的行为。如:用户更新了文章,触发推送消息给此用户的所有粉丝,如果一个用户有10000个粉丝,用同步阻塞的方式来实现,肯定会被吐槽死,这种场景必须用非阻塞的方式实现,让用户无感知。
章鱼喵
2018/08/02
6700
2018年swoole实战2-异步非阻塞投递任务服务端客户端启动服务代码解析
视频 | 一步步教你操作websocket通知案例
websocket通知流程 解析 我们不能保证用户B和用户A都处于连接状态,但是通常情况下,用户B至少是连接状态,用户A不一定跟server保持连接; 任一用户都不止对应一个客户端。换言之,用户A和用户B都可能打开了多个tab页,对于一个tab页,就会有一个独立的fd标识,我们这里认为任一用户只有最新的fd有效,或者你可以认为用户所有的tab页的连接都有效; 因为没有用户系统,我们以get传递的参数uid为标识,uid=100视为用户A,uid=101视为用户B; 我们模拟的tab页包将会包含一个输入内
码农编程进阶笔记
2021/07/20
4900
swoole框架-swoft实现程圣母与云天明对话功能启动ws服务创建http服务的聊天控制器创建视图文件创建ws控制器结果演示
当万有引力号启动广播按钮,向宇宙发送三体星的坐标时,地球已经失去了任何侵略价值。三体人将所有在地球的资源全部撤走,但在临别时,安排了程圣母与云天明的远程会话。接下来,我们用swoft来实现他们两人的聊天功能。
章鱼喵
2018/08/02
7250
swoole框架-swoft实现程圣母与云天明对话功能启动ws服务创建http服务的聊天控制器创建视图文件创建ws控制器结果演示
利用Swoole实现服务器通过WebSocket主动向浏览器推送数据
WebSocket 协议是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信,允许服务器主动发送信息给客户端。
魏杰
2022/12/23
9520
swoole基础-WebSocket服务
一,WebSocket服务器创建 <?php // +---------------------------------------------------------------------- //
程序猿的栖息地
2022/04/29
4620
swoole基础-WebSocket服务
Swoole v4.7 版本新特性预览之 onDisconnect 事件回调
在之前的版本中可能有这样一种情况,在 WebSocket 服务器中无法在 close 事件回调中区分该 fd 是否为 WebSocket 连接,例如以下代码:
沈唁
2021/06/25
5780
php docker web终端的折腾 原
#php是天下最好的语言,没有之一。 我非常喜欢php,我听过一个高手的讲座,讲php的编译原理,发现如果就php语言开发而言的确技术上有高低之分。一比较才发现自己差了十万八千里,自己不努力是不行的。好了不多说了,我来说说今天我分享的话题。 ##背景 2015年,我开始接触docker,那个时候发现一个管理平台shipyard,shipyard中有一个可以直接在浏览器上操作的web终端很吸引我,我想自己实现这样的一个服务,我翻看了其中的技术细节,发现有一个shipyard/controller/api/hijack.go中一堆的操作,当我开始用php模拟来写的时候,我发现我对php的认识还处于低级阶段,看起来很一个很艰难的工作。
domain0
2018/08/01
7370
php docker  web终端的折腾
                                                                            原
PHP-swoole搭建websocket服务
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
cwl_java
2022/11/30
9240
PHP-swoole搭建websocket服务
swoole的task模块 应用?
如webim中发广播,发送邮件等,把这些任务丢给task进程之后,worker进程可以继续处理新的数据请求,任务完成后会异步通知worker进程告诉它此任务已经完成。 此外利用task还可以实现PHP的数据库连接池,异步队列等。
友儿
2022/09/11
2030
Swoole - webSocket消息服务系统代码设计篇
已经Swoole系列的第二篇知识点了,前一篇主要的针对处理的是方案设计,这一篇主要是代码实现的内容,主要介绍高性能的原因已经实现,编程框架使用EasySwoole。
stark张宇
2023/03/03
9010
推荐阅读
相关推荐
Swoole跟thinkphp5结合开发WebSocket在线聊天通讯系统教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验