用NodeJS编写的简单TCP服务器中的socket.emit?

时间:2011-08-03 21:39:20

标签: node.js tcp tcpclient socket.io

[正如你所看到的,我不太了解TCP服务器和客户端的基本概念,可能socket.emit甚至不可能,但我想知道最好的替代或类似的东西。 ..]

Socket.io有一个很棒的东西来发送事件并在另一边捕获它们,它在它的第一页(http://socket.io)。我可以使用NodeJS的常规'net'模块做类似的事吗?如果不是那么等同于什么?

我试过了:

server.js

var server = net.createServer(function(socket) {
    socket.on("connect",function() {
        socket.emit('test',{msg : 'did you get it ?'});
    });
}).listen(8000);

client.js

var client = net.createConnection(8000, localhost);
client.on('connect',function(){
    client.on('test',function(data) {
        console.log(data.toString());
    });
});

但是你可以想象,它不起作用。我怎样才能做到这一点?

提前致谢。

3 个答案:

答案 0 :(得分:5)

嗯,net只是TCP的一个接口。要发送和接收消息,您需要在TCP之上设计和实现自己的协议。 TCP是面向流的协议,而不是面向消息的协议。这意味着您必须为读者创造一种分离消息的方法。分隔消息的最简单方法是在它们之间插入\ n字符。将消息编码为字节流的最简单方法是使用JSON.stringify。所以:

client.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))    
})

server.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库类,并在接收到不同消息时发出不同的事件。

'lazy'模块在NPM上可用,用于将接收字节流拆分为单独的行。拆分可以手工完成,但需要20行代码。请参阅“脏”NPM模块的来源,以获得拆分的示例 - 它很麻烦,因此在这种情况下具有外部依赖性是有充分根据的。

答案 1 :(得分:1)

Socket.io使用socket.io-parser的编码/解码方法在服务器和客户端之间传输消息,这意味着它实际上是在引擎盖下使用流。

答案 2 :(得分:0)

只是想在Nodejs 5.0.0版本中提及,如果你想跳过使用lazy,那么已经是客户端了:

var client = net.connect({port: 8000},
    function() { //'connect' listener
       console.log('connected to server!');
});

client.on('data', function(data) {
  console.log(data.toString());
  client.end();
});

client.on('end', function() {
  console.log('disconnected from server');
});