[更新1]
我发现io.connect('http://xxxxx.herokuapp.com')
实际上在xxxxx.herokuapp.com端口3000上发出了请求:
如果请求是WITHOUT端口号,则连接有效。我没有在我的io.connect中指定一个端口,我怎么能摆脱它呢?
Request URL:http://xxxxx.herokuapp.com:3000/socket.io/1/?t=1360853265439
Request Headersview source
Cache-Control:max-age=0
Origin:http://localhost:3000
Referer:http://localhost:3000/about
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17
Query String Parametersview sourceview URL encoded
t:1360853265439
[更新2] 为了比较,这是我从本地文件系统
运行java脚本时成功连接的HEAD Request URL:http://xxxxx.herokuapp.com/socket.io/1/?t=1360854705943
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host :xxxxx.herokuapp.com
Origin:null
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17
[更新3] 将端口设置为80似乎正在工作
var socket = io.connect('http://xxxxx.herokuapp.com',{port:80});
[问题] 我打算在一台主机上设置socket.io,与另一台主机上的Rails应用程序通信。当客户端Javascript托管在localhost:3000上以连接到localhost:5000上node.js服务器上托管的Socket.io时,一切正常。当客户端Javascript和Socket.io在同一端口上的Heroku上托管时,它也可以正常工作。
在XXXX.herokuapp.com上托管的socket_server.js
var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, fs = require('fs')
, i = 0
io.configure(function () {
io.set("origin = *");
io.set("transports", ["xhr-polling"]);
io.set("polling duration", 100);
});
var port = process.env.PORT || 5000; // Use the port that Heroku provides or default to 5000
app.listen(port, function() {
console.log(">>>>>>socket server up and running on port: "+port);
});
function handler (req, res) {
fs.readFile(__dirname + '/socket.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading socket.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
console.log(">>>>>>client connected through socket");
socket.emit('news', '>>>>>>server say hello to client', i);
console.log('>>>>>>server say hello to client' +'['+i+']')
socket.on('my other event', function (data) {
socket.emit('news', i);
i++;
console.log(data +'['+i+']');
});
});
如果我将客户端javascript放在XXXX.herokuapp.com上的socket.html中,就像socket.io一样,它的行为符合预期。
<div id='sandbox'>sandbox</div>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('window.location.hostname');
$('#sandbox').append('<div> lora </div>');
socket.on('news', function (data, index) {
$('#sandbox').append('<div>' + data + ' ' + index + '</div>');
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
但是,如果我将客户端Javascript放在YYYY.herokuapp.com上的Rails服务器上并尝试连接到xxx.herokuapp.com上的Socket.io服务器,它就不起作用。它设法在服务器上检索socket.io.js但是io.connect('http://xxxxx.herokuapp.com')没有得到服务器的任何响应。
<div id='sandbox'>sandbox</div>
<script src="http://xxxxx.herokuapp.com/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://xxxxx.herokuapp.com');
$('#sandbox').append('<div> lora </div>');
socket.on('news', function (data, index) {
$('#sandbox').append('<div>' + data + ' ' + index + '</div>');
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
我读了一些关于设置io.set(“originins = *”)的解决方案,但这似乎也不适用于这种情况。
答案 0 :(得分:0)
默认情况下,在socket.io中,Origins设置为*
。它将是io.set("origin", "*");
,但由于这是默认值,您可以忽略此函数。
我注意到您的客户端代码中也有var socket = io.connect('window.location.hostname')
,您可能会问:var socket = io.connect(window.location.hostname)
没有单引号。 heroku文档建议使用io.set("polling duration", 100);
但是你将它设置为100而不是建议的10
。除此之外,我没有看到你的代码有任何问题,它应该可以工作。
如果这些修复没有帮助,那么我会责怪你的托管。在部署实时应用程序时,Heroku是一个非常严格的平台。所以可能是他们在这里弄乱了什么。我建议尝试部署在其他地方,例如nodejitsu.com,它也支持WebSockets,并且不对轮询施加任何限制,以查看它是否适合您。