2012-03-16 29 views
5

Tôi đang cố tạo một ứng dụng WebSocket đơn giản bằng cách sử dụng khung công tác Pyramid và socket.io. server-side code:Cách sử dụng Websockets với Pyramid và 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) 

Khách hàng mã:

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

tôi cần mã này để sử dụng web-socket cho kết nối, nhưng nó rơi trở lại XHR-bỏ phiếu. Làm cách nào để khắc phục sự cố?

Cảm ơn trước, Ivan.

Trả lời

8

Bạn có thể muốn xem xét việc phát hành mới nhất của gevent-socketio, và tài liệu của mình tại http://gevent-socketio.readthedocs.org/

Một sự thay đổi lớn đã được thực hiện tại chạy nước rút PyCon 2012, John Anderson, Sébastien Beal và bản thân mình.

+0

Để thực sự trả lời câu hỏi, phải có đối tượng {transports: ["websocket"]} được truyền vào như tham số thứ hai của cuộc gọi io.Socket(), đang sử dụng phiên bản 0.6 của thư viện ứng dụng khách. Nếu bạn đang sử dụng phiên bản 0.7+ của JS lib, nó không được đặt ở phía máy chủ. Bạn cũng phải sử dụng trình duyệt web đã bật trình duyệt web (Chrome là một trong những ứng dụng mà tôi biết không hoạt động). – abourget

+0

phát triển gevent-socketio là khá chết, không dựa nhiều vào nó. –

+0

Ravi- Cả hai câu trả lời trong đề cập đến tread này sử dụng gevent-socketio, bạn sẽ khuyên bạn nên sử dụng cái gì thay thế? – Amoliski

2

Bạn cũng có thể xem pyramid_sockjs. Nó tích hợp tốt với Kim tự tháp và sử dụng sockjs đáp ứng vai trò giống nhau của socket.io và được cho là dễ hiểu hơn.

+3

Điều đó đã không được chấp nhận vì lợi ích của gevent-socketio: https://github.com/abourget/gevent-socketio/ – Damian

Các vấn đề liên quan