2014-02-14 53 views
1

我试图从一个专用TCP端口13854代理json数据到一个公共网络套接字端口8080.为什么不能在浏览http://localhost:8080时得到任何数据?NodeJS帮助代理TCP端口数据到网络套接字

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

谢谢!

+0

只要浏览到'localhost:8080',就不会建立web套接字连接。 –

回答

1

我通过重组我的代码并保持套接字分开来解决了这个问题。无论出于何种原因,似乎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); 
    }); 
} 
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连接,而不是网络套接字连接。 我建议在本地创建一个HTML页面,并通过双击它来使用它(而不是通过你的服务器);稍后您可以在您的node.js服务器上托管该页面。 查看http://socket.io上的示例,以正确创建socket.io客户端。

相关问题