[更新 1]io.connect('http://xxxxx.herokuapp.com')
xxxxx.herokuapp.com ポート 3000 で実際にリクエストを送信する
ことがわかりました: リクエストがポート番号なしの場合、接続は機能します。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をsocket.ioと同じようにXXXX.herokuapp.comのsocket.htmlに配置すると、期待どおりに動作します。
<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>
ただし、YYYY.herokuapp.com の Rails サーバーにクライアント側の Javascript を配置し、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("origins = *") を設定するソリューションのいくつかの投稿ポイントを読みましたが、これはこの場合も機能していないようです。