这次写的不依赖框架,不用nginx配置,只是依靠swoole的http_server和websocket,也是用的多端口监听,一边实现了web端的访问,一边实现了socket的发送;

文档在这里,可以多认真的读一下:https://wiki.swoole.com/wiki/page/525.html

好的,直接上码;

http.php

<?phpnamespace app\common;
require_once 'Predis.php';
require_once 'Task.php';
/**
*    socket面向对象的编译
*/
class Http
{CONST HOST='0.0.0.0';CONST PORT='9501';public $ws=null;public $http_server=null;public function __construct(){   $this->ws=new \swoole_websocket_server(self::HOST,self::PORT);$this->ws->set([//心跳检测// 'heartbeat_check_interval' => 5,// 'heartbeat_idle_time' => 10,]);//监听新端口$this->http_server=$this->ws->listen("0.0.0.0", 9502, SWOOLE_SOCK_TCP);//开启http模式$this->http_server->set(['open_http_protocol' => true,]);$this->ws->on("start", [$this, 'onStart']);$this->http_server->on("request", [$this, 'onRequest']);$this->ws->on('message',[$this,'onmessage']);$this->ws->on('close',[$this,'onclose']);$this->http_server->on('close',[$this,'oncloses']);$this->ws->start();}//监听数据接收事件public function onRequest($request, $response){//获取全部的参数$data=$request->get;//判断类型if ($data['type'] == 'start') {//开始拍卖//组装数据$arr['number']=count(Predis::getInstance()->hgetall($data['room_id']))-1;$arr['type']="start";self::push_room($data['room_id'],$arr);$response->end(json_encode(['code'=>200,'message'=>"推送成功",'data'=>null]));}elseif ($data['type'] == 'change') {//出价成功//组装数据$arr['name']=$data['name'];$arr['price']=$data['price'];$arr['type']="change";self::push_room($data['room_id'],$arr);$response->end(json_encode(['code'=>200,'message'=>"推送成功",'data'=>null]));}elseif ($data['type'] == 'end') {//拍卖结束$arr['name']=$data['name'];$arr['price']=$data['price'];$arr['type']="end";self::push_room($data['room_id'],$arr);//删除对应的房间Predis::getInstance()->del($data['room_id']);Predis::getInstance()->srem('group',$data['room_id']);$response->end(json_encode(['code'=>200,'message'=>"推送成功",'data'=>null]));}}/***   $room_id    当前房间id    *   $arr    组装数据*/public function push_room($room_id,$arr){//获取在线用户的fd$push_arr=Predis::getInstance()->hvals($room_id);//推送foreach ($push_arr as $v) {$this->ws->push($v, json_encode($arr));}}/*** 设置进程名,为后续平滑重启进程* @param $server*/public function onStart($server) {swoole_set_process_name("live_master");}      /**监听接收事件的回调*/public function onmessage($server, $frame){//在接收数据的时候进行推送$data=json_decode($frame->data,true);//加入分组Predis::getInstance()->hset($data['room_id'],$data['uid'],$frame->fd);//加入组集合Predis::getInstance()->sadd('group',$data['room_id']);//组装数据$arr['name']=$data['name'];$arr['type']="join";$arr['number']=count(Predis::getInstance()->hgetall($data['room_id']));//推送self::push_room($data['room_id'],$arr);}/**监听关闭事件的回调*/public function onclose($ser, $fd){print_r("你好,我的{$fd}\n");//退出并删除多余的分组fd$group=Predis::getInstance()->sMembers('group');foreach ($group as $v) {$fangjian=Predis::getInstance()->hgetall($v);foreach ($fangjian as $k => $vv) {if ($fd == $vv) {Predis::getInstance()->hdel($v,$k);}}}}public function oncloses($ser, $fd){print_r("这个是http_server{$fd}\n");}
}new Http();

用户打开页面后我直接用socket的Onpen事件,所以这里就不用再写用户加入的判断逻辑了

index.html

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>我是来测试的</title>
</head>
<body>
<h1>0</h1>
<script type="text/javascript">//连接服务var wsServer = 'wss://code.77wx.cn:9503';//实例化var websocket = new WebSocket(wsServer);//监听开启事件(只负责监听,没有实际的开启作用)websocket.onopen = function (evt) {var data={room_id:1,uid:'a',name:'夜袭寡妇村',};websocket.send(JSON.stringify(data));};function log(msg){console.log(msg);}//消息websocket.onmessage = function (evt) {//监听消息后,直接给服务器传递消息var e = JSON.parse(evt.data);switch(e.type){//进入房间case "join":log("用户进入房间,当前人数:"+e.num);alert("用户 "+e.name+" 进入房间,当前人数:"+e.number);break;//开始拍卖case "start":log('拍卖开始,当前有'+e.number+'人和您同时竞拍!');alert('拍卖开始,当前有'+e.number+'人和您同时竞拍!');break;//用户出价case "change":log("用户"+e.name+"出价:"+e.price+"元");alert("用户 "+e.name+" 出价:"+e.price+"元");break; //活动结束case "end":alert("用户 "+e.name+" 以:"+e.price+"元,获得竞拍大奖");log("用户 "+e.name+" 以:"+e.price+"元,获得竞拍大奖");break;}console.log('来自server的最新消息: ' + evt.data);};//关闭事件websocket.onclose = function (evt) {console.log("我关闭了html");};//报错websocket.onerror = function (evt, e) {console.log('Error occured: ' + evt.data);};
</script>
</body>
</html>

swoole创建多人多房间聊天室二相关推荐

  1. swoole创建多人多房间聊天室三

            在上一个例子中,实现了多房间的多人聊天,这次这个聊天室有所改变,需要做到类似微信或QQ那样(app,pc同时使用),多个端口登入,保证数据的同时传递,考虑了很久,最好的办法就是在之前代 ...

  2. swoole创建多人多房间聊天室一

    核心的swoole代码         基本的cs(client-sercer)结构不变,这里利用的是redis的哈希和set来储存和分组;从而达到了分组,统计,定时推送等功能;最后利用onclose ...

  3. Java Socket通信实现多人多端网络画板聊天室

    老规矩,先上实现的效果展示! Java Socket通信实现多人多端网络画板聊天室 本文介绍了一个基于Socket实现网络画板聊天室的完整过程,聊天室具备多人文本对话.同步绘图等功能. 初尝试 Soc ...

  4. IM即时通信多房间聊天室仿微信聊天(二)

    IM即时通信多房间聊天室仿微信聊天(服务器自定义处理客户端消息) 在IM即时通信多房间聊天室仿微信聊天(一)中我们已经搭建了基本的通信架构,接下来重点就是如何在自己的后台接收并处理客户端用户的消息了 ...

  5. IM即时通信多房间聊天室仿微信聊天(四)

    聊天记录的保存和展示 IM即时通信多房间聊天室仿微信聊天(一) IM即时通信多房间聊天室仿微信聊天(二) IM即时通信多房间聊天室仿微信聊天(三) 聊天消息的保存我们直接在服务端接收到客户端发送的消息 ...

  6. php 用swoole创建一个简单的多房间聊天室

    前端代码: <!doctype html> <html lang="en"> <head><meta charset="UTF- ...

  7. python多台电脑聊天室_python的多人多功能聊天室

    从Beginning Python: From Novice to Professional, Second Edition 中的一个chatroom项目中拿出来的.那里的聊天室,只有一个单间聊天室功 ...

  8. php+Ajax+Mysql 创建简单的一对一在线聊天室

    最近在学习Ajax异步刷新的时候么突然想到能不能这个技术做点什么事情,网上百度了一下,发现好多人用这个写在线聊天,自己也想试试.不过,做完之后发现这种方法写的聊天室,真的很耗资源,不过就当练手学习吧. ...

  9. [Unity][VIVOX]多人语音文本聊天室

    多平台 多人 语音.文本 聊天室 的方案. 参考资料1的链接进入,注册 账号,创建 下载 VIVOX 品牌的 矢量 图标 选择引擎, 支持的 平台 创建 项目完成,会获得 API相关内容,以及 右下角 ...

最新文章

  1. Floyd算法实验报告
  2. Android弹出框的学习
  3. python代码示例图形-Python使用matplotlib绘制三维图形示例
  4. java classifier_Java 朴素贝叶斯分类器、SVM(5行代码)实现乳腺癌分类
  5. 加投35000瓶原价茅台 天猫双11今晚8点开售
  6. VMware Horizon View 的内部版本号和版本 (2143853) -2020-10-27更新
  7. phpcms首页如加上用户登录的信息?
  8. 转载:LOG_ARCHIVE_DEST_n参数属性——DATA GUARD概念和管理
  9. swing中解决中文乱码问题
  10. (二十三)张量场函数的散度与旋度
  11. 安装emmet时pyv8下载失败
  12. 斗鱼已公开的运维技术和架构分析
  13. Web简易时间轴制作(超详细)
  14. android 浏览器支持java,Android浏览器访问java web的方法
  15. 初识Ionic 和APPframework
  16. python安装绘图库matplotlib_python绘图库Matplotlib的安装
  17. 【调剂】航天科工四院四部2023年度自培研究生开始调剂啦!!!
  18. 微信支付-----统一下单接口对接
  19. C++ primer plus程序2.2《carrots.cpp》
  20. 【论文研读】基于BP 神经网络的 Q235 钢力学性能预测模型

热门文章

  1. shell编程(二十一)文件描述符
  2. 食物改变你的一生:软化血管或降血压的食物
  3. 【LTE基础知识】SGLTE, SVLTE, CSFB, VoLTE
  4. 毕设-基于单片机的声光电子琴
  5. java中打印靠左三角形,java控制台打印三角形区域
  6. elementUi对表单校验重置
  7. 网页无法访问,微信内打开链接提示已停止访问该怎么解决
  8. Java实现简单登录注册账号操作
  9. plc的复位优先SR锁存器与置位优先RS锁存器
  10. How To Uninstall Nero 9