在之前的文章中我们所提到的文件的上传和下载以及request请求都是基于http请求的。小程序也给我们提供了另一种通讯方式是基于websocket请求的,那么http请求和websocket它们之间的含义以及有什么什么不同呢?下来就让我们一起来看下吧:

我们可以看到http协议呢是基于TCP/IP通信协议通过万维网服务器传输数据到本地浏览器的应用层协议;websocket是由HTML5规范提出的一种在单个TCP连接上进行全双工通信的应用层协议。在了解了两者的不同后,让我们来看下在小程序中是如何通过websocket进行数据传输的。

url是服务器的wss接口地址,header表示了http header,protocols表示了子协议数组。下面让我们通过一个实例来看下吧:

<!--index.wxml>
<view class="container"><view class="page-body"><view class="page-section"><view class="weui-cells weui-cells_after-title"><view class="weui-cell weui-cell_switch"><view class="weui-cell__bd">Socket状态</view><view class="weui-cell__ft"><switch bindchange="toggleSocket" checked="{{isOpen}}"/></view></view><view class="weui-cell"><view class="weui-cell__bd">消息</view><view class="weui-cell__ft">Hello, 小程序!</view></view></view></view><view class="btn-area"><button type="primary" size="40" bindtap="sendMessage" disabled="{{socketStatus != 'connected'}}" loading="{{loading}}">点我发送</button></view></view>
</view>
const tunnelUrl = require('../../../../../config').tunnelUrlfunction showModal(title, content) {wx.showModal({title,content,showCancel: false})
}function showSuccess(title) {wx.showToast({title,icon: 'success',duration: 1000})
}Page({data: {socketStatus: 'closed',isOpen: false,sendText: 'hello, 小程序'},socketMsgQueue: [],// 注册连接打开事件registerOpen() {wx.onSocketOpen((res) => {console.log('当前webscoket通道已打开并开始发送数据', res);this.sendAllMessage();this.setData({socketStatus: 'connected',isOpen: true});});},// 注册接受到websocket消息事件registerReceive() {wx.onSocketMessage(function (res) {console.log('收到服务器内容:' + res.data)})},// 注册socket出错事件registerError() {wx.onSocketError((res) => {this.setData({socketStatus: 'closed',isOpen: false})console.log('socket连接出错,原因是:', res);});},// 切换switch开关toggleSocket: function(e) {if(e.detail.value) {wx.connectSocket({url: tunnelUrl,protocols: ['echo-protocol'],success: (res) => {console.log('打开一个socket连接',res);this.registerOpen();this.registerReceive();this.registerError();}});} else {wx.closeSocket({success: (res) => {console.log('关闭socket连接: ', res);wx.onSocketClose((res) => {console.log('当前socket通道已关闭', res);this.setData({socketStatus: 'closed',isOpen: false});})},fail: (res) => {console.log('关闭socket通道出错,原因是:', res);},complete: (res) => {console.log('操作完成!')}});}},// 点击按钮发送消息sendMessage: function() {let text = this.data.sendText;this.sendSingleMessage(text+Math.random()*100);},// 发送单条websocket消息sendSingleMessage: function(text) {let isOpen = this.data.isOpen;if (isOpen) {wx.sendSocketMessage({data: text})} else {this.socketMsgQueue.push(text)}},// 发送队列所有websocket消息sendAllMessage: function() {for (var i = 0; i < this.socketMsgQueue.length; i++) {this.sendSingleMessage(this.socketMsgQueue[i])}this.socketMsgQueue = []}})

今天的内容就到这里了,我们下期再见。

socket closed是什么意思_socket请求相关推荐

  1. Unable to open debugger port (127.0.0.1:4184): java.net.SocketException socket closed

    Unable to open debugger port (127.0.0.1:4184): java.net.SocketException "socket closed" ht ...

  2. 解决:Unable to open debugger port (127.0.0.1:55017): java.net.SocketException “Socket closed“

    项目以前启动正常,突然报错,启动不起来了,报了个Unable to open debugger port (127.0.0.1:55017): java.net.SocketException &qu ...

  3. 解决jmeter压测试时java.net.SocketException: Socket closed异常

    问题描述: jmeter压测时会报java.net.SocketException: Socket closed,如图所示: 解决办法: 1.implementation选择httpclient 4, ...

  4. Tomcat 启动报:socket closed,已解决

    问题背景:正在项目debug,工具到期了,接着找破解码,重新启动项目发现报:socket closed...... 解决方案: 一.简单方法: 找到任务管理器(Ctrl+Alt+".&quo ...

  5. python 调试报错 Connection to Python debugger failed socket closed

    python 调试报错 Connection to Python debugger failed socket closed 点击调试按钮报错,同时显示AttributeError: module ' ...

  6. Pycharm调试错误:连接 Python 调试器失败 Socket closed

    pycharm点击工具栏的调试按钮时出现错误:连接 Python 调试器失败 Socket closed 首先采用以下方法: 选择左上角工具栏"file"→"settin ...

  7. java socket发送定长报文_socket编程

    1.socket编程的概念 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请 ...

  8. java socket 如何设置so_keepalive属性_socket通信的KeepAlive设定

    socket通信的KeepAlive默认时间是2小时,通过以下代码可以改变其时间,来检测socket通信过程中自网线,服务器网线断等事件 #include #include "winsock ...

  9. java socket长连接怎么维持_socket长连接的维持

    import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date;/** * 维持连接的消息对 ...

最新文章

  1. android 稳定性测试工具,APP 稳定性测试工具-Fastbot_Android详解
  2. mysql代理中间件_MySQL-ProxySQL中间件(二)
  3. 【转】CAD2012打开自动关闭解决方法
  4. Git指南-Git-flow开发流程
  5. proxychains 使用指北
  6. print打印字符串之谜
  7. mapreduce 文件可以切分吗_MapReduce的任务流程
  8. 33 -jQuery 属性操作,文档操作(未完成)
  9. 批改网禁止粘贴怎么破_重大利好!教育部声明,要求家长批改作业等行为,发现一起严处一起...
  10. JS 防止表单重复提交
  11. 1.1为什么选择序列模型
  12. php方法 隐藏手机号中间四位
  13. html点线面制作,利用HTML5绘制点线面组成的3D图形的示例_html5教程技巧
  14. 用装饰器来进行登录验证
  15. java easyui 模板_漂亮easyui皮肤组件html模板下载A 最新 最全
  16. 年终将至,财务人如何做好数据分析?
  17. [MUI框架]-滑动侧边栏-div同页结构
  18. authc过滤器 shiro_shiro原理之过滤器
  19. MS-RTOS --- 技术特点及其检测标准
  20. php google地图,google地图 标记地图代码

热门文章

  1. Exception Error log
  2. 查看当前机器.net 版本的方法
  3. MFC GDI绘图基础
  4. C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
  5. windows重绘机制原理
  6. C++中extern关键字的作用
  7. Winsock网络编程快速入门
  8. Java代码的维护与更新,Java常用的规则引擎,让你变动的代码更加容易维护
  9. 树莓派通过VNC连接时分辨率太低
  10. linux 流量 脚本,linux 检测网络出入流量 当达到一定量时 自动执行另一个脚本。...