2012-03-16 15 views
5

Sto provando a creare una semplice applicazione WebSocket usando i framework Pyramid e socket.io. codice lato server:Come utilizzare Websockets con Pyramid e 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) 

Codice 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> 

ho bisogno di questo codice per utilizzare web-socket per la connessione, ma cade di nuovo a XHR-polling. Come posso risolvere il problema?

Grazie in anticipo, Ivan.

risposta

8

probabilmente avrete bisogno di guardare l'ultima release di gevent-socketio, e la relativa documentazione presso http://gevent-socketio.readthedocs.org/

Un'importante revisione è stato fatto a sprint PyCon 2012, da John Anderson, Sébastien Béal e me.

+0

Per rispondere effettivamente alla domanda, dovrebbe esserci un {transports: ["websocket"]} oggetto passato come secondo parametro della chiamata io.Socket(), che utilizza la versione 0.6 della libreria client. Se stai usando la versione 0.7+ della lib di JS, non è impostata sul lato server. È inoltre necessario utilizzare un browser Web con socket Web (Chrome è uno che so che funziona). – abourget

+0

Lo sviluppo di gevent-socketio è piuttosto scadente, non fare molto affidamento su di esso. –

+0

Ravi - Entrambe le risposte in questo battistrada menzionano l'utilizzo di gevent-socketio, cosa preferiresti invece usare? – Amoliski

2

Si può anche dare un'occhiata a pyramid_sockjs. Si integra bene con Pyramid e utilizza sockjs che svolge lo stesso ruolo di socket.io ed è probabilmente più semplice da capire.

+3

Che è stato dichiarato obsoleto a favore di gevent-socketio: https://github.com/abourget/gevent-socketio/ – Damian