Node.js Socket.IO仅在本地工作
我有这个Node.JS服务器:Node.js Socket.IO仅在本地工作,node.js,socket.io,Node.js,Socket.io,我有这个Node.JS服务器: var app = require('express')(); var server = app.listen(80); var io = require('socket.io').listen(server); var posx = 10; var posy = 10; app.get('/', function (req, res) { res.sendfile( __dirname + '/index.html' ); }); io.socket
var app = require('express')();
var server = app.listen(80);
var io = require('socket.io').listen(server);
var posx = 10;
var posy = 10;
app.get('/', function (req, res) {
res.sendfile( __dirname + '/index.html' );
});
io.sockets.on('connection', function (socket) {
socket.emit('start', {
x: posx,
y: posy
});
socket.on('newpos', function (data) {
posx = data["x"];
posy = data["y"];
socket.broadcast.emit('move', { x: posx, y: posy });
});
});
客户端代码:
var socket = io.connect('http://localhost');
socket.on('start', function (data) {
$("#pointer").animate({
'top': data["y"],
'left': data["x"]
}, 0);
});
socket.on('move', function (data) {
$("#pointer").animate({
'top': data["y"],
'left': data["x"]
}, "slow");
});
$("#pointer").draggable({
stop: function(event, ui) {
var pos = $("#pointer").position();
socket.emit('newpos', {
'x': pos.left,
'y': pos.top
});
}
});
问题是它似乎只在本地起作用。
在ubuntu chrome上,我得到:
XMLHttpRequest cannot load http://localhost/socket.io/1/?t=1344711676473. Origin http://192.168.1.130 is not allowed by Access-Control-Allow-Origin.
在mac电脑上,我对同一个文件有一个GET错误
你知道问题出在哪里吗?将app.listen(80)改为app.listen(80,'192.168.1.130')这样,你从socket.io发来的URL应该是正确的。即使您在本地计算机上尝试,也要确保从浏览器中的192.168.1.130访问它。站点的域与它的宿主位置无关,它与您访问它所使用的URL有关 即使“192.168.1.130”和“localhost”解析为同一台服务器,它们也被视为不同的域 因此,由于您有客户端代码:
var socket = io.connect('http://localhost');
您正在连接到域localhost。如果客户端代码是由localhost提供的,您就可以了,但是如果您是从另一个域(例如192.168.1.130)加载客户端,那么您将面临问题。从浏览器和服务器的角度来看,您很容易成为试图访问该服务的陌生人
要解决此问题,请将客户端套接字创建更改为:
var socket=io.connect('192.168.1.130')代码>
你应该解决你的问题
但实际上,您应该完全删除该参数并尝试运行:
var socket=io.connect()代码>
这样,它将默认为您所基于的任何域,并且它将在本地主机、IP以及最终使用的域名上工作。不走运。。还是一样的错误。此外,我认为将本地IP设置为本地IP不是一个好主意,因为我希望我的服务器可以从内部网外部访问。您的客户端代码是什么?哦,天哪。。。太蠢了!!!完全忘记了。。。我的问题值得一提。不,这是一个容易犯的错误!这个问题将帮助其他面临类似问题的人;你会怎么做?同意,很容易犯错误。在Socket.io1.x上,我只需要使用:var Socket=io()代码>不需要.connect();我很高兴你没有删除这个,非常方便,现在我可能永远不会忘记它