1

我想知道是否有人可以帮助我。我是 nodejs 的新手,我一直在尝试使用 nodejs 作为客户端向服务器发送消息。服务器是用 C 编写的,查看 PHP 安装,它使用 pack('N',len) 将字符串的长度发送到服务器。我试图在 javascript 中实现类似的东西,但遇到了一些问题。我想知道您是否可以指出我哪里出错了(归功于 phpjs 从我复制打包字符串代码的地方)。

我的客户端 nodejs javascript 代码是:

   var net = require('net');
     var strs = Array("<test1>1</test1>",` 
        "<test_2>A STRING</test_2>", "<test_3>0</test_3>", 
        "<test_4></test_4>", "<test_5></test_5>",
        "<test_6></test_6>", "<test_7_></test_7>",
        "<test_8></test_8>", "<test_9>10</test_9>",
        "<test_10></test_10>", "<test_11></test11>",
        "<test_12></test_12>", "<test_13></test_13>",
        "<test_14></test_14>");

        hmsg = strs[0] + strs[1] + strs[2] + strs[3] + strs[4] + strs[5] + strs[6];
        console.log(hmsg.length);
        msg =  hmsg + "<test_20></test_20>"`

     msglen = hmsg.length;
     astr = '';
     astr += String.fromCharCode((msglen >>> 24) && 0xFF);
     astr += String.fromCharCode((msglen >>> 16) && 0xFF);
     astr += String.fromCharCode((msglen >>> 8) & 0xFF);
     astr += String.fromCharCode((msglen >>> 0) & 0xFF);
     var pmsg = astr + msg;
     console.log(pmsg);
     var client = net.createConnection({host: 'localhost', port: 1250});
     console.log("client connected");
     client.write(pmsg);
     client.end();

运行“node testApp”会打印出正确的标题字符串长度。如果我查看服务器接收的内容,我可以看到,只要标题字符串 < 110 个字符,它就会解码正确的长度,但如果标题字符串 > 110(通过在 hmsg 中添加 strs[6] 或更多)解码长度不正确。包括 strs[6] 我在客户端得到长度为 128 的字符串,在服务器端得到长度为 194 的字符串。

我显然在打包整数时做错了,但我不熟悉打包位,也不确定我哪里出错了。谁能指出我的错误在哪里?非常感谢!

更新 感谢 nodejs 邮件列表上的 Fedor Indutny,以下内容对我有用:

console.log(hmsg.length, msg.length);
var msglen = hmsg.length;
var buf = new Buffer(msg.length+4);
mslen = buf.writeUInt32BE(msglen, 0);
mslen = buf.write(msg, 4);

var client = net.createConnection({host: 'localhost', port: 8190});
console.log("client connected");
client.write(buf);
client.end();

即使用 Buffer 的 writeUInt32 是标题消息长度所需的全部内容。我在这里发帖希望它可以帮助其他人。

4

1 回答 1

0

我看到你设法让它自己工作,但为了更容易修复,你可以使用二进制模块。

https://github.com/substack/node-binary

安装npm install binary

于 2014-04-30T12:54:29.520 回答