Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中实现webSocket连接的Ping/Pong请求?_Javascript_Web_Websocket_Ping_Pong - Fatal编程技术网

如何在javascript中实现webSocket连接的Ping/Pong请求?

如何在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

我在javascript中使用websocket。但一分钟后连接就断了

我想知道一些事情:

1-Websocket是否自然地提供乒乓/乒乓消息以不关闭连接?我认为这是必须的。否则,websocket和TCP连接之间的区别是什么

2-如果我必须发送乒乓球信息,如何发送乒乓球信息?我需要做什么?WebSocket对象是否提供ping方法?或者我应该将一个方法调用为websocket.send(“ping”)?我正在javascipt中使用NaturalyWebSocket对象

3-服务器是否应使用Pong响应Ping请求?这应该在服务器端单独实现吗


注意:对不起,我的英语不好。

是的,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不会因为返回而继续调用自己。。。