2013-02-14 3 views
0

[обновление 1] я узнал, что на самом деле io.connect('http://xxxxx.herokuapp.com') отправить запрос на xxxxx.herokuapp.com порт 3000: соединение работает, если запрос без номера порта , Я не указал порт в моем io.connect, как я могу избавиться от этого?Подключение к серверу Socket.io с сервера Rails

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 скрипт из локальной файловой системы

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 для подключения к Socket.io, размещенного на сервере node.js на localhost: 5000. Он работает так же, как на стороне клиента Javascript и Socket.io, размещенных на Heroku на том же порту.

socket_server.js размещен на XXXX.herokuapp.com

   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.html на XXXX.herokuapp.com же, как 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, на сервере Rails на YYYY.herokuapp.com и попытаться подключиться к серверу Socket.io на xxx.herokuapp.com, он не работает. ему удалось retreive 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 («происхождение = *»), но это, похоже, не работает в этом случае.

ответ

0

Происхождение установлено в * по умолчанию в socket.io. И это будет 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 и не накладывает никаких ограничений на опрос, чтобы увидеть, работает ли он там для вас.

+0

Я пытаюсь разместить socket.io на Nodejisui и указывать свой javascript на приложении rails на xxx.jit.su var socket = io.connect ('http://xxxxx.jit.su'); но по-прежнему имеет ту же проблему – WYH

+0

кажется, что это как-то связано с доменом, чем с хостингом. то есть[рабочий] клиент js на localhost: 3000 <==> socket.io на localhost: 5000. [рабочий] клиент js на xxx.herokuapp.com <==> socket.io на xxx.herokuapp.com [разбивка] клиент js на localhost: 4000 <==> socket.io на xxx.herokuapp.com – WYH

+0

здесь был задан аналогичный вопрос: http : //stackoverflow.com/questions/12439852/bridging-a-simple-node-js-socket-io-chat-app-with-a-rails-app-on-heroku/14875456#14875456 – WYH

Смежные вопросы