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

Joã*_*imo 4 tcp tcpclient node.js 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);
Run Code Online (Sandbox Code Playgroud)

client.js

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

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

提前致谢.

npo*_*cop 6

那么,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))    
})
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

你可以从这开始并详细说明.例如,您可以在接收方使用EventEmitter库类,并在接收到不同消息时发出不同的事件.

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