一、什么是websocket:

  • WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)
  • 它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的
  • Websocket是一个持久化的协议

二、websocket的原理:

websocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一个类似tcp的连接,从而方便它们之间的通信
在websocket出现之前,web交互一般是基于http协议的短连接或者长连接
websocket是一种全新的协议,不属于http无状态协议,协议名为"ws"

三、websocket与http的关系

 相同点:

  1. 都是基于tcp的,都是可靠性传输协议
  2. 都是应用层协议

不同点:

  1. WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息
  2. HTTP是单向的
  3. WebSocket是需要浏览器和服务器握手进行建立连接的
  4. 而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接

联系:

  • WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的

总结(总体过程):

  1. 首先,客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;
  2. 然后,服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;
  3. 最后,客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。

四、具体实现websocket聊天功能

1、服务端连接websocket,可参考官方文档

WebSocket服务器 | Swoole4 文档

<?php //创建WebSocket Server对象,监听0.0.0.0:9502端口
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9501);//连接redis
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
$redis->auth('123456');//监听WebSocket连接打开事件
$ws->on('Open', function ($ws, $request) {echo $request->fd. "连接上了\n";
});//监听WebSocket消息事件
$ws->on('Message', function ($ws, $frame) use ($redis) {$params = json_decode($frame->data,true);print_r($params);switch ($params['type']) {//判断是谁发的消息case 'open':$redis->set($params['who'],$frame->fd);break;//判断给谁发case 'send':$to = $redis->get($params['to']);$ws->push($to,json_encode($params['msg'],true));break;case 'active':echo "这是心跳检测\n";break;default:break;}});//监听WebSocket连接关闭事件
$ws->on('Close', function ($ws, $fd) {echo "client-{$fd} is closed\n";
});$ws->start();?>

2、微信小程序端样式

<view><view class="chat"><view  wx:for="{{list}}" wx:key="list"><view class="service" wx:if="{{item.who=='service'}}"><text>{{item.msg}}</text></view><view class="client" wx:else=""><text>{{item.msg}}</text></view></view></view><view class="send"><input type="text" value="{{inputVal}}" bindblur="sendMsg" placeholder="请输入内容" /></view>
</view>

3、给页面添加样式

.chat{width: 400px;height: 600px;
}.send{width: 400px;height: 50px;
}.service{width: 390px;height: 40px;text-align: left;line-height: 40px;background-color: pink;
}.client{width: 390px;height: 40px;line-height: 40px;text-align: right;background-color: aqua;
}

4、初始化socket连接

function chat() {return new Promise(function () {wx.connectSocket({url: 'ws://ws.xxxxx.com',header: {'content-type': 'application/json'},success: (res) => {console.log("连接成功");},fail: (err) => {console.log("连接失败");}})})
}

5、心跳检测判断是否处于连接状态

function webSocketXin(time = 60000, status = true) {return new Promise(function () {let timing;if (status == true) {timing = setInterval(function () {console.log("心跳已连接");wx.sendSocketMessage({data: JSON.stringify({'type': 'active'}),fail: (res) => {clearInterval(timing);console.log("心跳已关闭");}})}, time)} else {clearInterval(timing);console.log("心跳已断开");}})
}

6、初始化页面信息

import ws from "../../untils/ws"Page({/*** 页面的初始数据*/data: {inputVal: "",list: [{"who": "service","msg": "很高兴为您服务。"}, {"who": "client","msg": "你好"}]},/*** 生命周期函数--监听页面加载*/onLoad: function (options) {ws.chat();    //初始化连接ws.webSocketXin(60000, true);    //心跳检测wx.onSocketOpen((result) => {let message = {who:'client',to:"service",type:'open',}wx.sendSocketMessage({data: JSON.stringify(message),})})wx.onSocketMessage((res)=>{console.log(res.data);let result = JSON.parse(res.data);let list = this.data.list;let msg = {who:"service",msg:result,}list.push(msg)this.setData({list:list})})    },//发消息sendMsg(e) {let inputVal = e.detail.value;let that = this;let list = this.data.list;let message = {who:'client',to:"service",msg: inputVal,type:'send'}wx.sendSocketMessage({data: JSON.stringify(message),success: (res) => {ws.webSocketXin(40000, false)}})list.push(message)inputVal = "";that.setData({list,inputVal})},})

7、实现结果如图

微信小程序实现websocket及单人聊天功能相关推荐

  1. 微信小程序 | 基于小程序+Java+WebSocket实现实时聊天功能

    一.文章前言 此文主要实现在小程序内聊天对话功能,使用Java作为后端语言进行支持,界面友好,开发简单. 二.开发流程及工具准备 2.1.注册微信公众平台账号. 2.2.下载安装IntelliJ ID ...

  2. java与微信小程序通讯_java与微信小程序实现websocket长连接

    本文实例为大家分享了java与微信小程序实现websocket长连接的具体代码,供大家参考,具体内容如下 背景: 需要在小程序实现地图固定坐标下实时查看消息 java环境 :tomcat7 jdk1. ...

  3. 微信小程序之WebSocket

     (扫码带走看 ^ ^) 本文版权归 OSChina jsongo0 所有,此处为技术收藏,如有再转请自觉标明原文出处,这是大家对原创作者劳动成果的自觉尊重! 原文地址:https://my.osch ...

  4. 微信是与服务器长连接,java与微信小程序实现websocket长连接.pdf

    java与与微微信信小小程程序序实实现现websocket长长连连接接 本文实例为大家分享了j ava与微信小程序实现websocket长连接的具体代码,供大家参考,具体内容 下 背背景景:: 需要在 ...

  5. 【微信小程序控制硬件⑧ 】微信小程序以 websocket 连接阿里云IOT物联网平台mqtt服务器,封装起来使用就是这么简单!(附带Demo)

    [微信小程序控制硬件第1篇 ] 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! [微信小程序控制硬件第2篇 ] 开始微信小程序之旅,导入小程序Mqtt客户 ...

  6. 微信小程序的 websocket 以及 微信开发者工具测试 ws 协议没有数据的 离奇解决方案 记录

    微信小程序的 websocket 在本地web能够使用ws协议去链接websocket,但是小程序不能使用. 一.WSS 协议与 WS 协议 二.业务场景记录 : 使用 ws 协议的 websocek ...

  7. 微信小程序使用websocket

    微信小程序使用websocket 连接websocket let url = `******`//websocket地址 wx.connectSocket({url: url,success() {c ...

  8. 微信小程序图标不支持html,微信小程序实现自定义加载图标功能

    效果图 实现思路 1.首先通过HTML+CSS实现加载动画的静态效果: 2.根据需求给每个动画设计不同的动画效果. 例如第一个加载图标的静态绘制 1.首先确定动画的盒子宽高: 2.设置盒子中每一个长方 ...

  9. 微信小程序开发教程第八章:微信小程序分组开发与左滑功能实现

    接着上面微信小程序开发教程第八章:微信小程序分组开发与左滑功能实现.(第一二章:微信小程序开发教程,第三四章:微信小程序项目结构以及配置&微信小程序首页面开发,第五章:微信小程序名片夹详情页开 ...

最新文章

  1. c语言:【顺序表】静态顺序表的初始化、打印、尾插、尾删
  2. HCNE题库附件、可下载
  3. 常考数据结构与算法:螺旋矩阵m*n
  4. RuoYi-Process多模块activity工作流项目快速搭建
  5. Arduino--二维码显示
  6. c语言编程输出所有水仙花数,c语言中,如何输出所有的水仙花数
  7. 纪念第一次青海湖之行泡汤
  8. php数组第二位,PHP将二位数组按照第二维的某个元素的值进行排序
  9. 自动控制原理第二版王建辉_王建辉自动控制原理配套题库名校考研真题课后答案资料课后习题章节题库模拟试题...
  10. MyBatis中的原理
  11. qt结构体嵌套结构体方法_9.2 C++结构体类型变量
  12. JAVA File的创建及相对路径绝对路径
  13. iOS工程中创建pch文件
  14. Docker核心技术之联合文件系统
  15. 思考题2(人车关系)
  16. Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
  17. 某工程质量安全监管平台验证码请求参数params加密破解
  18. RTSP支持MPEG-4格式监控
  19. pixhawk编译环境搭建--2018.4.25
  20. 少儿编程Scratch学习教程--Scratch3.0界面简介

热门文章

  1. 多多自走棋改动_刀塔霸业和多多自走棋有什么区别 哪些改动比较大
  2. 第三届2022MathorCup高校数学建模挑战赛大数据论文加代码(附详解)
  3. 《Python黑帽子:黑客与渗透测试编程之道》读书笔记(四):web攻击
  4. FreeRadius 服务器环境搭建(CHAP 版)
  5. 计算机通信辞典登录,bit
  6. 华为交换机的基本配置,看完秒懂
  7. elasticsearch 使用RestHighLevelClient
  8. 微信开放平台【第三方平台】java开发总结:预授权码(pre_auth_code)(三)
  9. ocr-制作自己的数据集
  10. 视频虚拟剪辑工具_VirtualClip