Создайте WebSockets между TCP-сервером и HTTP-сервером в node.js

Я создал TCP-сервер с помощью Node.js, который прослушивает подключения клиентов. Мне нужно снова передать данные с TCP-сервера на HTTP-сервер в Node.js, возможно, через Веб-сокет (socket.io).

Однако я не знаю, как создать такое соединение, чтобы TCP-сервер мог передавать данные на HTTP-сервер через Websocket.

Огромное спасибо.


person Ravish    schedule 15.08.2012    source источник
comment
Вы можете использовать socket.io-client для подключения HTTP-сервера с помощью socket.io   -  person nguyenkha    schedule 15.08.2012
comment
@nguyenkha: Не могли бы вы помочь мне с образцом кода, пожалуйста?   -  person Ravish    schedule 15.08.2012
comment
Возьмите код из примера socket.io socket.io/#how-to-use для на стороне клиента, только часть JavaScript и var io = require('socket.io-client');   -  person nguyenkha    schedule 15.08.2012


Ответы (3)


Я пробовал много вещей, чтобы получить эту работу. Большую часть времени я полагался на socket.io, чтобы заставить это работать, но он просто не работал с TCP.

Однако для этой цели достаточно net.Socket.

Вот его рабочий пример.

TCP-сервер

var net = require('net');

var HOST = 'localhost';
var PORT = 4040;

var server = net.createServer();
server.listen(PORT, HOST);

server.on('connection', function(sock) {
    console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);
sock.write("TCP sending message : 1");
    console.log('Server listening on ' + server.address().address +':'+ 
        server.address().port);
}).listen(PORT, HOST);

HTTP-сервер

var http = require('http').createServer(httpHandler),
    fs = require("fs"),
    wsock = require('socket.io').listen(http),
    tcpsock = require('net');

var http_port = 8888;

var tcp_HOST = 'localhost';
var tcp_PORT = 4040;

/**
 * http server
 */
function httpHandler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

http.listen(http_port);
console.info("HTTP server listening on " + http_port);

wsock.sockets.on('connection', function (socket) { 

    var tcpClient = new tcpsock.Socket();
    tcpClient.setEncoding("ascii");
    tcpClient.setKeepAlive(true);

    tcpClient.connect(tcp_PORT, tcp_HOST, function() {
        console.info('CONNECTED TO : ' + tcp_HOST + ':' + tcp_PORT);

        tcpClient.on('data', function(data) {
            console.log('DATA: ' + data);
            socket.emit("httpServer", data);
        });

        tcpClient.on('end', function(data) {
            console.log('END DATA : ' + data);
        });
    });

    socket.on('tcp-manager', function(message) {
        console.log('"tcp" : ' + message);
        return;
    });

    socket.emit("httpServer", "Initial Data");
});

Клиент браузера

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('httpServer', function (data) {
    console.log(data);
    document.write(data + "\r\n");
    socket.emit('tcp', "For TCP");
  });
</script>

Таким образом, между HTTP-сервером и TCP-сервером в Node.js открывается сокет.

person Ravish    schedule 15.08.2012
comment
То есть 2 разных сервера? - person Lapidus; 25.05.2014
comment
@Ravis для отправки сообщения из веб-клиента. Я пытался отправить сообщение на http-сервер, которое заканчивается ошибкой Allow-origin-allow-origin. Это правильный способ отправить сообщение из веб-клиента или я делаю какую-то ошибку? я поднял вопрос stackoverflow.com/q/32999794/4657065. Спасибо за вашу помощь. - person Anandapriyan S.D; 12.10.2015

Если вам нужно общаться сервер-сервер, то веб-сокеты, вероятно, не лучший выбор. Попробуйте одну из библиотек RPC или просто используйте HTTP или собственный протокол.

person Andrey Sidorov    schedule 15.08.2012
comment
Эй, спасибо @Andrey и rdrey. Хотя у меня сокеты работают между TCP и HTTP-сервером в Node.js. Тем не менее, я бы определенно попробовал библиотеки RPC в этом случае. Большое спасибо. :) - person Ravish; 15.08.2012

Вы можете использовать socket.io или ws (только WebSocket) на Node.js в качестве клиента (не только в браузере).

var io = require('socket.io-client');
var socket = io.connect('http://IP address of Websocket server');
socket.on('news', function (data) {
  console.log(data);
  socket.emit('my other event', { my: 'data' });
});
person nguyenkha    schedule 15.08.2012
comment
Я попробовал это. Однако проблема в том, что он не может связаться с TCP-сервером, созданным на Node.js. то есть var app = require('net').createServer(handle); Но это работает, когда я меняю его на http. - person Ravish; 15.08.2012