【问题标题】:Node.js UDP StreamNode.js UDP 流
【发布时间】:2015-01-05 16:27:23
【问题描述】:

我正在尝试将一些代码从 PHP 中“移植”到 Node 中,并且我正在努力寻找如何让它工作。我也尝试通过 UDP 连接到 RCON 服务器。 这是 PHP 版本的简化版本,它可以工作:

$address = '1.2.3.4:1234';
$password = 'password';

$socket = stream_socket_client('udp://' . $address, $errno, $errstr);
stream_set_blocking($socket, 0);

$loginRequest = chr(0x45) . $password;
stream_socket_sendto($socket, $loginRequest, 0, $address);
echo 'RCON Login Request Sent' . PHP_EOL;
echo $loginRequest . PHP_EOL;
echo PHP_EOL;

do {
    $data = stream_socket_recvfrom($socket, 127, 0, $address);
} while (!$data);
echo 'RCON Received Response' . PHP_EOL;
echo $data . PHP_EOL;

这是我在 Node 中得到的,它似乎没有做任何事情。我什至没有收到来自服务器的任何连接确认。

var address = '1.2.3.4';
var port = '1234';
var password = 'password';

var socket = require('dgram').createSocket('udp4');

socket.on('message', function (msg, from) {
    console.log(msg);
});

socket.on('listening', function () {
    var loginPacket = new Buffer(String.fromCharCode(0xff) + password);
    socket.send(loginPacket, 0, loginPacket.length, port, address, function (err, bytes) {
        console.log('packet sent');
    });
});

socket.on('error', function (err) {
    console.log('ERROR: ', err);
});

socket.bind(0);

对此的任何帮助都会很棒!玛咖134

【问题讨论】:

  • 吹毛求疵:UDP 不是面向连接的,并且在 TCP 是流的意义上不是流。
  • 将字符串传递给Buffer构造函数的默认编码不是binary,因此您需要传递binary作为编码:new Buffer('\xFF' + password, 'binary')。第一个0xFF 字节会导致默认utf8 编码出现问题。此外,另一个区别是您在节点中使用 0xFF 而在 PHP 中使用 0x45
  • 我很快更换了缓冲区,我还有一些其他代码来创建要发送的数据包。
  • @mscdex:非常感谢,我遇到了同样的问题,并将“二进制”作为编码传递给我的Buffer 对象修复了它。如果您想将此作为答案发布,我会很乐意尽可能多地投票! (即一次:))

标签: php node.js sockets udp


【解决方案1】:

socket.bind 采用端口和可选主机。您正在提供端口 0。

我不确定您要监听哪个端口,但为了举例,我将使用 888。

socket.bind(888);

【讨论】:

  • 在他们的例子中是socket.bind(1234, '1.2.3.4');
  • 不幸的是,绑定到随机端口会产生结果。
【解决方案2】:

将字符串传递给Buffer构造函数的默认编码不是binary,因此您需要传递二进制作为编码:new Buffer('\xFF' + password, 'binary')。第一个 0xFF 字节会导致默认 utf8 编码出现问题。此外,另一个区别是您在节点中使用 0xFF 而在 PHP 中使用 0x45

【讨论】:

    猜你喜欢
    • 2017-11-25
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2018-03-16
    • 2012-07-30
    • 2013-06-15
    相关资源
    最近更新 更多