如何在javascript中实现webSocket连接的Ping/Pong请求?
我在javascript中使用websocket。但一分钟后连接就断了 我想知道一些事情: 1-Websocket是否自然地提供乒乓/乒乓消息以不关闭连接?我认为这是必须的。否则,websocket和TCP连接之间的区别是什么 2-如果我必须发送乒乓球信息,如何发送乒乓球信息?我需要做什么?WebSocket对象是否提供ping方法?或者我应该将一个方法调用为websocket.send(“ping”)?我正在javascipt中使用NaturalyWebSocket对象 3-服务器是否应使用Pong响应Ping请求?这应该在服务器端单独实现吗如何在javascript中实现webSocket连接的Ping/Pong请求?,javascript,web,websocket,ping,pong,Javascript,Web,Websocket,Ping,Pong,我在javascript中使用websocket。但一分钟后连接就断了 我想知道一些事情: 1-Websocket是否自然地提供乒乓/乒乓消息以不关闭连接?我认为这是必须的。否则,websocket和TCP连接之间的区别是什么 2-如果我必须发送乒乓球信息,如何发送乒乓球信息?我需要做什么?WebSocket对象是否提供ping方法?或者我应该将一个方法调用为websocket.send(“ping”)?我正在javascipt中使用NaturalyWebSocket对象 3-服务器是否应使用P
注意:对不起,我的英语不好。是的,WebSocket中有乒乓球框架。下面是一个使用
ws
模块的示例,其中服务器正在启动ping请求:
const http = require('http');
const ws = require('ws');
const server = http.createServer(function(req_stream_in, res_stream_out) {
// handle regular HTTP requests here
});
const webSocketServer = new ws.Server({
path: "/websocket",
server: server
});
const connected_clients = new Map();
webSocketServer.on('connection', function connection(ws_client_stream) {
// NOTE: only for demonstration, will cause collisions. Use a UUID or some other identifier that's actually unique.
const this_stream_id = Array.from(connected_clients.values()).length;
// Keep track of the stream, so that we can send all of them messages.
connected_clients.set(this_stream_id, ws_client_stream);
// Attach event handler to mark this client as alive when pinged.
ws_client_stream.is_alive = true;
ws_client_stream.on('pong', () => { ws_client_stream.is_alive = true; });
// When the stream is closed, clean up the stream reference.
ws_client_stream.on('close', function() {
connected_clients.delete(this_stream_id);
});
});
setInterval(function ping() {
Array.from(connected_clients.values()).forEach(function each(client_stream) {
if (!client_stream.is_alive) { client_stream.terminate(); return; }
client_stream.is_alive = false;
client_stream.ping();
});
}, 1000);
此时,心跳通常在服务器端实现:从客户端可以做的事情不多 但是,如果服务器不断终止您的套接字连接,而您无法对其进行控制,则客户端可能会在以下时间间隔向websocket发送任意数据:
let socket = null;
function connect_socket() {
socket = new WebSocket(ws_url);
socket.on("close", connect_socket); // <- rise from your grave!
heartbeat();
}
function heartbeat() {
if (!socket) return;
if (socket.readyState !== 1) return;
socket.send("heartbeat");
setTimeout(heartbeat, 500);
}
connect_socket();
let socket=null;
函数connect_socket(){
套接字=新的WebSocket(ws_url);
socket.on(“close”,connect_socket);//在ouni的解决方案中,heartbeat()没有启动。当它被放入一个打开事件时,它会工作,如下所示:
let socket = null;
function connect_socket() {
socket = new WebSocket(ws_url);
socket.on("close", connect_socket); // <- rise from your grave!
socket.on("open", heartbeat); // heartbeat when the socket is open
}
function heartbeat() {
if (!socket) return;
if (socket.readyState !== 1) return;
socket.send("heartbeat");
setTimeout(heartbeat, 500);
}
connect_socket();
let socket=null;
函数connect_socket(){
套接字=新的WebSocket(ws_url);
socket.on(“close”,connect_socket);//Mozilla记录了乒乓球的专用约定
在握手之后的任何时候,客户机或服务器都可以
选择向另一方发送ping。收到ping时,
收件人必须尽快发回电话。您可以使用
例如,这可以确保客户端仍然连接
乒乓球只是一个规则帧,但它是一个控制帧。
ping的操作码为0x9,而pong的操作码为0xA
得到一个ping,发回一个pong,其有效负载数据与
ping(对于乒乓球和乒乓球,最大有效负载长度为125)。您可以
也可以在不发送乒乓球的情况下获得乒乓球;如果有,请忽略此项
发生了
如果您在有机会访问之前已获得一个以上的ping
发一个乒乓球,你只发一个乒乓球
见:
请在此处从浏览器端查找有关乒乓球的更深入讨论:
更具体地说,请阅读关于乒乓球的Websocket。我无法访问Websocket对象中的is_alive属性?Websocket只是另一个Javascript对象,因此您可以在其上添加任何属性。它只是一个无法识别的typescript,您可以扩展Websocket类或根据您的n更新键入eed。这是可行的,但似乎这个服务器端会让服务器非常忙。服务器通常不发送ping,当然也不应该发送ping。服务器通常不发送ping,当然也不应该发送ping:由客户端决定是否要维护连接,服务器不应该强制保持连接对他开放(例如,这种方式可能会耗尽移动设备上的电池,因为不断回复服务器ping会使其无法使无线电进入睡眠状态)这不是乒乓球。必须有一些常规方法使客户端启动乒乓球,对吗?我很欣赏更改后的beast ref:)@Chrischmitz我已经等了两年,等着有人注意到,现在我的精神终于可以自由了~服务器通常不会,当然也不应该发送pingsI认为函数heartbeat不会因为返回而继续调用自己。。。