Avatar
0
Nguyễn Thái Sơn Professional
Nguyễn Thái Sơn Professional
Websocket, Socket, Long Pooling, server event
Anh ơi anh có thể chia sẻ sự khác biệt Websocket, Socket, Long Pooling, server event.... được không ạ, giữa Websocket và Socket em hay bị nhầm, em đọc nhiều bài viết rồi nhưng không biết khi nào dùng Websocket, khi nào dùng Socket. Vì sao ứng dụng chat cần dùng socket mà không dùng websocket
  • Answer
Remain: 5
2 Answers
Avatar
monkey Professional
monkey Professional
  1. Socket: là tầng thấp nhất, dữ liệu sẽ ở dạng byte bit, em sẽ cần ghép nối dữ liệu để nó có ý nghĩa.
  2. Long Pooling: được xây dựng dựa trên http (và http dựa trên socket), khi 1 request từ client gọi đến server thì server sẽ không ngắt kết nối khi trả lại response mà nó giữ kết nối này để trao đổi cho những message tiếp theo. Tuy nhiên Long Pooling cũng có dữ liệu ở dạng byte bit và em cũng phải tự ghép nối lại để có được dữ liệu có ý nghĩa
  3. Websocket bản chất vẫn là Long pooling, nhưng message sẽ được tiêu chuẩn hoá theo các fragment và frame theo 1 giao thức chung, từ đó mà mọi trình duyệt hay các ứng dụng đều có thể sử dụng websocket, tuy nhiên thư viện websocket cho phần ứng dụng mobile với desktop cũng còn ít.
  4. Em có thể sử dụng websocket trong mọi trường hợp, còn đối với socket thì phù hợp hơn với mobile và desktop và hiện nay các trình duyệt mới chỉ hỗ trợ tốt nhất cho websocket mà thôi.
  • 1
  • Reply
Avatar
Thành Lê Văn Professional
Thành Lê Văn Professional
Hmm, khác biệt là có và nhiều đó, nên đánh giá các tiêu chí trước khi thực hiện lựa chọn công  nghệ phù hợp.

Có thể chia ra theo thứ tự như sau:

1: Socket

(Stream Socket, Datagram Socket, Websocket, Unix socket )

2: Ajax Polling

3: Ajax  Long Pooling

4: Server Sent Events

5: Web socket

1: Socket

Hiểu đơn giản và ngắn gọn thì Socket là 1 cách để nói chuyện giữa các Processes trên cùng 1 máy tính hoặc 2 máy tính khác nhau (Nếu chưa hiểu Processes là gì thì có thể lên google hoặc nói vs mình)

Ví dụ cùng 1 máy : Ứng dụng của bạn kết nối đến mysql được cài trên máy của bạn Ví dụ 2 máy khác nhau: Ứng dụng dụng của bạn kết nối đến Mysql được cài trên server cloud.

2: Ajax Polling Đây là 1 trong các cách thức mà các web thời xưa muốn cập nhật dữ liệu realtime.

Với Ajax Polling, thì tại web client sẽ sử dụng javascript định kỳ 2s gửi một request đến server để yêu cầu thông tin mới (Sử dụng Ajax).

Ví dụ về mạng xã hội với chức năng tin nhắn :

Để biết có tin nhắn mới hay không thì client định kỳ mỗi 2s sẽ call 1 API  lên Server để hỏi xem có tin nhắn mới hay không.

Xưa có 1 mạng xã hội của việt nam (Mình xin không kể tên) có dùng cách này, nhưng giờ chuyển sang web socket rồi.

3: Ajax  Long Pooling

Với Ajax Long Pooling thì cũng tương tự Ajax Polling nhưng nó nâng cao hơn.

Với Ajax Long Pooling thì cũng sử dụng việc gửi request định kỳ lên server để kiểm tra xem có dữ liệu mới hay không.

Tuy nhiên có 1 cái khác biệt đó là khi server chưa có data mới thì server sẽ chưa trả response về. Chỉ khi nào có data thì server mới trả data (Tại thời điểm chưa có data, reqeust vẫn trong trạng thái xử lý)

