2012-05-03 28 views
7

Là một thay thế cho Socket.io, có SockJS (https://github.com/sockjs/sockjs-client), có vẻ như được duy trì tốt hơn và ổn định hơn Socket.io.Cách tích hợp SockJS với một khung công tác web khác

Câu hỏi này là về sự hiểu biết khái niệm kiến ​​trúc của việc sử dụng SockJS với một khuôn khổ web, chẳng hạn, để xây dựng một ứng dụng chat

hiểu biết hiện tại của tôi là bạn cần SockJS-client và máy chủ SocketJS (trong tôi trường hợp, tôi có ý định sử dụng SockJS-Tornado (https://github.com/MrJoes/sockjs-tornado)) để có thể thực hiện giao tiếp kiểu websockets.

Nhưng SockJS (SockJS-client + SockJS-Tornado) kết hợp với khung web làm phần còn lại của công việc như thế nào (ví dụ: phục vụ trang, viết/đọc đến/từ db, v.v.). Ví dụ, thành phần SockJS-Tornado sẽ liên lạc với máy chủ web của khung công tác như thế nào? Đặc biệt, bất kỳ hướng làm điều này với web2py (một khung web python) được đánh giá cao.

+0

Bạn có thể sử dụng một hàng đợi thông điệp như RabbitMQ hoặc ZeroMQ. – igorw

+0

@ strongw, bạn đang nói rằng tôi có thể sử dụng hàng đợi thông báo để kết nối máy chủ SockJS-Tornado với máy chủ web của khung công tác, để công cụ SockJS-Tornado nhận được có thể được chia sẻ với khung công tác không? Bạn có thể vui lòng xây dựng? Cảm ơn. – MLister

+0

Nhân tiện, cũng có http://autobahn.ws/ – Alp

Trả lời

4

Bạn nói đúng, với SockJS bạn cần một máy chủ có khả năng sockjs và thư viện trình khách javascript trong trình duyệt.

Có nói chung là hai mô hình hội nhập, chúng ta hãy nói rằng bạn muốn sử dụng sockjs-cơn lốc xoáy:

  1. Bạn có thể có tất cả các trang web của bạn phục vụ từ Tornado. Với điều đó, hãy kéo sockjs-tornado vào một số đường dẫn, ví dụ 'http://mysite.com/sockjs'. Trong trường hợp này, cả trang web và sockj của bạn sẽ được phân phát từ miền mysite.com.
  2. Bạn có thể giữ trang web của mình bằng bất kỳ ngôn ngữ/khuôn khổ nào được viết và thêm sockjs-serveras một sự tương tự khác, dưới một miền khác, như. 'http://sockjs.mysite.com/sockjs'.

Ngoài ra, bạn có thể sử dụng bất kỳ biến thể nào - ví dụ: có hai máy chủ nội bộ nhưng hiển thị chúng dưới dạng một tên miền bằng cách sử dụng bộ nạp thông minh (như haproxy).

+1

cảm ơn các đề xuất. Tôi muốn biết thêm về các tùy chọn thứ hai mà bạn đã đề xuất. Đặc biệt, làm thế nào để giao diện SockJS-Tornado với máy chủ web được sử dụng bởi khuôn khổ. Ví dụ, công việc của một yêu cầu từ trình duyệt đến phía máy chủ (bao gồm một SockJS-Tornado và một máy chủ web của khung công tác) và ngược lại là gì? Cảm ơn. – MLister

+2

Giữ hai máy chủ riêng biệt. Một - ứng dụng cũ của bạn. Mới - sockjs-lốc xoáy. Sử dụng HAProxy để định tuyến nếu bạn muốn hiển thị nó dưới dạng một tên miền hoặc chỉ sử dụng hai tên miền riêng biệt. Nếu bạn cần giao tiếp giữa sockjs và ứng dụng của bạn - hãy sử dụng Redis Pub/sub, RabbitMQ hoặc zeromq để trao đổi thông điệp giữa hai người. – Marek

+0

hi @Marek. làm thế nào để tôi trao đổi tin nhắn giữa các ứng dụng và sockjs nơi tôi chỉ nên có 2 máy chủ riêng biệt? thiết lập hiện tại của tôi là tôi phải chạy một phần ba .. kịch bản máy chủ zmq nơi 4 ổ cắm bị ràng buộc. receive_from_server.bind ("tcp: // *: 5561") # zmq.PULL forwarder_to_server.bind ("tcp: // *: 5562") # zmq.PUSH receiver_from_websocket.bind ("tcp: // * : 5563 ") # zmq.PULL forwarder_to_websocket.bind (" tcp: // *: 5564 ") # zmq.PUSH –

1

Nếu bạn đang sử dụng web2py làm khung làm việc, bạn có thể xem một comet_messaging.py trong gluon/contrib. Nó cung cấp một chức năng (comet_send) để nhận tin nhắn từ ứng dụng web2py cho khách hàng websocket của bạn. Nó dựa trên cơn lốc xoáy (hỗ trợ SockJS) nhưng DistributeHandler có thể phân lớp một kết nối SockJS để cung cấp hỗ trợ vận chuyển dự phòng. Trong cách tiếp cận này, khách hàng của bạn gửi tin nhắn thông qua các yêu cầu GET hoặc POST HTTP điển hình được xử lý bởi bộ điều khiển web2py (hoặc khung công tác khác) và nhận tin nhắn từ bộ điều khiển web2py gọi comet_messaging.comet_send() gửi yêu cầu bài đăng đến trường hợp lốc xoáy sau đó nó vào danh sách người nghe.

Các dòng sửa đổi trong comet_messaging cái nhìn tương tự (Thông báo mở trở nên on_open):

class DistributeHandler(sockjs.tornado.SockJSConnection): 
    def on_open(self, r): 
    group,token,name = [None, None, None] 
    self.group = group or 'default' 
    self.token = token or 'none' 
    self.name = name or 'anonymous' 

urls=[ 
    (r'/', PostHandler), 
    (r'/token', TokenHandler), 
    (r'/realtime', DistributeHandler)] 

Thông báo tôi phải loại bỏ các nhóm regex trong DistributeHandler URLSpec vì sockJS-cơn lốc xoáy đã nghẹt thở trên đó. Vẫn cố gắng tìm ra cách lấy tham số từ đường dẫn đến trình xử lý on_open.

0

này cung cấp một câu trả lời đầy đủ về cách tích hợp SockJS vào Django: https://stackoverflow.com/a/10950702/675065

Về cơ bản bạn cần:

  • Tornado + SockJS-Tornado
  • Redis + Brukva

tôi sử dụng cấu hình này trong dự án của riêng tôi và nó hoạt động khá tốt.

Hoặc: Bạn thử cách autobahn: http://autobahn.ws/ (tôi đã không thử nó ra chưa)