最近突然想做一个php实时通讯
我就点开了这个
WebSocket
我看了看官网的demo,觉得看起来很简单嘛,

<?php
//官网demo
$server = new swoole_websocket_server("0.0.0.0", 9501);$server->on('open', function (swoole_websocket_server $server, $request) {echo "server: handshake success with fd{$request->fd}\n";//$request->fd 是客户端id
});$server->on('message', function (swoole_websocket_server $server, $frame) {echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";$server->push($frame->fd, "this is server");//$frame->fd 是客户端id,$frame->data是客户端发送的数据//服务端向客户端发送数据是用 $server->push( '客户端id' ,  '内容')
});$server->on('close', function ($ser, $fd) {echo "client {$fd} closed\n";
});$server->start();

我就是喜欢这种简单易懂的demo ,每行代码意思一看就明白

接下来XML页面
<view>
<view class="sendmessage">
<input id="message" bindinput="inputMessage" placeholder="请输入聊天内容"></input>
<button bindtap="sendMessage">发送</button>
</view>
</view>
<view>
<scroll-view scroll-y="true" class="history">
<view wx:for="{{message}}">
<block wx:if="{{item.class == 1}}">
<view class="user">{{item.name}}说:{{item.msg}}</view>
</block>
<block wx:else>
<view class="service">{{item.name}}说:{{item.msg}}</view>
</block>
</view>
</scroll-view>
</view> 

最后命令行运行php文件,之后浏览器打开html文件,F12打开调试界面看console,ok , 没有问题

这个时候我突然想到一个事情,因为我做多进程的那个教程里,在主进程中会将所有的子进程的句柄存起来,以后进行进程间通讯用。
那么 我将所有的客户端的链接存起来存成数组,每当一个客户端发送消息时,我就遍历这个客户端数组,将消息群发一遍,不久实现了聊天室了吗?
然后就,服务端代码成了这个样子

<?php
$map = array();//客户端集合
$server = new swoole_websocket_server("0.0.0.0", 9501);$server->on('open', function (swoole_websocket_server $server, $request) {global $map;//客户端集合$map[$request->fd] = $request->fd;//首次连上时存起来
});$server->on('message', function (swoole_websocket_server $server, $frame) {global $map;//客户端集合$data = $frame->data;foreach($map as $fd){$server->push($fd , $data);//循环广播}
});$server->on('close', function ($ser, $fd) {echo "client {$fd} closed\n";
});$server->start();

哈哈 , 我觉得这样就大功告成了,结果发现自己是 图样图森破大家可以自己试试,运行php后 , 浏览器打开两个页面,看看console.log的内容是什么

运行良好,可是并没有实现我们说的那种聊天效果。
找找原因吧。
我第一反映看看$map里面是什么,就输出看看,结果发现这个map里面只有一个元素。
唉,不对啊,我这是全局变量,难道不应该是有几个客户端链接,就有几个元素吗?
这是怎么回事啊,竟然没有保存到所有客户端id?

到了这一步,我解决不了map变量的这个问题了,然后我就想看看那个fd是什么东西,
老规矩 var_dump输出 , 发现fd就是 int类型的数字,并且是自增的
这好办了,不就是数字嘛

于是呼,我就这样做
变量存不了,我搞不定,我存文本里嘛。
最终版 websocket.php

<?php$server = new swoole_websocket_server("0.0.0.0", 9501);$server->on('open', function (swoole_websocket_server $server, $request) {file_put_contents( __DIR__ .'/log.txt' , $request->fd);
});$server->on('message', function (swoole_websocket_server $server, $frame) {global $client;$data = $frame->data;
$fd=$frame->fd;
$m = file_get_contents( __DIR__ .'/log.txt');for ($i=1 ; $i<= $m ; $i++) {echo PHP_EOL . '  i is  ' . $i .  '  data  is '.$data  . '  m = ' . $m;if($i->$fd){
$arr=json_decode($data,true);
$arr['name']="我";
$arr['class']=1;
$data=json_endode($arr);
}
$server->push($i, $data );}});$server->on('close', function ($ser, $fd) {echo "client {$fd} closed\n";
});$server->start();
最最重要的是我们的小程序客户端的js代码
socket.js
//获取应用实例
var app = getApp()
var socketOpen="false"
var inputMessage=""
var i=0
var msgInfo={}
Page({
data: {
message:""
},
//获取输入框信息
inputMessage: function(e) {
inputMessage=e.detail.value
},
//点击事件
sendMessage:function(){
if (socketOpen) {
var nickname = wx.getStorageSync('nickname')
if (nickname=="") {
nickname="游客"
}
var data1='{"name":"'+nickname+'","msg":"'+inputMessage+'"}'
wx.sendSocketMessage({
data:data1
})
}
},
//页面加载事件
onLoad: function () {
var that=this
wx.connectSocket({
url: 'ws://192.168.1.181:9502/swoole/ws_server.php'
})
wx.onSocketOpen(function(res) {
socketOpen="true"
})
wx.onSocketMessage(function(res) {
i=i+1
//console.log(res)
var re=JSON.parse(res.data)
msgInfo[i]=re
console.log(msgInfo)
if(res.data){
that.setData({
message:msgInfo
})
}
})
}
})

