认识webSocket长连接

1,webSocket是什么

WebSocket 是HTML5开始提出的一种在单个 TCP 连接上进行全双工通讯的协议。用于在web端实现长连接的需求,如在线聊天室,弹幕,实时资讯更新等等

2,什么情形下需要使用websocket?

短链接是通过客户端主动发起请求,无论是发送数据还是请求数据,都是客户端主动发起,服务端收到请求响应状态码及相关数据发送给客户端后,至此通讯结束。

连接→数据传输→关闭连接

而长连接则是保持实时信息同步的需要,需要保持长时间通讯状态。客户端和服务端都可以随时发送数据和接收数据,除非客户端或服务端主动关闭连接,至此通讯结束

连接→数据传输→数据传输→......→关闭连接;

3、创建websocket

javascript 复制代码
let ws = new WebSocket(url,[protocol])
//url 为服务端地址
//protocol 可选参数,指定可接受的子协议

4、websocket 属性

javascript 复制代码
ws.readyState;
//readyState表示连接状态 0 未连接,1 已连接,2 连接正在关闭,3 连接已关闭或连接失败

ws.bufferedAmount :
// 只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数

5、websocket 事件

javascript 复制代码
ws.onopen = function(){} //连接建立触发回调函数


ws.onmessage = function(){} // 接收服务端数据回调函数

ws.onerror = function(){} // 连接报错回调函数

ws.close = function(){} // 连接关闭时触发回调函数

6、websocket 方法

javascript 复制代码
ws.send(data) // 客户端向服务端发送数据 只接受文本形式的数据,复杂数据需要序列化

let msgObj = {
    msg: "你好,请求连接"
}
ws.send(JSON.stringify(msgObj))

ws.close() //关闭连接

7,心跳机制

为什么需要心跳机制?

a、客户端可能存在极端网络环境导致掉线,服务端无法判断连接已经断开。如果客户端和服务端有心跳数据传输,服务端会比较及时发现连接点开,执行onClose。

b、路由节点防火墙会关闭尝试长时间不通讯的socket,导致socket断开,所以客户端需要向服务端定时发送心跳数据保持连接不中断。

心跳机制具体实现

需要前后端定义好心跳数据,客户端用定时器去发送心跳数据,当服务端收到的是客户端发送的心跳数据时,会回复响应数据给客户端,客户端收到响应后,就继续重复上述动作,如果双方超过限定时间未通讯,则服务端会认为连接已断开,停止向客户端发送数据,执行onClose断开连接。

javascript 复制代码
let $timeout = null;
let ws = new WebSocket("ws://127.0.0.1:8783");
ws.onopen = function(evt) {
    let $_content = {
        "event": "join",
        "mode": 1,
        "group_id": 0,
        "from_user_id": "10086",
        "from_username": "john",
        "to_user_id": "10000",
        "content": "加入会话",
    };
    ws.send(JSON.stringify($_content));
};

ws.onmessage = function(evt) {
    console.log( "接受消息: " + evt.data);
    let _obj = JSON.parse(evt.data);
    if (_obj.data.event === 'init') {
        sendHeartbeat();
    }
};

function sendHeartbeat() {
    console.log('客户端定时发送心跳');
    ws.send('{"event":"ping","content":"在线中"}');
    $timeout = setTimeout(sendHeartbeat, 3000);
}

ws.onclose = function() {
    clearTimeout($timeout);
    console.log('断连中');
};
相关推荐
Sylvia33.3 小时前
篮球数据API的技术架构与工程实践:基于火星数据WebSocket实时推送体系
java·python·websocket·网络协议·架构
nnerddboy3 小时前
Rust教程05:结构体,枚举与模式匹配
开发语言·网络·rust
GlobalInfo4 小时前
AI与另类数据融合,市场研究正在从“经验驱动”走向“数据智能”
大数据·网络·人工智能·ai
天吾cc5 小时前
RTT-MQTT
网络·单片机·嵌入式硬件·算法
千视kiloview5 小时前
“轻”不等于降级:IP时代广播制作系统的轻量化与Hybrid架构实践
网络·tcp/ip·架构
不爱土豆唯爱马铃薯5 小时前
升级 AiPy Pro 2.0 后,我把安全中心这几项挨个打开了数据安全、沙盒权限、工作空间隔离——这些 2.0 新功能对科研协作场景的实际影响
网络·安全·php
m0_749492225 小时前
精密制造检测设备采购:五款超高精度三坐标测量机对比
网络协议
南京码讯光电技术有限公司5 小时前
What Does Ex tb IIIC T80°C Db Mean?
服务器·网络·数据库
小绫网络安全5 小时前
【每日一讲】Pikachu漏洞练习靶场
网络·web安全·网络安全·靶场·pikachu
长江&后浪6 小时前
华为wlan实验-三层旁挂
运维·服务器·网络·华为