我正在尝试编写一些极简的客户端-服务器代码来在不同本地网络上的两台计算机之间传递 OSC 消息。具体来说,我的最终目标是使用 MAX 的 UDPSend 和 UDPReceive 函数从 Ableton 中的 MAX 补丁发送和接收,它们只是侦听本地端口。这是我将 Ableton 的 OSC Send MIDI 模块发送到的服务器代码。这会正确接收来自第一台计算机的 MAX 补丁的输出,以及来自通道的一些 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 实例。)这些计算机的公共 IP 在文件 ips 中。文本。
在接收计算机上(在 Windows 上测试),我设置了一个 Node 客户端以通过其公共 IP 接收数据并将其中继到 localhost,以便 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。我将不胜感激任何建议。
编辑:我创建了一个图表来帮助可视化这三台计算机之间应该发生的事情。虚线框表示计算机所在的本地网络(它们都在不同的网络上)。我希望这能有所帮助。