我正在尝试将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");
});
谢谢!
答案 0 :(得分: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
客户端。
答案 1 :(得分: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);
});
}