【问题标题】:Create WebSockets between a TCP server and HTTP server in node.js在 node.js 中的 TCP 服务器和 HTTP 服务器之间创建 WebSocket
【发布时间】:2012-08-16 03:41:37
【问题描述】:

我使用 Node.js 创建了一个 TCP 服务器,它监听客户端连接。 我需要在 Node.js 中再次将数据从 TCP 服务器 传输到 HTTP 服务器,可能通过 Websocket (socket.io)。

但是,我不知道如何创建这样的连接,以便 TCP 服务器能够通过 Websocket 将数据推送到 HTTP 服务器。

非常感谢。

【问题讨论】:

  • 你可以使用socket.io-client通过socket.io连接HTTP服务器
  • @nguyenkha : 你能帮我看看代码示例吗?
  • 从 socket.io 示例中获取代码 socket.io/#how-to-use 用于客户端,仅 JavaScript 部分和 var io = require('socket.io-client');

标签: node.js websocket socket.io tcpserver httpserver


【解决方案1】:

我尝试了很多方法来完成这项工作。大部分时间我都依靠 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>

这样,Node.js 中的 HTTP 服务器和 TCP 服务器之间就打开了一个套接字。

【讨论】:

  • 那么 2 个不同的服务器?
  • @Ravis 从 Web 客户端发送消息我尝试将消息发布到以 Allow-origin-allow-origin 错误结尾的 http 服务器。这是从网络客户端发布消息的正确方法还是我做错了什么?我提出了一个问题stackoverflow.com/q/32999794/4657065。感谢您的帮助。
【解决方案2】:

如果您需要服务器与服务器之间的通信,那么 websockets 可能不是最佳选择。尝试RPC libraries 之一,或者只使用 HTTP 或您自己的协议。

【讨论】:

  • 嘿,谢谢@Andrey 和 rdrey。虽然我让套接字在 Node.js 中的 TCP 和 HTTP 服务器之间工作。但是,在这种情况下,我肯定会尝试使用 RPC 库。非常感谢。 :)
【解决方案3】:

您可以在 Node.js 上使用 socket.io 或 ws(仅限 WebSocket)作为客户端(不仅在浏览器中)

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' });
});

【讨论】:

  • 我试过这个。但是,问题在于它无法与在 Node.js 上创建的 TCP 服务器通信。即var app = require('net').createServer(handle); 但是当我将其更改为 http 时它可以工作。
猜你喜欢
  • 2014-09-22
  • 1970-01-01
  • 2011-08-13
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 2012-10-11
相关资源
最近更新 更多