[正如你将看到的,我不太了解 TCP 服务器和客户端的基本概念,可能 socket.emit 甚至不可能,但我想知道最好的替代方案或类似的东西......]
Socket.io 有一个漂亮的东西可以发出事件并在另一端捕获它们,它位于它的首页(http://socket.io)。我可以做类似的事情,但使用 NodeJS 的常规“net”模块吗?如果不是那么相当于什么?
I tried:
服务器.js
var server = net.createServer(function(socket) {
socket.on("connect",function() {
socket.emit('test',{msg : 'did you get it ?'});
});
}).listen(8000);
客户端.js
var client = net.createConnection(8000, localhost);
client.on('connect',function(){
client.on('test',function(data) {
console.log(data.toString());
});
});
但正如你可以想象的那样,它不起作用。我怎样才能做到这一点?
提前致谢。
嗯,net 只是 TCP 的一个接口。要发送和接收消息,您需要在 TCP 之上设计和实现您自己的协议。 TCP是面向流的协议,而不是面向消息的协议。这意味着您必须发明一种让读者分隔消息的方法。分隔消息的最简单方法是在消息之间插入 \n 字符。将消息编码为字节流的最简单方法是使用 JSON.stringify。所以:
客户端.js
var Lazy = require('lazy'), net = require('net')
var client = net.createConnection(8000)
new Lazy(client).lines.forEach(function (msg)
{
console.log(JSON.parse(msg))
})
服务器.js
var net = require('net')
var server = net.createServer(function(socket) {
socket.on("connect",function() {
var str = JSON.stringify({foo : 'test', msg : 'did you get it ?'}) + "\n"
socket.write(str)
});
}).listen(8000);
你可以从这里开始,并进行详细的阐述。例如,您可以在接收方使用 EventEmitter 库类,并在收到不同消息时发出不同的事件。
NPM 上提供了“惰性”模块,用于将接收字节流分割成单独的行。拆分可以手动完成,但需要 20 多行代码。请参阅“脏”NPM 模块的来源,了解拆分的示例实现 - 它很麻烦,因此在这种情况下具有外部依赖项是有根据的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)