node.js - 通过 UDP 和 Node.js 通过 WAN 在两台计算机之间传递 OSC 消息

标签 node.js amazon-ec2 udp osc max-msp-jitter

我正在尝试编写一些极简的客户端-服务器代码,以在不同本地网络上的两台计算机之间传递 OSC 消息。具体来说,我的最终目标是使用 MAX 的 UDPSend 和 UDPReceive 函数(仅监听本地端口)从 Ableton 中的 MAX 补丁发送和接收。这是服务器代码,我将 Ableton 的 OSC Send MIDI 模块发送到该代码。这可以正确接收来自第一台计算机的 MAX 音色的输出,以及来自 channel 的一些 MIDI 数据。

var osc = require('osc-min'),
dgram = require('dgram');
var remotes = [];
var FileReader = require('fs');

// listen for OSC messages and print them to the console
var udp = dgram.createSocket('udp4', function(msg, rinfo) {
  try {
    var oscmsg = osc.fromBuffer(msg);
    console.log(oscmsg);
    remotes.forEach(function(remote, index, array) {
        udp.send(msg, 0, oscmsg.length, 10000, remote);
        console.log('Sent OSC message to %s:%d', remote, 10000);
    });
  } catch (err) {
    console.log(err);
  }

});

FileReader.readFile('ips.txt', 'utf8', function(err, data) {
    // By lines
    var lines = data.split('\n');
    for(var line = 0; line < lines.length; line++){
        remotes.push(lines[line]);
    }
});

udp.bind(9998);
console.log('Listening for OSC messages on port 9998');

服务器正确获取如下 OSC 消息:

{ address: '/Note1',
args: [ { type: 'integer', value: 60 } ],
oscType: 'message' }

然后,我想将计算机 1 的消息转发到端口 9998 上的远程服务器,以及我在端口 10000 上监听的其余计算机。(该服务器是 Amazon EC2 Ubuntu 实例。)这些计算机的公共(public) IP 位于文件 ips.txt。

在接收计算机(在 Windows 上测试)上,我设置了一个 Node 客户端来通过其公共(public) IP 接收数据并将其中继到本地主机,以便 MAX 补丁可以看到它。因此,在此计算机上发送到 10000 的任何消息都将发送到 127.0.0.1:9999。

var osc = require('osc-min'),
    dgram = require('dgram'),
    remote;

// listen for OSC messages and print them to the console
var udp = dgram.createSocket('udp4', function(msg, rinfo) {

  try {
    var oscmsg = osc.fromBuffer(msg);
    console.log(oscmsg);
    send(msg);
  } catch (err) {
    console.log('Could not decode OSC message');
  }

});

function send(oscMessage) {

  udp.send(oscMessage, 0, oscMessage.length, 9999, "127.0.0.1");
  console.log('Sent OSC message to %s:%d', "127.0.0.1", 9999);

}    
udp.bind(10000);
console.log('Listening for OSC messages on port 10000');

问题是,服务器的消息似乎永远不会到达客户端。一旦服务器收到消息,它就会产生如下输出:

Listening for OSC messages on port 9998
{ address: '/Velocity1',
args: [ { type: 'integer', value: 100 } ],   oscType: 'message' }
Sent OSC message to client-public-ip:10000

但是客户端只是停留在其初始监听状态

Listening for OSC messages on port 10000

我认为这可能是我的防火墙的问题,我确保专门通过端口和所有涉及的应用程序启用 UDP,但没有任何效果。我希望避免使用 HTTPRequests。如果有任何建议,我将不胜感激。

Edit: I created a diagram to help visualize what's supposed to be going on between these three computers. The dashed boxes represent the local network that computer is on (they are all on different networks). I hope this helps a bit.

最佳答案

Daniel 使用 WebSockets 的解决方案是正确的。但是,我还需要确保通过 DNS 名称而不是公共(public) IP 地址连接客户端。例如:

const WebSocketClient = require('websocket').client;
const port = process.env.PORT || 3000;
const wsc = new WebSocketClient();
wsc.connect('ws://ec2.compute-1.amazonaws.com:4000/', 'echo-protocol');

相对于:

wsc.connect('ws://1.2.3.4:4000/', 'echo-protocol');

有关此问题的更多详细信息 here .

我还使用了“websocket”npm 模块而不是“ws”,但我不确定这会产生什么影响。

关于node.js - 通过 UDP 和 Node.js 通过 WAN 在两台计算机之间传递 OSC 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46822973/

相关文章:

javascript - 从 "abstract"基址 "class"调用构造函数

amazon-web-services - AWS EC2 : m5. 24xlarge 与 m5.metal

c - UDP 服务器不响应客户端

javascript - 有关 promise 的详细信息;例子

node.js - Angular/Ionic 处理成功 200 作为错误

node.js - 错误 : Cannot find module 'cors'

AWS 的 MongoDB 备份策略

php - 对于门户网站等繁忙站点,ec2 服务器上的理想实例大小是多少

java - 通过WiFi连接Java DatagramSocket的问题

C UDP 客户端未读取服务器回复