热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WebSocket双向通信

WebSocket可以实现浏览器和服务器之间双向通信的持久性连接。使用此API,您可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以

WebSocket 可以实现浏览器和服务器之间双向通信持久性连接。使用此 API,您可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应。还可以实现实时推送跨域

 WebSocket 支持传输的数据格式为:字符串、Blob、ArrayBuffer、ArrayBufferView。

对不支持 WebSocket 的低版本浏览器,可以使用 Socket.io 第三方插件。

兼容性

IE9+

语法

var socket = new WebSocket(url [, protocols]); // 返回一个 WebSocket 对象

  • url: websocket服务器地址。网页协议和websocket协议最好对应,http 对应 ws,https 对应 wss。
  • protocols: 一个协议字符串或者一个包含协议字符串的数组。这些字符串用于指定子协议,这样单个服务器可以实现多个 WebSocket 子协议(例如,您可能希望一台服务器能够根据指定的协议(protocol)处理不同类型的交互)。如果不指定协议字符串,则假定为空字符串。

使用 new WebSocket() 示例

const socket = new WebSocket('ws://localhost:8080');
// socket.binaryType = 'arraybuffer'; // 如果传输的是二进制数据,要定义二进制数据类型socket.onopen = function (event) {const data = JSON.stringify({msg: 'Hello'});socket.send(data);
};socket.onmessage = function (event) {try {const data = JSON.parse(event.data);} catch (error) {}
};socket.onerror = function (event) {console.log('出错啦!', event);
};socket.onclose = function () {console.log('websocket关闭');
};

关闭连接前最好检查一下 socket.bufferedAmount 是否为0,以防还有数据要传输。 

使用 socket.io 示例

npm i -S socket.io socket.io-client

Client

mySocket.js (封装 socket,方便被emit调用)

import io from 'socket.io-client';/**
* Socket 对象
**/
class mySocket {constructor() {this.socket = null;}/*** socket 连接 connect* @param {String} ip**/connect(ip [, options]) {this.socket = io.connect(ip, {reconnection: true,reconnectionDelay: 500,reconnectionAttempts: 5,timeout: 40000,path: '/notice',query: {}})}/*** socket 监听 on* @param {String} type* @param {Function} func**/on(type, func) {if (this.socket) {this.socket.on(type, func);} else {throw new Error('socket 未连接');}}/*** socket 事件触发 emit* @param {String} type* @param {Object} params**/emit(type,params) {if (this.socket) {this.socket.emit(type, params);} else {throw new Error('socket 未连接');}}/*** socket 关闭 close**/close() {this.socket && this.socket.close();}
}export default new mySocket();

index.js 

import socket from 'utils/mySocket';Http.get(Api.getSocketInfo).then((res) => {// res.data = 192.118.10.80?JSESSIONID=b21205400b108b16econst socketUrl = window.location.protocol + '//' + res.data + '&shopId=1;// 连接(socket连接的地址可以请求后台获取)socket.connect(socketUrl);// socket 连接成功socket.on('connect', () => {console.log('socket连接成功,URL:', socketUrl);});// socket 消息接收socket.on('msgEvent', (data) => {data = JSON.parse(data);// to do sth ...// socket 发送消息try {socket.emit('emitMessage', {shopId: '1',orderId: '32542321'});} catch (e) {throw new Error(e);}}
}

Server

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);server.listen(8001, ()=>{console.log('webSocket server listening on port 8001')
});app.get('/', (req, res)=>{res.sendFile(__dirname + '/index.html');
});io.on('connection', (socket)=>{socket.emit('news', { hello: 'world' });socket.on('otherEvent', (data)=>{console.log(data);});
});

参考


  • ​​​​​​​​​​​​​​Introduction | Socket.IO
  • WebSocket - Web API 接口参考 | MDN

推荐阅读
  • 都会|坏处_[JS入门到进阶] 手写解析uin8数组的工具:解析二进制字节,太快太方便了!
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了[JS入门到进阶]手写解析uin8数组的工具:解析二进制字节,太快太方便了!相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 前面的已经介绍过如何用webpack打包一个项目,细心的人会发现,打包后想要项目运行起来必须要把打包后的项目上传到服务器中,或者静态的项目 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
  • Istio是一个用来连接、管理和保护微服务的开放平台。Istio提供一种简单的方式来为已部署的服务建 ... [详细]
  • 为了让用户体验更好,页面前端往往是通过ajax来进行数据处理;由于浏览器的设计原因每个域名下的连接有 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • **步骤1:在DNS服务器的基础上,修改DNS的正向数据库文件varnamedchrootvarnamedtext.com.zone,添加MX资源记录。具体操作如下。** ... [详细]
  • 我目前正在努力解决与Scrapy有关的问题.每当我使用Scrapy刮取证书的CN值与服务器域名匹配的HTTPS站点时,Scrapy效果很好!另一方面,每当我尝试抓取证书的CN值与服务器的域名不匹 ... [详细]
  • 和php统计文件大小(和php统计文件大小的命令)
    本文目录一览:1、php怎样用自定义函数统计目录大小 ... [详细]
author-avatar
laosiji
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有