2012-03-16 26 views
5

Estoy tratando de crear una aplicación WebSocket simple usando Pyramid y socket.io frameworks. código del lado del servidor:¿Cómo usar Websockets con Pyramid y socket.io?

from pyramid.response import Response 
from pyramid_socketio.io import SocketIOContext, socketio_manage 
import gevent 

def includeme(config): 
    ''' 
    This method is called on the application startup. 
    ''' 
    config.add_route('socket.io', 'socket.io/*remaining') 

class ConnectIOContext(SocketIOContext): 
    # self.io is the Socket.IO socket 
    # self.request is the request 
    def msg_connect(self, msg): 
     print "Connect message received", msg 
     self.msg("connected", hello="world") 

# Socket.IO implementation 
@view_config(route_name="socket.io") 
def socketio_service(request): 
    print "Socket.IO request running" 
    print request 
    retval = socketio_manage(ConnectIOContext(request)) 
    return Response(retval) 

El código de cliente:

<script> 
    var socket = null; 
    $(document).ready(function() { 
     socket = new io.Socket(null, null); 
     socket.on('connect', function() { 
     console.log("Connected"); 
     socket.send({type: "connect", userid: 123}); 
    }); 
    socket.on('message', function(obj) { 
     console.log("Message received"); 
     console.log("Message", JSON.stringify(obj)); 
     if (obj.type == "some") { 
      console.log("do some"); 
     } 
    }); 
    socket.on('error', function(obj) { 
     console.log("Error", JSON.stringify(obj)); 
    }); 
    socket.on('disconnect', function() { 
     console.log("Disconnected"); 
    }); 

    console.log("Connecting..."); 
    socket.connect(); 
}); 
</script> 

puedo necesitar este código para utilizar web de enchufe para la conexión, pero cae de nuevo a XHR-electoral. ¿Cómo puedo solucionarlo?

Gracias de antemano, Ivan.

Respuesta

8

Es probable que desee ver en la última versión de GEvent-socketio, y su documentación en http://gevent-socketio.readthedocs.org/

Una revisión a fondo se realizó en las carreras PyCon 2012, por John Anderson, Sébastien Beal y yo.

+0

Para responder realmente a la pregunta, debe haber un {transportes: ["websocket"]} objeto pasado como el segundo parámetro de la llamada io.Socket(), que está utilizando la versión 0.6 de la biblioteca del cliente. Si está utilizando la versión 0.7+ de la lib de JS, no está configurada en el lado del servidor. También debe usar un navegador web habilitado para sockets web (Chrome es uno que sé que funciona). – abourget

+0

gevent-socketio development está bastante muerto, no confío mucho en él. –

+0

Ravi- Ambas respuestas en esta pisada mencionan usar gevent-socketio, ¿qué recomendarías usar en su lugar? – Amoliski

2

También puede consultar pyramid_sockjs. Se integra bien con Pyramid y usa sockjs que cumple el mismo rol de socket.io y es posiblemente más simple de entender.

+3

Eso ha quedado en desuso en favor de gevent-socketio: https://github.com/abourget/gevent-socketio/ – Damian