再次打开开发者工具,多个页面进行输入观察,ok,可以了。

当然,作为聊天室,我这写的也过于简陋了,界面大家自己可以写的好看一些(因为我懒的写界面)还有,每次的发送聊天的记录,应该存起来,这样,如果有新的连接连过来的时候,先把以前的聊天记录发过去,这样,我想体验更好一些

然后,大家可以愉快的聊天了。哈哈

微信小程序+php+swoole极速实现群聊相关推荐

  1. 微信小程序之swoole/WebSocket创建聊天室(php)

     一.php安装扩展组件Swoole 参考连接 二.配置linux服务器 在站点的配置文件中#SSL-END下面添加代码 location /wss/ {#通过配置端口指向部署websocker的项目 ...

  2. 微信小程序使用swoole实现websocket消息推送

    swoole我个人建议在linux环境下操作,毕竟在windows下有那么一点点麻烦.首先linux安装php和swoole环境(有手就行,建议百度). 因为我们的业务是实现消息推送,也就是在完成特定 ...

  3. 微信小程序判断分享的是群还是好友

    最近比较流行的答题小程序通常会有这么一个功能,分享到群增加答题次数,分享到好友无效,那么问题来了,我们如何能够判断用户分享到的是群还是好友呢? 通过查找API文档我发现会有这个一个东西withShar ...

  4. 小程序集成网易云通信群聊功能Demo发布

    前端代码是可以直接使用的,获取后端代码加微信13439975582 功能实现说明: 1.小程序生命周期完美整合 2.消息小红点,群聊小红点代码实现都实现了 3.历史信息回放 4.小程序帐号集成 代码都 ...

  5. python写节日祝福小程序_推荐10款祝福小程序,春节祝福不用尬聊了

    新年将至,最少不了的当然是祝福 But 你还在发短信送祝福? 微信巴拉巴拉的发语音? 今天小编介绍几款祝福小程序,让你的过年祝福方式不再单调! 1. 祝福话 春节,元宵节.情人节即将来到,绞尽脑汁不知 ...

  6. 微信小程序开放微信群ID接口,开发者可获取群名称

    5月 8日晚间,微信方面宣布,小程序向开发者开放了群ID的接口能力.简单地说,就是当你把小程序分享在群聊中,被点击后开发者可获取群ID和群名称,也方便更好地针对群场景提供个性化服务. 众所周知小程序可 ...

  7. 微信小程序,引爆新热点!JEECG社区小程序实战培训,业内首发,实战干货!

    <JEECG社区微信小程序实战开发培训> -- 业内首发,实战干货 一.课程简介 微信小程序实战开发 QQ交流群:131894955  点击链接加入群[微信小程序开发群]:https:// ...

  8. 微信小程序的场景值scene

    根据微信小程序返回给我们的场景值,我们可以根据不同的场景做出不同的处理,更加方便我们对使用场景的划分 当前支持的场景值有: 1001:发现栏小程序主入口,"最近使用"列表(基础库2 ...

  9. 微信小程序联盟:官方文档+精品教程+demo集合(未完待续,持续更新中……)

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...

最新文章

  1. ERROR 1820 (HY000): Unknown error 1820,ERROR 1046 (3D000):
  2. 非标自动化企业前十名_非标自动化设计:非标自动化是如何被称做企业里的血液?...
  3. Java 实现 Trie (前缀树)
  4. python创建sqlite3数据库_树莓派使用 Python + SQLite 建立温度数据库
  5. 三星Galaxy M52 5G通过认证:两个版本 搭载骁龙778G芯片
  6. DFS Codeforces Round #290 (Div. 2) B. Fox And Two Dots
  7. 2.5.1.1、解析配置
  8. C++ Copy Elision
  9. php打印出网站源码/php数据压缩代码
  10. nginx RTMP FFmpeg 视频直播
  11. 分享一个我做的记账系统(网站)
  12. 学Java编程可以做什么?发展方向有哪些?
  13. radasm相关问题
  14. Ant-deign-vue入门:布局-官方文档踩坑
  15. 快速实现安卓输入法!
  16. Date入参和出参格式_@DateTimeFormat 和 @JsonFormat 注解
  17. Wi-Fi:802.11 物理层和发射机测量概述
  18. 算法学习18-两个单链表相交的一系列问题
  19. idea 汉化版 自定义类注释与方法注释 解决自定义注解出现红线
  20. 基于体素化方法的点云降采样

热门文章

  1. [Rhino]犀牛建立模型学习笔记
  2. 深度学习工具评测---音频领域的python库推荐
  3. NewMark法求解动力学响应
  4. 计算机类科技创新项目课题,计算机学院第八期科技创新基金项目申报通知
  5. 高灵敏度压电传感器频率温度特性测量中的TEC型精密温控系统
  6. 经典的机器学习columnTransformer 示例,用于预处理在线文章 SOV 预测的数据
  7. 网络营销---五大优势成就就业
  8. 未来计算机的重要性论文1000字,未来的作文1000字5篇
  9. 网络规划设计师课程笔记(6)
  10. c#实现ftp上传和下载