Với cách thức này thì lượng request gửi lên server sẽ được giảm bớt. Khí có dữ liệu mới sẽ xử lý và sẽ gửi 1 reuqest mới chờ dữ liệu mới

4: Server Sent Events Có thể bạn không biết, SSE được sử dụng sớm hơn cả webSocket, năm 2006 SSE đã được browser opera phát triển và đưa vào trên trình duyệt của họ.

SSE sẽ rất khác so với websocket (Nhưng cảm giác giống web socket ngoại trừ việc data 1 chiều từ server gửi đến client)

Với SSE thì sẽ theo kiến trúc Stream (SSE là tiền đề của EventSource).

Thông thường khi Client gửi 1 yêu cầu lên server thì server sẽ nhận, xử lý và trả response client và đóng yêu cầu.

Với SSE khi client gửi yêu cầu lên server thì server cũng sẽ nhận yêu cầu và xử lý tuy nhiên phần response sẽ khác, server trả về data cho client nhưng với thông báo là chưa trả hết, kết nối vẫn sẽ được giữ và khi có dữ liệu mới cần gửi thêm thì server sẽ tiếp tục gửi thêm data cho client.

Nếu bạn tìm hiểu thì cách thức chống tải image hiện nay cũng theo cách thức hơi giống như vậy (Nó vẫn khác nhau nhé), sau khi các byte image đã được gửi về cho client , server vẫn thông báo là chưa hoàn tất và định kỳ gửi thêm 1 chút byte cho client.

Thông thường thì với SSE thì tại Header Transfer-Encoding sẽ  = chunked (Để nói rằng response sẽ gửi về theo các khối khác nhau và độc lập, có thể xử lý từng khối đó) và sẽ không có content-length, và content-type sẽ khác

Về mặt cảm nhận thì reqeust SSE sẽ giống như các request  bình thường, tuy nhiện data trả về là dạng chunked để có thể nhận về từng khối và xử lý các khối data đó độc lập

SSE vẫn sử dụng giao thức HTTP như bình thường, nó vẫn sử dụng giao thức HTTP

5 : Websocket

Websocket thì đặc thù hơn, websocket cho phép mở phiên giao tiếp 2 chiều giữa trình duyệt của người dùng và máy chủ website.

Mặc dù đa số các websocket vẫn hoặt động trên cổng 443 hoặc 80, nhưng websocket không phải là giao thức HTTP. Websocket có giao thức riêng của nó tên là websockets protocol.

Giao thức chuẩn thông thường của WebSocketws://, giao thức secure mã hóa là wss://

Websocket được thiết kế để hoạt động tốt trên 443 hoặc 80 để giúp nó tương thích hơn với HTTP (Vậy nên nó mới gọi là websocket).

Với websocket thì cả client và server đều có thể liên tục gửi thông tin cho nhau khi trong thời gian kết nối.

 

Câu hỏi :  Vì sao ứng dụng chat cần dùng socket mà không dùng websocket

Lưu ý rằng : Bản chất HTTP hay websocket đều cần sử dụng socket để tạo kết nối, gửi dữ liệu...

Còn câu hỏi này thì mình chưa rõ lắm, Bạn cần nói rõ là ứng dụng chát trên web hay application máy tính, mobile...etc....

  • 1
  • Reply
Phần Ajax Polling định kỳ 2s có thể tùy chỉnh nhé, 1s 3s hay 5s đều được, tùy nhu cầu  –  Thành Lê Văn 1649107330000
dạ thưa anh, vậy AJAX polling là client gửi request định kỳ vài giây 1 lần, nếu server chủ động gửi định kỳ thì mình xử lý như nào ạ  –  Nguyễn Thái Sơn 1649624802000
Với Ajax polling hoặc Ajax Long Pooling thì server không thể chủ động gửi data cho client. Bắt buộc client phải call lên server để hỏi data bạn nhé.  –  Thành Lê Văn 1649746883000