Cơ bản về HTML5 Websocket

HTTP 101 (hay đúng hơn, HTTP / 1.0 và HTTP / 1,1) Trong kiến trúc cũ, kết nối được xử lý bởi HTTP / 1.0 và HTTP / 1.1. HTTP là một giao thức để đáp ứng yêu cầu trong một mô hình client / server. Với 1 client (thường là một trình duyệt web) gửi một yêu cầu HTTP đến server, server xử lý và gửi trả kết quả trả lại cho client chẳng hạn như một trang HTML, cũng như các thông tin về trang. HTTP cũng được thiết kế cho việc lấy các tài liệu. HTTP / 1.0 là đủ cho một đơn yêu cầu tài liệu từ một server.

Tuy nhiên, như các trang web lớn hơn thì sự tương tác này là lớn hơn và dữ liệu cũng lớn hơn rất nhiều thì tài liệu đơn giản chia sẻ và bắt đầu bao gồm tương tác nhiều hơn đòi hỏi thời gian phản ứng phải nhanh hơn giữa các yêu cầu trình duyệt và đáp ứng server.

Với HTTP, HTTP / 1.1 Với việc them vào các kết nối tái sử dụng, trình duyệt có thể khởi tạo một kết nối đến một máy chủ web để lấy các trang HTML, sau đó sử dụng cùng một kết nối để lấy nguồn tài nguyên như hình ảnh, chữ viết, và như vậy. HTTP / 1.1 giảm độ trễ giữa yêu cầu bằng cách giảm số lượng các kết nối đã được thực hiện từ các client đến các máy chủ.

Với HTTP / 1.0 và HTTP / 1.1, có những điểm không hiệu quả xuất phát từ những điểm sau đây:

  • HTTP được thiết kế để chia sẻ tài liệu, không phải là các ứng dụng tương tác phong phú.
  • Độ trễ lớn, nếu client thực hiện request liên tục lên server, rất nhiều request thừa, không có dữ liệu mới cũng phải gửi, ảnh hưởng lớn đến performance của server.

Về bản chất, HTTP cũng là half duplex, có nghĩa là lưu lượng truyền tin theo một hướng duy nhất tại một thời điểm, điều này gây lãng phí và kém hiệu quả.

http-versus-html5ws_2-300x104.png

Ra đời cách đây không lâu HTML5 Websocket tạo kết nối giữa client và server qua một cổng nào đó. Không sử dụng các request HTTP thông thường, WebSocket mở một kết nối duy nhất, hai chiều và tái sử dụng cùng một kết nối. Tất cả dữ liệu giao tiếp giữa client-server sẽ được gửi trực tiếp qua port này làm cho thông tin được gửi đi nhanh chóng và liên tục khi cần thiết. Web socket giả quyết được tất cả khuyết điểm ở các cách phía trên, nhưng khuyết điểm lớn nhất websocket là không hỗ trợ các trình duyệt cũ.

WebSocket làm giảm độ trễ bởi vì một khi kết nối WebSocket được thành lập, server không cần phải chờ đợi cho một yêu cầu từ client. Tương tự như vậy, client có thể gửi tin nhắn đến server bất cứ lúc nào. Yêu cầu duy nhất này giúp làm giảm đáng kể độ trễ, mà sẽ gửi một yêu cầu trong khoảng thời gian, cho dù thông điệp có sẵn.

Các ưu điểm lớn của websocket

  • Giao tiếp thời gian thực hiệu quả hơn, tiết kiệm băng thông, CPU, và giảm độ trễ.
  • 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).
  • Websocket cho thấy sự đơn giản:
    • Sử dụng Ajax với long polling qua HTTP có ưu điểm là hỗ trợ nhiều trình duyệt, tạo ra ứng dụng thời gian thực nhưng việc giữ request làm tăng tải cho server, đối với các server bình thường, xử lý đồng bộ một thread cho một request, thì nếu có nhiều request sau đó, sẽ gây ra chậm.
    • WebSocket cho phép bạn đơn giản hóa đáng kể hướng kết nối thông tin liên lạc trong các ứng dụng thời gian thực.

Nhược điểm

  • Nó là một đặc tả mới của HTML5, nên nó vẫn chưa được tất cả các trình duy ệt hỗ trợ.
  • Không có phạm vi yêu cầu nào. Do WebSockets 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.

Xây dụng ứng dụng web chat với WebSocket API

Để bắt đầu, trước tiên bạn tạo một kết nối bằng cách gọi WebSocket constructor. Constructor trả về một trường hợp đối tượng WebSocket. Bạn có thể lắng nghe các sự kiện trên đối tượng đó. Những sự kiện này cho bạn biết khi kết nối mở ra, khi có tin nhắn đến, khi kết nối đóng, và khi xảy ra lỗi. Bạn có thể tương tác với các trường hợp WebSocket để gửi tin nhắn hoặc đóng kết nối. Các phần tiếp theo khám phá từng khía cạnh của API WebSocket.

    var ws = new WebSocket("ws://echo.websocket.org", "myProtocol");

WebSocket Events:

  • onopen — event được gọi khi bắt đầu mở kết nối đến server.
  • onclose — event được gọi khi ngắt kết nối đến server.
  • onmessage — event được gọi khi nhận được message gửi từ server về.
  • onerror — event được gọi khi có lỗi mạng xảy ra.
  • send(message)— gửi message đến server.
  • close()— ngắt kết nối.

Quy trình xử lý của Websocket Server

  • Mở socket.
  • Ràng buộc vào IP, domain.
  • Lắng nghe kết nối đến.
  • Chấp nhận kết nối.
  • WebSocket Handshake.
  • Giải mã/mã hóa frame gửi nhận.
  • Xử lý thông tin.
  • Ngắt kết nối.