Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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
Node.js 我想要一个跨网络工作的eventemitter_Node.js_Sockets_Networking_Eventemitter - Fatal编程技术网

Node.js 我想要一个跨网络工作的eventemitter

Node.js 我想要一个跨网络工作的eventemitter,node.js,sockets,networking,eventemitter,Node.js,Sockets,Networking,Eventemitter,我非常喜欢EventEmitter范例,我想用它在网络上的两个程序之间进行通信 我想出了自己的socketemitter,但我想知道:我是不是“做错了(tm)”了?是否有一些软件包已经做到了这一点?是否有一种不同的模式更适合跨网络通信? 以下是我所拥有的: var JsonSocket = require('json-socket') // An event emitter that uses a JsonSocket. // emit passes things over the wire,

我非常喜欢EventEmitter范例,我想用它在网络上的两个程序之间进行通信

我想出了自己的
socketemitter
,但我想知道:我是不是“做错了(tm)”了?是否有一些软件包已经做到了这一点?是否有一种不同的模式更适合跨网络通信?

以下是我所拥有的:

var JsonSocket = require('json-socket')

// An event emitter that uses a JsonSocket.
// emit passes things over the wire, and data received
// over the wire calls the listeners.
//
// As a result, se.on('foo', console.log); se.emit('foo', 5)
// won't do what you might normally expect from an emitter.

function SockEmitter(socket) {
  this._listeners = {}
  this.sock = new JsonSocket(socket)
  this.sock.on('message', this._message.bind(this))
}

SockEmitter.prototype = {
  on: function (type, handler) {
    if (!this._listeners[type]) {
      this._listeners[type] = [];
    }
    this._listeners[type].push(handler)
  },
  off: function (type, handler) {
    if (!this._listeners[type]) {
      return false
    }
    var idx = this._listeners[type].indexOf(handler)
    if (idx === -1) return false
    this._listeners[type].splice(idx, 1)
  },
  emit: function (type) {
    var args = [].slice.call(arguments, 1)
    this.sock.sendMessage({type: type, args: args})
  },
  _message: function (message) {
    if (!message || !message.type || !Array.isArray(message.args)) {
      return console.error('Invalid message received: %s', message)
    }
    if (!this._listeners[message.type]) return
    this._listeners[message.type].forEach(function (handler) {
      handler.apply(null, message.args)
    })
  }
}

如果对等方的IP地址始终是已知的,那么使用json套接字的解决方案将起作用——这是一种典型的客户机/服务器模型,其中许多TCP客户机连接到单个TCP服务器。如果需要向所有其他客户端发送事件,那么需要在服务器上实现一种类似聊天的应用程序,服务器将从客户端接收到的消息转发给其他客户端。然后,正如深南所提到的,使用socket.io可能是您的解决方案。如果您需要直接的N-to-N或点对点连接,维护点地址(可能会超时更改)将是一场噩梦


另一个解决方案是使用Redis发布/订阅功能。(这是数据中心中用于群集通信的流行解决方案之一。有一个很好的工具叫做“devents”。

如果对等方的IP地址总是已知的话,使用json套接字的解决方案会起作用,这是一种典型的客户机/服务器模型,其中许多TCP客户机连接到一个TCP服务器。如果您需要向所有其他客户机发送事件,那么您将需要在服务器上实现一种类似聊天的应用程序,服务器将从客户端接收到的消息转发给其他客户端。然后,正如深南所述,使用socket.io可能是一种解决方案。如果您需要直接N-to-N或对等连接,请维护对等地址(可能会超时更改)那将是一场噩梦


另一个解决方案是使用Redis发布/订阅功能。(这是数据中心中流行的集群通信解决方案之一。有一个很好的工具叫做“devents”。

Socket.io经常用于类似的用途。它以事件方式提供双向通信。然而,人们经常查看使用标准http消息的W3C单向事件标准es(而不是像socket.io那样将
升级到自定义协议)

使用SSE,您可能会看到许多关于服务器到浏览器通信的文章,但该规范定义了一个简单的基于http的消息结构,可以用于任何您想要的用途(例如:服务器到服务器)

我一直在使用它,并取得了巨大的成功。我可以构建事件服务器到服务器的东西,然后轻松地连接到浏览器,这真是太棒了。正如预期的那样,IE还没有上市,但大多数浏览器都是


有很多。我使用了
eventsource节点
进行“监听”以巨大的成功结束。当我开始使用SSE时,没有用于发送事件的模块,只有用于监听的模块;所以我自己编写了。虽然这没什么大不了的,但协议非常简单,只需要大约100行代码。我确信其中一个已发布的模块会工作得很好。

Socket.io经常会出现错误它以事件方式提供双向通信。然而,人们经常查看,这是一种使用标准http消息的W3C单向事件标准(而不是像socket.io那样将
升级到自定义协议)

使用SSE,您可能会看到许多关于服务器到浏览器通信的文章,但该规范定义了一个简单的基于http的消息结构,可以用于任何您想要的用途(例如:服务器到服务器)

我一直在使用它,并取得了巨大的成功。我可以构建事件服务器到服务器的东西,然后轻松地连接到浏览器,这真是太棒了。正如预期的那样,IE还没有上市,但大多数浏览器都是


有很多。我使用了
eventsource节点
进行“监听”以巨大的成功结束。当我开始使用SSE时,没有用于发送事件的模块,只有用于监听的模块;所以我自己编写了。虽然这没什么大不了的,但协议非常简单,只需要大约100行代码。我确信其中一个发布的模块会工作得很好。

我们为什么不这么做使用?我以为socket.io只是通过websockets进行服务器浏览器通信。这是服务器服务器。我们不使用socket有什么原因吗?我以为socket.io只是通过websockets进行服务器浏览器通信。这是服务器服务器。对我来说,HTTP似乎有点重;sockets是人们通常使用的,特别是y,因为我从来不需要它来与浏览器交谈。SSE支持加密吗?加密是通过https(SSL)完成的。它的协议没有为加密消息另外指定任何内容。是的,HTTP确实为解析头和消息增加了一点开销。除非您发送的量非常大,否则这真的不成问题(每秒数千次以上)-这可能是您的情况。似乎HTTP对我的工作来说有点沉重;套接字是人们通常使用的,尤其是当我与浏览器交谈时,我从不需要它。SSE支持加密吗?加密是通过https(SSL)完成的。It协议没有为加密消息另外指定任何内容。是的,HTTP确实为解析标头和消息增加了一点开销。除非发送的量非常大(每秒数千次以上),否则这并不重要-这可能是你的情况。是的,我只需要一对一的通信。或者更确切地说是一对多。但是对等方的IP总是已知的。是的,我只需要一对一的通信。或者更确切地说是一对多。但是对等方的IP总是已知的。