Hướng dẫn websocket trong javascript
GIỚI THIỆU VỀ WEBSOCKETSTrước khi đi tìm hiểu về Websockets chúng ta cùng ngẫm qua Ajax Polling và Ajax Long Polling. Show Ajax Polling và Ajax Long Polling là hai phương thức cho client <-> server giao tiếp với nhau, chúng sẽ lý giải lý do tồn tại Websockets và giúp các bạn lựa chọn sử dụng tuỳ trường hợp cụ thể khi áp dụng thực tế. AJAX POLLINGCơ chế của phương thức này như sau : Client sẽ gửi các request liên tục tới server trong mỗi khoảng thời gian xác định với mục đích cập nhật lại dữ liệu phía người dùng. Server sẽ bị bắt buộc trả về dữ liệu mong muốn ứng với mỗi nhịp request gửi đến, và cũng không quan tâm tới việc liệu có những thay đổi nào, nhiều hay ít hoặc không hề thay đổi. Tất cả dữ liệu yêu cầu được gói lại trả về Client. AJAX LONG POLLINGPhương thức này cũng tương tự như AJAX POLLING là Client vẫn sẽ gửi request đều đặn tới Server . Tuy nhiên, thay vì trả về ttoafn bộ dữ liệu ứng với mỗi request đến thì khi này , dữ liệu thay đổi được kiểm tra và sẽ chỉ response lại Client những thay đổi (nếu có) . Điều này có nghĩa Server hoàn toàn có thể bỏ qua việc phản hồi lại những request không cần thiết khi dữ liệu người dùng vẫn chính xác ở thời điểm đó. Với cả 2 phương thức này, chúng đều sử dụng giao thức HTTP. Vì thế mà mỗi gói tin truyền đi bao gồm rất nhiều thông tin header làm tốc độ truyền tải không được tối ưu. Thêm nữa là quá trình xảy ra tuần tự, không hỗ trợ việc giao tiếp song song Client <-> Server. Những vấn đề trên là lý do cho Websockets ra đời, mục đích là tạo ra khả năng tạo ra môi trường tiệm cận realtime tốt hơn cho giao tiếp Client <-> Server, hỗ trợ giao tiếp song song cho cả Client và Server cùng lúc. WebsocketsĐặc điểm :Websockets thực hiện thông qua giao thức TCP, nó có thể giảm kích thước header của bản tin request tớí vài trăm lần so với bản tin HTTP. Cũng vì thế mà tốc độ tuỳ trường hợp có thể tăng lên một vài lần, độ trễ thấp và dễ xử lý lỗi. Các API được cung cấp cũng rất đơn giản , gọn gàng và dễ sử dụng. Tuy nhiên nhược điểm là không hỗ trợ được toàn bộ các trình duyệt
Cách sử dụng (trong javascript) :
hoặc đơn giản hơn là :
Theo 1 cách khác, chúng ta cũng có thể sử dụng addEventListener để lắng nghe các event :
Tài liệu tham khảo : https://viblo.asia/p/hieu-hon-ve-websocket-znVGL2r0RZOe 1. Websocket là gì? WebSoket là công nghệ hỗ trợ giao tiếp hai chiều giữa client và server bằng cách sử dụng một TCP socket để tạo một kết nối hiệu quả và ít tốn kém. Mặc dù được thiết kế để chuyên sử dụng cho các ứng dụng web, lập trình viên vẫn có thể đưa chúng vào bất kì loại ứng dụng nào.
WebSockets cung cấp khả năng giao tiếp hai chiều mạnh mẽ, có độ trễ thấp và dễ xử lý lỗi. Không cần phải có nhiều kết nối như phương pháp Comet long-polling và cũng không có những nhược điểm như Comet streaming. API cũng rất dễ sử dụng trực tiếp mà không cần bất kỳ các tầng bổ sung nào, so với Comet, thường đòi hỏi một thư viện tốt để xử lý kết nối lại, thời gian chờ timeout, các Ajax request (yêu cầu Ajax), các tin báo nhận và các dạng truyền tải tùy chọn khác nhau (Ajax long-polling và jsonp polling).
Những nhược điểm của WebSockets gồm có: Không có phạm vi yêu cầu nào. Do WebSocket là một TCP socket chứ không phải là HTTP request, nên không dễ sử dụng các dịch vụ có phạm vi-yêu cầu, như SessionInViewFilter của Hibernate. Hibernate là một framework kinh điển cung cấp một bộ lọc xung quanh một HTTP request. Khi bắt đầu một request, nó sẽ thiết lập một contest (chứa các transaction và liên kết JDBC) được ràng buộc với luồng request. Khi request đó kết thúc, bộ lọc hủy bỏ contest này. 2. Node.js là gì? Node.js là một hệ thống phần được thiết kế để viết các ứng dụng internet có khả năng mở rộng, đặc biệt là máy chủ web. Chương trình được viết bằng JavaScript, sử dụng kỹ thật điều khiển theo sự kiện, nhập/xuất không đồng bộ để tối thiểu tổng chi phí và tối đại khả năng mở rộng. Node.js bao gồm có V8 JavaScript engine của Google,libUV, và vài thư viện khác. Lợi thế của Node.js để lập trình web-socket:
Giao thức bắt tay của WebSocket: 3. Cài đặt công cụ Bạn cài đặt NodeJs theo thứ tự các dòng lệnh sau:
Tiếp đó, bạn cài đặt thêm node-uuid (sẽ giới thiệu kỹ hơn về UUID ở phần sauu) theo lệnh:
4. WebSocket Events WebSocket hỗ trợ bốn sự kiện, chúng đều đã có sẵn trong JavaScript API và được xác định theo W3C: • open • message • error • close Với JavaScript, you listen for these events to fire either with the handler on 4.1 Event: Open Khi WebSocket server phản hồi với yêu cầu kết nối, và quy trình bắt tay hoàn thành, sự kết nối giữa client và server được thiết lập. Khi đó, server đã sẵn sàng để gửi và nhận messages từ ứng dụng client.
Ví dụ trên thể hiện việc client hiển thị trạng thái kết nối thành công ra màn hình, kết nối được thiết lập, sẵn sàng cho việc trao đổi thông tin hai chiều. Sau đó client đã gửi một thông điệp đầu tiên lên server. 4.2 Event: Message Sau khi kết nối thành công với websocket server, client sẽ có thể gửi và nhận thông điệp từ server (sử dụng các Websocket methods sẽ được đề cập phía sau bài viết này). Các WebSocket API sẽ chuẩn bị các thông điệp đầy đủ để được xử lý trong onmessage. 4.3 Event: Error Khi có lỗi xảy ra với bất kỳ lý do gì. Giả sử rằng sự kết nối WebSocket bị đóng. Khi đó event close xảy ra ngay sau khi một trong các lỗi xuất hiện. Sau đây là một ví dụ về cách xử lý trong trường hợp xảy ra lỗi :
4.4 Event: Close Sự kiên close được gọi khi kết nối WebSocket đóng, và các sự kiện onerror sẽ được thực thi. Sau khi sự kết nối được đóng, sự giao tiếp giữa server và client cũng sẽ không đưuọc tiếp tục. Ví dụ sau sẽ trả về mảng giá trị 0 khi kết nối đã được đóng.
5. WebSocket Methods Các phương thức của WebSocket khá đơn giản, chỉ gồm hai phương thức: 5.1 Phương thức: Send Khi sự kết nối được thiết lập, bạn sẽ sẵn sàng để nhận (gửi) thông điệp từ (đến) WebSocket server.
5.2 Phương thức: Close Sự kết nối WebSocket
được đóng thông qua phương thức
6. Xây dựng ứng dụng chat 6.1 Server Trong phần này chúng ta sẽ xây dựng môt ứng dụng chat hoàn chỉnh với chức năng đơn giản hoàn chỉnh. Trước tiên, chúng ta khởi tạo một WebSocket server với cổng 8181.
Giao thức websocket thông thưởng không hỗ trợ các tính năng mặc định, chúng ta phải tự tạo ra chúng. Sau này khi làm việc với Socket.IO thì sẽ có nhiều API để thuận tiện hơn trong khi xây dựng ứng dụng. Tiếp đó, chúng ta cần nhập vào một module Node để có thể sinh ra một UUID (UUID dung để xác định từng client đã kết nối với server và đưa chúng vào một một sưu tập).
Khi server nhận được thông điệp từ client, nó sẽ duyệt lần lượt qua từng client trong bộ sưu tập đã tạo bên trên, và gửi lại một đối tượng JSON chứa thông điệp đã nhận được từ client đã gửi đi. Trên giao diện của các client sẽ chỉ cập nhật lại các thông điệp khi nó đã nhận được từ server. Từ đây, tất cả các client đã kết nối thành công tới server đều có thể nhận được thông điệp trên và trả về cho người dùng:
Cuối cùng server cần xử lý sự kiện đóng kết nối:
6.2 WebSocket Client Client nhận thông điệp từ server ở dạng một đối tượng JSON. Sử dụng hàm dựng sẵn để phân tích thông điệp đó để thể hiện lên giao diện người dùng.
Sự kiện và thông báo Chúng ta có thể gửi thông báo tới tất cả các client đã kết nối, xử lý trạng thái kết nối:
Việc gửi thông điệp tới tất cả các client về trạng thái kết nối, ngắt kết nối, hay bất kỳ thông báo nào cũng dựa trên cơ chế tương tự khi server gửi đi thông điệp nhận được từ một client tới tất cả các client đã kết nối. Sau đây là phần code khá hoàn thiện cho một ứng dụng chat nho nhỏ giúp các bạn tham khảo dễ dàng hơn: Phía Server
Phía Client
Bạn cũng có thể tải code về tại: GitHub Chúng ta sẽ tiếp tục với WebSocket trong các bài viết sau. Hẹn gặp lại các bạn! |