2012-03-16 11 views
5

Próbuję utworzyć prostą aplikację WebSocket, używając frameworków Pyramid i socket.io. kod po stronie serwera:Jak używać Websockets z Pyramid i 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) 

kod Klient:

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

muszę tego kodu, aby korzystać z Web-gniazda do podłączenia, ale wraca do użyciem nagłówków XHR-odpytywania. Jak mogę to naprawić?

Z góry dzięki, Ivan.

Odpowiedz

8

Prawdopodobnie zajrzeć do najnowszej wersji gevent-socketio, a jego dokumentacja na http://gevent-socketio.readthedocs.org/

Głównym remont przeprowadzono w PyCon 2012 sprinty, John Anderson, Sébastien Béal i ja.

+0

Aby rzeczywiście odpowiedzieć na pytanie, powinien zostać przekazany obiekt {transports: ["websocket"]} jako drugi parametr wywołania io.Socket(), który używa wersji 0.6 biblioteki klienta. Jeśli używasz wersji 0.7+ biblioteki JS, nie jest ona ustawiona na serwerze. Musisz także użyć przeglądarki internetowej z włączoną obsługą gniazd (Chrome to taka, którą znam, działa). – abourget

+0

Rozwój gevent-socketio jest dość martwy, niewiele na nim liczę. –

+0

Ravi- Obie odpowiedzi w tym bieżniku wspominają przy użyciu gevent-socketio, co poleciłbyś zamiast tego użyć? – Amoliski

2

Możesz również rzucić okiem na pyramid_sockjs. Integruje się dobrze z Pyramid i używa sockjs, który spełnia tę samą rolę co socket.io i jest prawdopodobnie łatwiejszy do zrozumienia.

+3

To jest przestarzałe na korzyść gevent-socketio: https://github.com/abourget/gevent-socketio/ – Damian