我花了很多时间尝试在计算机之间进行 UDP 广播和多播。希望这对其他人来说更容易,因为这个主题很难在网上找到答案。这些解决方案适用于 Node 版本 6.x-12.x:
UDP 广播
计算广播地址
广播地址 = (~子网掩码) | (主机的 IP 地址) - 请参阅 Wikipedia。使用ipconfig(Windows) 或ifconfig(Linux),或查看netmask module。
服务器(记得把BROADCAST_ADDR改成正确的广播地址)
var PORT = 6024;
var BROADCAST_ADDR = "58.65.67.255";
var dgram = require('dgram');
var server = dgram.createSocket("udp4");
server.bind(function() {
server.setBroadcast(true);
setInterval(broadcastNew, 3000);
});
function broadcastNew() {
var message = Buffer.from("Broadcast message!");
server.send(message, 0, message.length, PORT, BROADCAST_ADDR, function() {
console.log("Sent '" + message + "'");
});
}
客户
var PORT = 6024;
var dgram = require('dgram');
var client = dgram.createSocket('udp4');
client.on('listening', function () {
var address = client.address();
console.log('UDP Client listening on ' + address.address + ":" + address.port);
client.setBroadcast(true);
});
client.on('message', function (message, rinfo) {
console.log('Message from: ' + rinfo.address + ':' + rinfo.port +' - ' + message);
});
client.bind(PORT);
UDP 多播
多播地址
查看IPv4 Multicast Address Space Registry 和RFC 2365 manual 第 6 节中更深入的说明,我们发现适当的本地范围多播地址为 239.255.0.0/16 和 239.192.0.0/14(即,除非您获得允许使用其他的)。
下面的多播代码在具有这些地址的 Linux(和许多其他平台)上运行良好。
大多数操作系统通过特定接口发送和侦听多播,默认情况下,如果有多个接口可用,它们通常会选择错误的接口,因此您永远不会在另一台机器上接收到多播(您只能在 localhost 上接收它们)。在Node.js docs 中阅读更多信息。要使代码可靠地工作,请更改代码,以便为您希望使用的接口指定主机的 IP 地址,如下所示:
服务器 - server.bind(SRC_PORT, HOST_IP_ADDRESS, function() ...
客户 - client.addMembership(MULTICAST_ADDR, HOST_IP_ADDRESS);
查看以下支持来源:NodeJS、Java、C# 和有用的command,以查看您订阅了哪些多播地址 - netsh interface ipv4 show joins。
服务器
var SRC_PORT = 6025;
var PORT = 6024;
var MULTICAST_ADDR = '239.255.255.250';
var dgram = require('dgram');
var server = dgram.createSocket("udp4");
server.bind(SRC_PORT, function () { // Add the HOST_IP_ADDRESS for reliability
setInterval(multicastNew, 4000);
});
function multicastNew() {
var message = Buffer.from("Multicast message!");
server.send(message, 0, message.length, PORT, MULTICAST_ADDR, function () {
console.log("Sent '" + message + "'");
});
}
客户
var PORT = 6024;
var MULTICAST_ADDR = '239.255.255.250';
var dgram = require('dgram');
var client = dgram.createSocket('udp4');
client.on('listening', function () {
var address = client.address();
console.log('UDP Client listening on ' + address.address + ":" + address.port);
});
client.on('message', function (message, rinfo) {
console.log('Message from: ' + rinfo.address + ':' + rinfo.port + ' - ' + message);
});
client.bind(PORT, function () {
client.addMembership(MULTICAST_ADDR); // Add the HOST_IP_ADDRESS for reliability
});
更新:server.send 有 additional options(在文档中命名为 socket.send)。您可以为msg 使用字符串而不是缓冲区,并且根据您的版本,有几个参数是可选的。也可以检查回调函数是否发生错误。
更新:自 Node.js v6 起,new Buffer(str) 已被弃用,取而代之的是 Buffer.from(str)。上面的代码已更新以反映此更改。如果您使用的是较早版本的 Node,请使用以前的语法。