2011-12-12 32 views
5

Soy un novato real con Node.js y Socket.io, así que tengan paciencia si esta es una pregunta tonta.¿Por qué es lenta la conexión de Socket.io en Safari y Chrome?

Configuré una maniquí muy básico en Heroku para probar Socket.io. Todo lo que puede hacer es hacer clic en un botón y todos los navegadores conectados verán un mensaje en consecuencia. Esto funcionó muy bien cuando el servidor se estaba ejecutando localmente. Ahora que está en Heroku veo problemas de conexión en Safari y Chrome. La conexión inicial se retrasa durante aproximadamente 10 segundos, y obtengo un error 503 en la primera llamada de io.connect('http://myapp.heroku.com/').

Las cosas funcionan bien con una conexión bastante inmediata en Firefox e Internet Explorer.

Se puede ver la aplicación en acción aquí: http://sprain.ch/socketio/

¿Alguna idea sobre lo que podría causar este problema y cómo solucionarlo?

+0

Puedo reproducir el comportamiento en Firefox también. Las dos primeras llamadas vuelven rápidamente, pero después de la tercera parece que el servidor tarda más de 20 segundos en responder. http://bit.ly/rtGkCD – SuitedSloth

+0

No lo reproduje en Firefox, pero en Chrome lo hice. Parece algo extraño, tal vez es un problema con Heroku o algo así. @sprain ¿Qué versión de Socket.IO está usando y qué transportes están habilitados? – alessioalex

+0

Yo uso Socket.io 0.7. – sprain

Respuesta

3

algunas cosas:

  • me gustaría sugerir que utilizan estos ajustes: http://devcenter.heroku.com/articles/using-socket-io-with-node-js-on-heroku

  • simplemente tratar "io.connect()" en lugar de tratar de especificar la URL manualmente. SocketIO tiene algunos mecanismos de descubrimiento integrados bastante sólidos para hablar con el servidor local independientemente de lo que sea ese host.

  • No hay nada intrínsecamente lento en Heroku + Socket.IO (hablando por experiencia), por lo que me hace creer que hay algo más en su código. Si pudieras compartir un poco más, sería más fácil de diagnosticar.

También FWIW esa página que enlazó simplemente tiene un texto que dice "¡ayúdame!" y sin botón

+0

La configuración de socket.io en el servidor fue la solución para mí cuando se ejecutaba en heroku. ¡Gracias!. –

7

Puede reducir el tiempo de espera utilizado para la primera conexión de websocket utilizando el parámetro "connect timeout" (que es 10 segundos por defecto).

Usted puede tratar de reducir el tiempo de espera a 1 segundo usando:

io.connect('http://myapp.heroku.com/',{'connect timeout': 1000}); 
4

Es porque no son compatibles con websockets. Por lo tanto, socket.io agota el tiempo tratando de usar Websockets antes de recurrir al uso de XHR Polling, que no es lo mismo, pero podría estar bien para sus propósitos (?). Como el enlace en el post de Aashay sugiere, añadir este código a sus server.js o app.js archivo:

io.configure(function() { 
    io.set("transports", ["xhr-polling"]); 
    io.set("polling duration", 10); 
}); 

pero esto no es lo mismo que utilizar realmente websockets ..! Por ejemplo, en OpenShift.com ahora puede conectarse a través del puerto 8000 a su aplicación y luego realmente utiliza websockets, mientras que el puerto predeterminado molestamente no lo admite debido a problemas con Apache.

+0

Chrome soporta tomas a partir de 2009: http://blog.chromium.org/2009/12/web-sockets-now-available-in-google.html – AlienWebguy

Cuestiones relacionadas