1

[更新 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 = *") を設定するソリューションのいくつかの投稿ポイントを読みましたが、これはこの場合も機能していないようです。

4

1 に答える 1

0

オリジンは*、デフォルトで socket.io に設定されています。io.set("origin", "*");しかし、これはデフォルト値であるため、この関数を無視することができます。

var socket = io.connect('window.location.hostname')クライアント側のコードにもあることに気付きましたが、おそらくvar socket = io.connect(window.location.hostname)単一引用符なしで次のように述べています。heroku docs の使用をお勧めしますio.set("polling duration", 100);が、アドバイスの代わりに 100 に設定し10ます。それ以外の場合、コードに問題はなく、動作するはずです。

これらの修正が役に立たない場合は、ホスティングのせいにします. リアルタイム アプリケーションのデプロイに関しては、Heroku は非常に制約の多いプラットフォームです。したがって、彼らはここで何かを台無しにしている可能性があります。nodejitsu.com など、WebSocket もサポートしており、ポーリングに制限を課していない別の場所にデプロイして、そこで機能するかどうかを確認することをお勧めします。

于 2013-02-14T09:39:44.613 に答える