TP5.1.18+swoole实现聊天室
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实现聊天室相关推荐
- docker搭建swoole简易聊天室
docker搭建swoole的简易聊天室 首先pull镜像 docker pull docker.io/kong36088/nginx-php7-swoole 创建容器 docker run --na ...
- 微信小程序 swoole简单聊天室
第一步在linux创建php即时通讯文件 <?php //服务器代码 //创建websocket 服务器 $ws = new swoole_websocket_server("0.0. ...
- php3.2搭建临时聊天系统,基于swoole搭建聊天室程序
1. 创建websocket服务器 swoole从1.7.9版本开始, 内置了websocket服务器功能,我们只需几行简单的PHP代码,就可以创建出一个异步非阻塞多进程的WebSocket服务器. ...
- 【第99题】JAVA高级技术-网络编程18(简易聊天室13:聊天室服务端)
回城传送–><JAVA筑基100例> 文章目录 零.前言 一.题目描述 二.解题思路 三.代码详解 多学一个知识点 四.推荐专栏 五.示例源码下载 零.前言 今天是学习 JAVA ...
- swoole 项目实战——实现简单聊天室
前言:了解了概念之后就应该练练手啦,不然就是语言的巨人,行动的矮子啦 代码仓库 实战 swoole[聊天室] 在线体验 准备工作 需要先看初识 swoole[上],了解基本的服务端 WebSocket ...
- 多人聊天功能代码php,基于swoole实现多人聊天室
本文实例为大家分享了swoole创建多人多房间聊天室的具体代码,供大家参考,具体内容如下 核心的swoole代码 基本的cs(client-sercer)结构不变,这里利用的是redis的哈希和set ...
- swoole 1.79 websocket 聊天室 基于swoole_server
基于 swoole 1.79 swoole_server 写的 websocket 网页聊天室,基本功能,以供参考 所需环境 php swoole 1.79 redis <a href=&quo ...
- 使用Swoole服务搭建简易聊天室
前言: 之前写过一篇关于swoole的安装搭建的文章.也测试了搭建TCP协议的服务.但是今天我要介绍的是WebSocket协议,WebSoket协议的出现,解决了http协议的很大的一个缺陷.那就是服 ...
- swoole+redis(websocket聊天室demo)
websocket是不同于http的另外一种网络通信协议,能够进行双向通信,基于此,可开发出各种实时通信产品,我简单做了个聊天室demo,顺便分享一下. PHP的swoole扩展,正如作者所说,是PH ...
- 可以发送图片文件的php聊天室,基于 Swoole 开发实时在线聊天室(十四):发送图片消息...
基于 Swoole 开发实时在线聊天室(十四):发送图片消息 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #1 2055 views 0 likes 0 collects 上篇教程我们演示 ...
最新文章
- Centos6.3修改源码遇到无法yum安装的问题
- Winform 进度条弹窗和任务控制
- php背景图片随页面大小改变,css背景图根据屏幕大小自动缩放
- 【强化学习】Policy Gradients代码注释版本
- PHP 逆转字符串与逆转句子
- 容器撑满占满整个高度,垂直居中等
- windows组件_如何关闭win7系统windows移动中心 电脑关闭windows移动中心方法【详解】...
- 【动态规划】区间dp: P1063能量项链
- 如何查看Windows8.1计算机体验指数评分
- Java 对字符以及字符数组的操作
- python自动化操作网页游戏_用Python脚本做一些网页游戏中力所能及的自动化任务...
- oppo系统android版本下载,oppo手机助手
- adb 截屏和录屏命令
- 条件格式实现ABC分析
- 每一个人都应该学习电脑编程,因为它会教你如何思考
- 基于51单片机实现计算器功能
- 转发:神了,Fly_by结构原来就这么回事儿!
- H3C_RIP_路由器_动态路由
- 互联网行业应届待遇十一档2014
- Java基础案例教程思维导图