Sự khác biệt giữa socket và websocket?


178

Tôi đang xây dựng ứng dụng web cần liên lạc với ứng dụng khác bằng các kết nối ổ cắm. Đây là lãnh thổ mới đối với tôi, vì vậy muốn chắc chắn rằng các socket khác với websockets . Có vẻ như chúng chỉ giống nhau về mặt khái niệm.

Hỏi vì ban đầu tôi dự định sử dụng Django làm nền tảng cho dự án của mình, nhưng trong bài viết SO tôi đã liên kết ở trên, rõ ràng là không thể có websockets (hoặc ít nhất là không đáng tin cậy, ngay cả với những thứ như django-websockets ) bằng cách sử dụng thiết lập Django ưa thích (Apache với mod_wsgi). Tuy nhiên, tôi đã tìm thấy các bài đăng khác tình cờ nhập mô-đun ổ cắm của Python cho một cái gì đó đơn giản như lấy tên máy chủ của máy chủ .

Vì thế:

  • Họ có thực sự khác nhau?
  • Có lý do nào để không sử dụng Django cho một dự án dựa trên việc thiết lập kết nối ổ cắm với máy chủ bên ngoài không?

Câu trả lời:


141

Để trả lời câu hỏi của bạn.

  1. Mặc dù họ đạt được (nói chung) những điều tương tự, vâng , họ đang thực sự khác nhau. WebSockets thường chạy từ các trình duyệt kết nối với Máy chủ ứng dụng qua giao thức tương tự HTTP chạy trên TCP / IP . Vì vậy, chúng chủ yếu dành cho các Ứng dụng Web yêu cầu kết nối vĩnh viễn với máy chủ của nó. Mặt khác, ổ cắm đơn giản là mạnh mẽ và chung chung hơn. Chúng chạy trên TCP / IP nhưng chúng không bị hạn chế đối với các trình duyệt hoặc giao thức HTTP . Chúng có thể được sử dụng để thực hiện bất kỳ loại giao tiếp.
  2. Không, không có lý do.

128
WebSockets không giống với HTTP. Chúng là các ổ cắm bình thường với một số khung và bắt tay tương thích HTTP. Cái bắt tay tương thích HTTP chỉ là cho phép kết nối WebSocket trên cùng một cổng mà máy chủ web đang chạy (để máy chủ web có thể chuyển tiếp chúng), nhưng khi kết nối được thiết lập, máy chủ web sẽ không ở trong vòng lặp. WebSockets không giới hạn đối với máy khách trình duyệt. Xem libwebsocket có cả máy khách không có trình duyệt và máy chủ.
kanaka

14
ĐỒNG Ý. Tôi hiểu ... Vì tôi không thể xóa câu trả lời được chấp nhận này, tôi vui lòng yêu cầu bạn chỉnh sửa nó với thông tin chính xác. Cảm ơn!
Pablo Santa Cruz

2
Bạn có thể xây dựng các máy khách websocket và sử dụng chúng bên ngoài các trình duyệt. Giao thức websocket là HTTP 1.1 với kết nối được nâng cấp thành "websocket."
Roger F. Gay

2
@huggie không. Có một chút khung hình: tools.ietf.org/html/rfc6455#section-5 (2 byte cho các tin nhắn nhỏ).
kanaka

2
@NiCkNewman có lẽ đó là một câu hỏi riêng biệt tốt. Chi phí đóng khung là tối thiểu và không phải là vấn đề. Vấn đề với WebSockets cho mạng MMO là hai lần: đó chỉ là máy chủ của khách và đó là TCP (dựa trên luồng). Để có hiệu suất mạng MMO tốt, bạn cũng cần kết nối mạng ngang hàng trực tiếp và bạn cần datagram (độ trễ thấp nhất quán quan trọng hơn việc nhận mọi gói tin). Tin vui là WebRTC DataChannel có cả hai thuộc tính này nên nó sẽ bắt đầu lấp đầy khoảng trống và cho phép chơi trò chơi AAA MMO đầy đủ trong trình duyệt.
kanaka

21

Websockets sử dụng ổ cắm trong việc thực hiện của họ. Websockets dựa trên một giao thức chuẩn (hiện đang trong cuộc gọi cuối cùng, nhưng chưa phải là cuối cùng) xác định kết nối "bắt tay" và thông báo "khung". Hai bên thực hiện thủ tục bắt tay để chấp nhận kết nối và sau đó sử dụng định dạng tin nhắn tiêu chuẩn ("khung") để truyền tin nhắn qua lại.

Tôi đang phát triển một khung cho phép bạn giao tiếp trực tiếp giữa máy với máy với phần mềm đã cài đặt. Nó có thể phù hợp với mục đích của bạn. Bạn có thể theo dõi blog của tôi nếu bạn muốn: http://highlevellogic.blogspot.com/2011/09/websocket-server-demonstration_26.html


11

Bạn sẽ phải sử dụng WebSockets (hoặc một số mô-đun giao thức tương tự, ví dụ như được hỗ trợ bởi plugin Flash) vì một ứng dụng trình duyệt thông thường không thể mở ổ cắm TCP thuần túy.

Các Socket.IOmô-đun có sẵn node.jscó thể giúp rất nhiều, nhưng lưu ý rằng nó không phải một module WebSocket tinh khiết theo đúng nghĩa của nó.

Đây thực sự là một mô-đun truyền thông chung hơn có thể chạy trên đầu trang các giao thức mạng khác nhau, bao gồm cả WebSockets và ổ cắm Flash.

Do đó, nếu bạn muốn sử dụng Socket.IOở cuối máy chủ, bạn cũng phải sử dụng mã máy khách và đối tượng của họ. Bạn không thể dễ dàng thực hiện các WebSocketkết nối thô đến socket.iomáy chủ vì bạn phải mô phỏng giao thức tin nhắn của họ.


11

WebSocket chỉ là một giao thức cấp ứng dụng khác trên giao thức TCP, giống như HTTP.

Một số đoạn trích <Spring in Action 4> được trích dẫn bên dưới, hy vọng nó có thể giúp bạn hiểu rõ hơn về WebSocket.

Ở dạng đơn giản nhất, WebSocket chỉ là kênh liên lạc giữa hai ứng dụng (không nhất thiết phải có trình duyệt) ... Giao tiếp WebSocket có thể được sử dụng giữa mọi loại ứng dụng , nhưng việc sử dụng WebSocket phổ biến nhất là để hỗ trợ giao tiếp giữa ứng dụng máy chủ và ứng dụng dựa trên trình duyệt.


2

Về câu hỏi của bạn (b), hãy lưu ý rằng thông số kỹ thuật của Websocket chưa được hoàn thiện. Theo W3C :

Người thực hiện cần lưu ý rằng đặc điểm kỹ thuật này không ổn định.

Cá nhân tôi cho rằng Websockets là waaay quá chảy máu để sử dụng hiện tại. Mặc dù có lẽ tôi sẽ thấy chúng hữu ích trong một năm hoặc lâu hơn.


Còn bây giờ, 9 năm sau thì sao?
Venryx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.