2012-06-07 5 views
121

Tôi đang điều tra nodejs/socket.io để trò chuyện trong thời gian thực và tôi cần một số lời khuyên để triển khai phòng.phòng socket.io hoặc không gian tên?

Điều nào là tốt hơn, sử dụng không gian tên hoặc sử dụng tính năng phòng để tách biệt hoàn toàn các rãnh gián điệp của nhau?

sự khác biệt kỹ thuật thực sự giữa phòng và không gian tên là gì?

Có sự khác biệt về sử dụng tài nguyên không?

Trả lời

165

Đây là những gì không gian tên và các phòng đều có chung (socket.io v0.9.8 - xin lưu ý rằng v1.0 tham gia viết lại hoàn toàn, vì vậy mọi thứ có thể đã thay đổi):

  • Cả không gian tên (io.of('/nsp')) và các phòng (socket.join('room')) được tạo ra ở phía máy chủ
  • nhiều không gian tên và nhiều phòng cổ phiếu cùng một kết nối (WebSocket)
  • Máy chủ sẽ truyền tin nhắn qua dây chỉ cho những khách hàng đó kết nối với/tham gia vào một nsp/phòng, tức lànó không chỉ là client-side lọc

Các khác biệt:

  • namespace được kết nối với các khách hàng sử dụng io.connect(urlAndNsp) (khách hàng sẽ được thêm vào namespace rằng chỉ khi nó đã tồn tại trên máy chủ)
  • phòng chỉ có thể được nối ở phía máy chủ (mặc dù tạo API ở phía máy chủ để cho phép khách hàng tham gia là đơn giản)
  • namespace có thể authorization protected
  • ủy quyền là không có sẵn với phòng, nhưng cho phép tùy chỉnh có thể được bổ sung vào nói trên, dễ tạo API trên máy chủ, trong trường hợp một bị bẻ cong về việc sử dụng phòng
  • phòng là một phần của một namespace (mặc định cho các không gian tên 'toàn cầu')
  • namespace luôn bắt nguồn từ phạm vi toàn cầu

Để không nhầm lẫn khái niệm với tên (phòng hoặc không gian tên), tôi sẽ sử dụng ngăn để tham chiếu khái niệm và hai tên khác cho triển khai của khái niệm. Vì vậy, nếu bạn

  • cần mỗi khoang uỷ quyền, không gian tên có thể là con đường dễ nhất để có
  • nếu bạn muốn ngăn phân cấp lớp (2 lớp max), sử dụng một sự kết hợp không gian tên/phòng
  • nếu ứng dụng phía máy khách của bạn bao gồm các phần khác nhau (không tự quan tâm đến các ngăn nhưng) cần được tách biệt với nhau, hãy sử dụng các không gian tên.

Ví dụ sau là ứng dụng khách lớn, trong đó các mô-đun khác nhau, có thể được phát triển riêng biệt (ví dụ: bên thứ ba), từng sử dụng socket.io độc lập, đang được sử dụng trong cùng một ứng dụng và muốn chia sẻ kết nối mạng đơn.

Không thực sự điểm chuẩn này, có vẻ như với tôi nếu bạn chỉ cần các ngăn đơn giản trong dự án của bạn để tách biệt và nhóm tin nhắn, một trong hai là tốt.

Bạn không chắc chắn nếu câu trả lời cho câu hỏi của bạn, nhưng nghiên cứu dẫn đến câu trả lời này ít nhất đã giúp tôi thấy rõ ràng hơn.

+3

Có điều gì quan trọng đã thay đổi sau phiên bản socket.io> = 1.0 không? – Xeroxoid

+1

Thay đổi trong phiên bản trước, đọc http://socket.io/docs/rooms-and-namespaces/ và câu trả lời này có thể hữu ích để hiểu các phòng về mọi thứ http://stackoverflow.com/questions/24041220/sending-message -to-a-specific-id-in-socket-io-1-0/24224146 # 24224146 –

+1

Chúng ta có thể nói không gian tên là một khu vực nhất định của ứng dụng web của tôi và phòng một nhóm khách hàng trong khu vực đó? – Onaiggac

9

Nó tùy thuộc vào những gì bạn muốn làm.

Sự khác biệt chính là phòng khó triển khai hơn. Bạn phải thực hiện một phương pháp để tham gia các phòng với mỗi lần tải lại trang.

Với namespace bạn chỉ cần viết var example = io.connect('http://localhost/example'); trong của bạn javascript client và khách hàng sẽ được tự động thêm vào trong không gian tên.

Ví dụ về sử dụng:

  • phòng: trò chuyện riêng tư.
  • không gian tên: trò chuyện của trang.
43

Đó là một câu hỏi cũ nhưng sau khi thực hiện một số nghiên cứu về chủ đề tôi thấy rằng câu trả lời được chấp nhận không rõ ràng trên một điểm quan trọng. Theo Guillermo Rauch mình (see link): mặc dù về mặt lý thuyết có thể tạo không gian tên động trên một ứng dụng đang chạy, bạn sử dụng chúng chủ yếu như các phần riêng biệt được xác định trước trong ứng dụng của bạn. Mặt khác, nếu bạn cần tạo các ngăn quảng cáo đặc biệt, khi đang di chuyển, để chứa các nhóm người dùng/kết nối, tốt nhất là nên sử dụng phòng.