我正在尝试使用本地客户端测试一个简单的socket.io示例。这是我的代码:
服务器:
var sio = require('socket.io');
var io = sio.listen(8077, {log: false});
io.sockets.on('connection', function (socket) {
console.log('connection detected');
socket.on('hello', function(data){
console.log('hello received: ' + data);
});
});
客户端:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script src="socket.io-client/dist/socket.io.js" type="text/javascript"></script>
</head>
<body>
<script type="text/javascript">
var socket = io.connect('http://localhost:8077');
if(socket != undefined){
socket.emit('hello', 'this is a test');
}
</script>
</body>
</html>
如果我将我的客户端放在远程服务器上,它运行完美,但如果我尝试从本地运行我的客户端,我的浏览器会给我以下错误:
XMLHttpRequest cannot load http://localhost:8077/socket.io/1/?t=1343494806858.
Origin null is not allowed by Access-Control-Allow-Origin
我知道有一个http头可以解决http服务器中的这个问题,但我不知道套接字上下文中是否有类似的选项。我需要一个本地客户。我不想从额外的http nodejs服务器提供客户端代码。
答案 0 :(得分:4)
您是否尝试过设置server origins参数(它设置了您提到的标题)?:
var sio = require('socket.io');
var io = sio.listen(8077, {log: false, origins: '*:*'});
现在您还没有在本地访问该服务器,您确定要更新该行:
var socket = io.connect('http://localhost:8077');
包括远程服务器的ip(或域名,如果有的话):
var socket = io.connect('http://XX.XX.XX.XX:8077');
你能看到哪一行在控制台中返回错误(你使用带有firebug的chrome / ff?)。在if语句中,socket变量可能永远不会是未定义的。建议使用连接的方法是通过将回调附加到connect事件来等待它准备就绪,例如:
socket.on('connect', function () { // <-instead of the if
socket.emit('hello', 'this is a test');
}