-
如何利用swoole搭建一個簡易聊天室
<?php class Chat { const HOST = '0.0.0.0';//ip地址 0.0.0.0代表接受所有ip的访问 const PART = 82;//端口号 private $server = null;//单例存放websocket_server对象 private $connectList = [];//客户端的id集合 public function __construct() { //实例化swoole_websocket_server并存储在我们Chat类中的属性上,达到单例的设计 $this->server = new swoole_websocket_server(self::HOST, self::PART); //监听连接事件 $this->server->on('open', [$this, 'onOpen']); //监听接收消息事件 $this->server->on('message', [$this, 'onMessage']); //监听关闭事件 $this->server->on('close', [$this, 'onClose']); //设置允许访问静态文件 //$this->server->set([ // 'document_root' => '/grx/swoole/public',//这里传入静态文件的目录 // 'enable_static_handler' => true//允许访问静态文件 //]); //开启服务 $this->server->start(); } /** * 连接成功回调函数 * @param $server * @param $request */ public function onOpen($server, $request) { echo $request->fd . '连接了' . PHP_EOL;//打印到我们终端 $this->connectList[] = $request->fd;//将请求对象上的fd,也就是客户端的唯一标识,可以把它理解为客户端id,存入集合中 } /** * 接收到信息的回调函数 * @param $server * @param $frame */ public function onMessage($server, $frame) { echo $frame->fd . '来了,说:' . $frame->data . PHP_EOL;//打印到我们终端 //将这个用户的信息存入集合 foreach ($this->connectList as $fd) {//遍历客户端的集合,拿到每个在线的客户端id //将客户端发来的消息,推送给所有用户,也可以叫广播给所有在线客户端 $server->push($fd, json_encode(['no' => $frame->fd, 'msg' => $frame->data])); } } /** * 断开连接回调函数 * @param $server * @param $fd */ public function onClose($server, $fd) { echo $fd . '走了' . PHP_EOL;//打印到我们终端 $this->connectList = array_diff($this->connectList, [$fd]);//将断开了的客户端id,清除出集合 } } $obj = new Chat();
<!doctype html> <html> <head> <meta charset="utf-8"> <title>聊天室</title> <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> </head> <body> <textarea class="log" style="width: 100%; height: 500px;"> =======聊天室====== </textarea> <input type="button" value="连接" onClick="link()"> <input type="button" value="断开" onClick="dis()"> <input type="text" id="text"> <input type="button" value="发送" onClick="send()"> <script> function link(){ var url='ws://148.70.98.236:82'; socket=new WebSocket(url); socket.onopen=function(){log1('连接成功')} socket.onmessage=function(msg){log(msg.data);console.log(msg);} socket.onclose=function(){log1('断开连接')} } function dis(){ socket.close(); socket=null; } function log1(var1) { $('.log').append(var1+'\r\n'); } function log(var1){ var v=$.parseJSON(var1) $('.log').append('用户'+v['no']+'说:'+v['msg']+'\r\n'); } function send(){ var text=$('#text').val(); socket.send(text); } function send2(){ var json = JSON.stringify({'type':'php','msg':$('#text2').attr('value')}) socket.send(json); } </script> </body> </html>
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式