博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于swoole的网页一对一实时聊天
阅读量:5290 次
发布时间:2019-06-14

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

需求分析

网站上实现一对一即时沟通,能查看聊天记录以及离线留言,新消息提醒。

核心技术

html5的websocket,php的swoole扩展

数据表

CREATE TABLE `msg` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `content` varchar(255) NOT NULL DEFAULT '' COMMENT '内容',  `tid` int(11) NOT NULL DEFAULT '0' COMMENT '接收用户id',  `fid` int(11) NOT NULL DEFAULT '0' COMMENT '发送用户id',  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COMMENT='消息表';
CREATE TABLE `fd` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `uid` int(11) NOT NULL DEFAULT '0' COMMENT '用户id',  `fd` int(11) NOT NULL DEFAULT '0' COMMENT '绑定id',  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='用户绑定表';

Server端代码

initDb(); $this->serv = new swoole_websocket_server("0.0.0.0", 9502); $this->serv->set(array( 'worker_num' => 8, 'daemonize' => false, 'max_request' => 10000, 'dispatch_mode' => 2, 'debug_mode' => 1 )); $this->serv->on('Open', array($this, 'onOpen')); $this->serv->on('Message', array($this, 'onMessage')); $this->serv->on('Close', array($this, 'onClose')); $this->serv->start(); } function onOpen($server, $req) { // $server->push($req->fd, json_encode(33)); } public function onMessage($server, $frame) { //$server->push($frame->fd, json_encode(["hello", "world"])); $pData = json_decode($frame->data); $data = array(); if (isset($pData->content)) { $tfd = $this->getFd($pData->tid); //获取绑定的fd $data = $this->add($pData->fid, $pData->tid, $pData->content); //保存消息 $server->push($tfd, json_encode($data)); //推送到接收者 } else { $this->unBind(null,$pData->fid); //首次接入,清除绑定数据 if ($this->bind($pData->fid, $frame->fd)) { //绑定fd $data = $this->loadHistory($pData->fid, $pData->tid); //加载历史记录 } else { $data = array("content" => "无法绑定fd"); } } $server->push($frame->fd, json_encode($data)); //推送到发送者 } public function onClose($server, $fd) { $this->unBind($fd); echo "connection close: " . $fd; } /*******************/ function initDb() { $conn = mysqli_connect("192.168.1.122", "root", "a123456"); if (!$conn) { die('Could not connect: ' . mysql_error()); } else { mysqli_select_db($conn, "test"); } $this->conn = $conn; } public function add($fid, $tid, $content) { $sql = "insert into msg (fid,tid,content) values ($fid,$tid,'$content')"; if ($this->conn->query($sql)) { $id = $this->conn->insert_id; $data = $this->loadHistory($fid, $tid, $id); return $data; } } public function bind($uid, $fd) { $sql = "insert into fd (uid,fd) values ($uid,$fd)"; if ($this->conn->query($sql)) { return true; } } public function getFd($uid) { $sql = "select * from fd where uid=$uid limit 1"; $row = ""; if ($query = $this->conn->query($sql)) { $data = mysqli_fetch_assoc($query); $row = $data['fd']; } return $row; } public function unBind($fd, $uid = null) { if ($uid) { $sql = "delete from fd where uid=$uid"; } else { $sql = "delete from fd where fd=$fd"; } if ($this->conn->query($sql)) { return true; } } public function loadHistory($fid, $tid, $id = null) { $and = $id ? " and id=$id" : ''; $sql = "select * from msg where ((fid=$fid and tid = $tid) or (tid=$fid and fid = $tid))" . $and; $data = []; if ($query = $this->conn->query($sql)) { while ($row = mysqli_fetch_assoc($query)) { $data[] = $row; } } return $data; }}// 启动服务器$server = new Server();

备注:swoole_websocket_server是基于tcp的长连接,仅支持cli模式运行。

启动服务器

php Server.php

客户端代码

        

 

ps1:再复制一份客户端,修改一下发送者你接收者的uid,即可进行模拟实时聊天。

ps2:此代码已经实现了加载历史记录的功能

ps3:若要增加新消息提醒功能,msg还需增加一个已读标示,然后推送给接收者的时候 

if($server->push($tfd, json_encode($data))){      //标记已读  }

ps4:然后没有标记已读的消息,就是新消息提醒。

 

原网址:

转载于:https://www.cnblogs.com/Json159/p/11291657.html

你可能感兴趣的文章
全文检索技术---solr
查看>>
动态内存分配(Dynamic memory allocation)
查看>>
Java学习 第三章 java基础(一)
查看>>
C#网络编程数据传输中封装数据帧头的方法
查看>>
第一份offer
查看>>
RNN Train和Test Mismatch
查看>>
.net下各个数据类型所占用的字节
查看>>
“请求的操作无法在使用用户映射区域打开的文件上执行”问题处理
查看>>
微信公众平台接口API
查看>>
hdu 4493 Tutor
查看>>
MySQL--用户管理 pymysql 索引
查看>>
ListView onItemClick(AdapterView<?> parent, View view, int position, long id)参数详解
查看>>
解决RSA加密中,System.Security.Cryptography.CryptographicException: 系统找不到指定的文件...
查看>>
生产,消费者改进
查看>>
Python Twisted、Reactor
查看>>
easyui源码翻译1.32--Combo(自定义下拉框)
查看>>
C++11中function和bind的用法示例
查看>>
GRUB、MBR名词解释
查看>>
代理模式之动态代理
查看>>
getElementsByTagName
查看>>