Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.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
Node.js 对于游戏中的慢速聊天,有没有比socket.io更好的解决方案?_Node.js_Websocket_Socket.io_Chat_Messaging - Fatal编程技术网

Node.js 对于游戏中的慢速聊天,有没有比socket.io更好的解决方案?

Node.js 对于游戏中的慢速聊天,有没有比socket.io更好的解决方案?,node.js,websocket,socket.io,chat,messaging,Node.js,Websocket,Socket.io,Chat,Messaging,我正在用node.js(后端api)和angular(前端)创建一个浏览器游戏。我的目标是实现游戏内聊天,以允许同一地图上的玩家之间进行通信。聊天不是游戏中必不可少的一部分,因此信息不需要是即时的(几秒钟的延迟应该可以)。有时一起聊天只是一个很酷的功能 一个好的解决方案应该是实现socket.io以进行实时通信。但是,由于聊天不是一个必要的组件,而且是唯一需要WebSocket的组件,我想知道是否有其他方法可以通过套接字处理避免服务器过载 我考虑过每隔2或3秒轮询我的RESTAPI以请求新消息,

我正在用node.js(后端api)和angular(前端)创建一个浏览器游戏。我的目标是实现游戏内聊天,以允许同一地图上的玩家之间进行通信。聊天不是游戏中必不可少的一部分,因此信息不需要是即时的(几秒钟的延迟应该可以)。有时一起聊天只是一个很酷的功能

一个好的解决方案应该是实现socket.io以进行实时通信。但是,由于聊天不是一个必要的组件,而且是唯一需要WebSocket的组件,我想知道是否有其他方法可以通过套接字处理避免服务器过载

我考虑过每隔2或3秒轮询我的RESTAPI以请求新消息,但它可能会以同样的方式使服务器过载。。。你的建议是什么


谢谢你的建议

有一个很酷的套餐叫。它有一个nodejs服务器组件,可以在用户的浏览器中使用。它使用了一个不太知名的http(https)协议应用程序,名为。EventSource基本上打开到web服务器的持久http(https)连接

这是一个可靠和轻量级的设置。(自述文件谈到了WebRTC信令,但它的用处远不止这些。)

在服务器端,简单但有效的服务器设置可能如下所示:

module.exports = function makeHubServer (port) {
  const signalhubServer = require('signalhub/server')
  const hub = signalhubServer({ maxBroadcasts: 0 })

  hub.on('subscribe', function (channel) {
    /* you can, but don't have to, keep track of subscriptions here. */
  })

  hub.on('publish', function (channel, message) {
    /* you can, but don't have to, keep track of messages here. */
  })

  hub.listen(port, null, function () {
    const addr = hub.address()
  })
  return hub
}
在浏览器中,您可以执行此类操作。它允许用户打开一个持久的EventSource来接收消息。而且,当需要发送消息时,它会发布消息

而且,Chromium的devtools网络选项卡了解所有关于EventSource连接的信息

  const hub = signalhub('appname', [hubUrl])
  ...
  /* to receive */
  hub.subscribe('a-channel-name')
    .on('data', message => {
      /* Here's a payload */
      console.log (message)
    })
  ...
  /* to send */
  hub.broadcast('a-channel-name', message)

我想您知道(但OP可能不知道),
EventSource
是服务器发送事件的客户端接口。由于游戏内聊天的概念是双向的,EventSource界面仅涵盖双向聊天的一个方向。可能需要单独使用ajax调用来发送聊天消息。这就是为什么socket.io(或webSocket)在我看来是一个更好的解决方案,因为它们是双向通道,可以处理任意方向的数据流。当然你是对的,@jfriend00 OP确实要求使用socket.io替代方案。这个可以很好地处理投票问题。而且,对于以低容量发送消息,由signalhub客户端代码完成的POST请求是完全合理的。更高的音量?低延迟?显然是socket.io或Websockets。服务器发送事件和EventSource API的另一个优点是:负载平衡器、反向代理等可以更好地处理SSE(因为它是纯HTTP。但您可能需要发送keep alives和/或更改默认连接超时)