【问题标题】:NodeJS help proxy TCP port data to web socketNodeJS 帮助代理 TCP 端口数据到 web socket
【发布时间】:2014-02-19 04:08:32
【问题描述】:

我正在尝试将 json 数据从私有 TCP 端口 13854 代理到端口 8080 上的公共 Web 套接字。为什么我在浏览 http://localhost:8080 时无法获取任何数据?

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

var proxyPort = 8080;
var serviceHost = 'localhost';
var servicePort = 13854;

function httpHandler (req, res) {
  res.setHeader("Access-Control-Allow-Origin", "http://example.com");
  res.end();
}

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

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

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

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

        tcpClient.on('data', function(data) {
        data = "" + data
        //send format request to socket
        if (data[0] != '{'){
            s.write(JSON.stringify({
                enableRawOutput : false,
                format : "Json"
            }) + "\n");
            return;
        }
            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");
});

谢谢!

【问题讨论】:

  • 仅仅浏览到 `localhost:8080' 你并没有建立一个 web socket 连接。

标签: node.js tcp websocket


【解决方案1】:

首先,换行

res.setHeader("Access-Control-Allow-Origin", "http://example.com");

res.setHeader("Access-Control-Allow-Origin", "*");

由于您正在浏览localhost,您的请求将被拒绝,因为来源不是http://example.com

其次,为了接收数据,您必须从客户端建立一个 Web 套接字连接。只需浏览到 http://localhost:8080 就会创建一个 http 连接,而不是 Web 套接字连接。 我建议在本地创建一个 HTML 页面并通过双击它来使用它(而不是通过你的服务器);稍后您可以在您的node.js 服务器上托管该页面。 查看http://socket.io 上的示例以正确创建socket.io 客户端。

【讨论】:

    【解决方案2】:

    我通过重新组织我的代码并保持套接字分开来解决了这个问题。无论出于何种原因,似乎都不需要 Access-Control-Allow-Origin。我正在使用一个名为“Simple Web Socket Client”的 Chrome 插件来解决需要编写自己的客户端的问题。

    var ws = require("nodejs-websocket"),
        net = require("net");
    
    var server = ws.createServer(function(conn) {
         conn.on("close", function(code, reason) {
            console.log("Connection closed");
        });
    }).listen(8080);
    
    var tcp = new net.Socket();
    console.log('connecting to 127.0.0.1:13854');
    
    tcp.connect(servicePort, '127.0.0.1', function() {
    
        //this socket requires sending data on connection
        tcp.write(JSON.stringify({
                enableRawOutput: false,
                format: "Json"
        }) + "\n");
    });
    
    tcp.on("data", function(data) {
        if (server == null || server.connections == null) {
            return;
        }
    
        //broadcast message:
        server.connections.forEach(function(conn) {
            conn.sendText(data);
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-17
      • 2015-08-17
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多