socket.emit в простом TCP-сервере, написанном на NodeJS? - PullRequest
3 голосов
/ 04 августа 2011

[как вы увидите, я не очень хорошо понимаю основные понятия TCP-сервера и клиента и, вероятно, socket.emit даже не возможен, но я хотел бы узнать лучшую альтернативу или подобную вещь. ..]

Socket.io имеет прекрасную возможность генерировать события и перехватывать их с другой стороны, это на первой странице (http://socket.io). Могу ли я сделать что-то подобное, но с обычным модулем net 'NodeJS? что эквивалентно?

Я пытался:

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 ]

5 голосов
/ 09 августа 2011

Ну, 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 голос
/ 07 января 2014

Socket.io использует socket.io-parser метод кодирования / декодирования для передачи сообщений между сервером и клиентом, что означает, что он фактически использует поток изнутри.

0 голосов
/ 09 ноября 2015

Просто хотел отметить, что в 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');
});
...