2014-02-14 52 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客戶端。

相關問題