需求分析

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

核心技术

html5的websocket,php的swoole扩展http://wiki.swoole.com/

数据表

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端代码

<?phpclass Server
{private $serv;private $conn = null;private static $fd = null;public function __construct(){$this->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

客户端代码

<!DOCTYPE html>
<html>
<head><title></title><meta charset="UTF-8"><script src="jquery-2.1.1.min.js"></script><script src="jquery.json.js"></script><script type="text/javascript">var fid = 1; //发送者uidvar tid = 2; //接收者uidvar exampleSocket = new WebSocket("ws://192.168.1.17:9502");$(function () {exampleSocket.onopen = function (event) {console.log(event.data);initData(); //加载历史记录};exampleSocket.onmessage = function (event) {console.log(event.data);loadData($.parseJSON(event.data)); //导入消息记录,加载新的消息}})function sendMsg() {var pData = {content: document.getElementById('content').value,fid: fid,tid: tid,}if(pData.content == ''){alert("消息不能为空");return;}exampleSocket.send($.toJSON(pData)); //发送消息}function initData() {var pData = {fid: fid,tid: tid,}exampleSocket.send($.toJSON(pData)); //获取消息记录,绑定fd}function loadData(data) {for (var i = 0; i < data.length; i++) {var html = '<p>' + data[i].fid + '>' + data[i].tid + ':' + data[i].content + '</p>';$("#history").append(html);}}</script>
</head>
<body>
<div id="history" style="border: 1px solid #ccc; width: 100px; height: auto"></div>
<input type="text" id="content">
<button οnclick="sendMsg()">发送</button>
</body>
</html>

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

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

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

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

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

原网址:https://www.cnblogs.com/zenghansen/p/5084738.html

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

基于swoole的网页一对一实时聊天相关推荐

  1. websocket实现多用户一对一实时聊天

    在线聊天模实现 项目是基于node.js服务器搭建的简易双向通信网页,实现了实时更新在线人数以及用户间即时通讯的功能. 1.websocket连接创建 基于后台websocket地址创建简易的连接,并 ...

  2. 【详解】springboot 集成 websocket实现网页版实时聊天

    1.application.yml 配置文件 server:port: 8080spring:thymeleaf:prefix: classpath:/view/suffix: .htmlencodi ...

  3. 基于Android Classic Bluetooth的蓝牙聊天软件

    代码地址如下: http://www.demodashi.com/demo/12133.html BluetoothChat 基于Android Classic Bluetooth的蓝牙聊天软件,目前 ...

  4. 《 Python程序设计项目案例》— 用Python开发的基于TCP通讯协议的私人聊天室 (期末大作业、结课作业、课程设计、毕业设计)

    基于Python与TCP协议的私人聊天室(GUI交互界面,用户注册.用户登录.实时聊天,文件上传与下载) 用Python开发的基于TCP通讯协议的实时聊天通讯和文件共享应用 目录 基于Python与T ...

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

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

  6. 基于websocket的网页实时消息推送与在线聊天(上篇)

    文章目录 @[toc] 基于websocket的网页实时消息推送与在线聊天(上篇) "使用dwebsocket在django中实现websocket" websocket原理图 d ...

  7. 网页实时聊天之PHP如何实现websocket

    网页实时聊天之PHP如何实现websocket 一.总结 一句话总结: 应用 PHP 的 socket 函数库:PHP 的 socket 函数库跟 C 语言的 socket 函数非常类似 PHP 实现 ...

  8. websocket 西部数码php_网页实时聊天之PHP实现websocket

    前言 websocket 作为 HTML5 里一个新的特性一直很受人关注,因为它真的非常酷,打破了 http "请求-响应"的常规思维,实现了服务器向客户端主动推送消息,本文介绍如 ...

  9. 基于TCP的网络实时聊天室(socket通信案例)

    开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 五.聊 ...

最新文章

  1. Mysql连接数据库的操作
  2. 四十七、Ansible自动化入门
  3. v-show 与 v-if区别
  4. mysql修改字段 新增字段
  5. 【高危漏洞通告】Spring Framework 远程代码执行 (CVE-2022-22965)
  6. matlab使用load指令,科学网—matlab常用方法 - 陈超的博文
  7. 为什么华为a1路由器网速变慢_上网用的路由器晚上要不要关?1个月能耗多少电?答案很意外!...
  8. 教你如何保持Tuxera NTFS For Mac软件的更新
  9. 时区时钟插件html,日期、时间选择控件 - datetimepicker
  10. 大一c语言选择题库及答案,c语言选择题(大一c语言编程题库)
  11. wps下一步快捷键_WPS表格常用快捷键大全(非常全面)
  12. Python批量爬取堆糖图片
  13. 潘金莲——中国女性解放思想的先驱《其实我的心没走》
  14. ThreeJS FBXLoader 加载3D文件,材质消失,已解决
  15. couldnotfindartifactcom.orcale:ojdbc6:pom:11.2.0.1.0innexus-aliyun
  16. C++自制游戏《Fighter》
  17. faded怎么用计算机弹,superpads教程fade怎么弹 superpads faded谱子一览
  18. linux 安装pxssh_pexpect的讲解
  19. 基于51单片机的汇编程序:六位8段数码管(共阴极)动态显示“123456”
  20. NASA成立寻找外星人小组,三全水饺回应猪瘟,微波炉+葡萄=爆炸,94年故宫首次晚间开放,这就是今天的大新闻!...

热门文章

  1. NASM汇编语言与计算机系统10-中断向量表0号中断(cli/sti/iret/hlt)
  2. java和scala代码可以混合编写吗_IDEA实现Java与Scala代码混合开发
  3. 基于leaflet-velocity的二维动态风场展示
  4. HYSBZ 2565 最长双回文串
  5. 科学记数法在c语言中表示方法,c/c++开发分享在C语言中阅读科学记数法
  6. oc-分类(catgory)的概念及使用
  7. 【微信小程序】随机点名系统(点击开始滚动名字点击结束按钮结束滚动)
  8. C语言编程实现书号查询功能,图书图书管理系统——查询模块的设计与实现(C语言).doc...
  9. 001:这里是一个关于易康分割+分类的记录
  10. 《流浪地球 2》 Deepfake 小试牛刀,45+ 吴京「被」年轻,变身 21 岁小鲜肉