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的代码 其他的都是没有什么逻辑的代码!

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

<?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'] ?? '';    //拿到客户端用户IDif (!$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' => '']);}
}

TP5.1.18+swoole实现聊天室相关推荐

  1. docker搭建swoole简易聊天室

    docker搭建swoole的简易聊天室 首先pull镜像 docker pull docker.io/kong36088/nginx-php7-swoole 创建容器 docker run --na ...

  2. 微信小程序 swoole简单聊天室

    第一步在linux创建php即时通讯文件 <?php //服务器代码 //创建websocket 服务器 $ws = new swoole_websocket_server("0.0. ...

  3. php3.2搭建临时聊天系统,基于swoole搭建聊天室程序

    1. 创建websocket服务器 swoole从1.7.9版本开始, 内置了websocket服务器功能,我们只需几行简单的PHP代码,就可以创建出一个异步非阻塞多进程的WebSocket服务器. ...

  4. 【第99题】JAVA高级技术-网络编程18(简易聊天室13:聊天室服务端)

    回城传送–><JAVA筑基100例> 文章目录 零.前言 一.题目描述 二.解题思路 三.代码详解 多学一个知识点 四.推荐专栏 五.示例源码下载 零.前言 ​ 今天是学习 JAVA ...

  5. swoole 项目实战——实现简单聊天室

    前言:了解了概念之后就应该练练手啦,不然就是语言的巨人,行动的矮子啦 代码仓库 实战 swoole[聊天室] 在线体验 准备工作 需要先看初识 swoole[上],了解基本的服务端 WebSocket ...

  6. 多人聊天功能代码php,基于swoole实现多人聊天室

    本文实例为大家分享了swoole创建多人多房间聊天室的具体代码,供大家参考,具体内容如下 核心的swoole代码 基本的cs(client-sercer)结构不变,这里利用的是redis的哈希和set ...

  7. swoole 1.79 websocket 聊天室 基于swoole_server

    基于 swoole 1.79 swoole_server 写的 websocket 网页聊天室,基本功能,以供参考 所需环境 php swoole 1.79 redis <a href=&quo ...

  8. 使用Swoole服务搭建简易聊天室

    前言: 之前写过一篇关于swoole的安装搭建的文章.也测试了搭建TCP协议的服务.但是今天我要介绍的是WebSocket协议,WebSoket协议的出现,解决了http协议的很大的一个缺陷.那就是服 ...

  9. swoole+redis(websocket聊天室demo)

    websocket是不同于http的另外一种网络通信协议,能够进行双向通信,基于此,可开发出各种实时通信产品,我简单做了个聊天室demo,顺便分享一下. PHP的swoole扩展,正如作者所说,是PH ...

  10. 可以发送图片文件的php聊天室,基于 Swoole 开发实时在线聊天室(十四):发送图片消息...

    基于 Swoole 开发实时在线聊天室(十四):发送图片消息 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #1 2055 views 0 likes 0 collects 上篇教程我们演示 ...

最新文章

  1. Centos6.3修改源码遇到无法yum安装的问题
  2. Winform 进度条弹窗和任务控制
  3. php背景图片随页面大小改变,css背景图根据屏幕大小自动缩放
  4. 【强化学习】Policy Gradients代码注释版本
  5. PHP 逆转字符串与逆转句子
  6. 容器撑满占满整个高度,垂直居中等
  7. windows组件_如何关闭win7系统windows移动中心 电脑关闭windows移动中心方法【详解】...
  8. 【动态规划】区间dp: P1063能量项链
  9. 如何查看Windows8.1计算机体验指数评分
  10. Java 对字符以及字符数组的操作
  11. python自动化操作网页游戏_用Python脚本做一些网页游戏中力所能及的自动化任务...
  12. oppo系统android版本下载,oppo手机助手
  13. adb 截屏和录屏命令
  14. 条件格式实现ABC分析
  15. 每一个人都应该学习电脑编程,因为它会教你如何思考
  16. 基于51单片机实现计算器功能
  17. 转发:神了,Fly_by结构原来就这么回事儿!
  18. H3C_RIP_路由器_动态路由
  19. 互联网行业应届待遇十一档2014
  20. Java基础案例教程思维导图

热门文章

  1. 读卡器与IC/ID卡的基本认识
  2. [漏洞分析] CVE-2021-3560 PolKit条件竞争本地提权分析
  3. Git GUI中文乱码问题解决方法
  4. CAD中如何等分线段?CAD等分线段教程
  5. DES算法的加解密原理(详细算法+样例Demo)
  6. 前端多语言开发,如何中英文切换
  7. linux如何使用磁盘阵列卡,Linux的RAID磁盘阵列与阵列卡
  8. k8s core-dns 解析域名异常
  9. Tempo超进化,提效降本好帮手,工时管理小当家 Timewise
  10. 经历没有亮点可讲?你需要做份“详历”