Socket Là Gì? Tìm Hiểu Về Socket, Stream Socket, Datagram Socket và WebSocket

Socket là một khái niệm quan trọng trong lĩnh vực mạng máy tính và lập trình mạng. Bài viết này sẽ cung cấp cho bạn cái nhìn tổng quan về socket, các loại socket phổ biến và cách chúng hoạt động.

Socket là gì?

Socket là một điểm cuối (endpoint) của một liên kết giao tiếp hai chiều giữa hai chương trình chạy trên mạng. Hiểu một cách đơn giản, socket cho phép một tiến trình (process) “nói chuyện” với một tiến trình khác, bất kể chúng đang chạy trên cùng một máy tính hay trên các máy tính khác nhau.

Các lớp Socket được sử dụng để thiết lập kết nối giữa máy khách (client) và máy chủ (server). Mỗi socket được gán cho một cổng (port) cụ thể, là một con số giúp tầng TCP/IP xác định ứng dụng mà dữ liệu sẽ được gửi đến.

Socket là gì?Socket là gì?

Socket được hỗ trợ rộng rãi trên nhiều hệ điều hành như Windows, Linux và được sử dụng trong nhiều ngôn ngữ lập trình khác nhau. Điều này giúp các nhà phát triển dễ dàng xây dựng các ứng dụng mạng phức tạp.

Socket cho phép các ứng dụng kết nối và trao đổi dữ liệu thông qua Internet bằng cách sử dụng các giao thức như TCP/IP và UDP. Để hai ứng dụng có thể giao tiếp, chúng cần biết địa chỉ IP và số cổng của nhau.

Có nhiều loại socket khác nhau, tùy thuộc vào giao thức truyền dữ liệu được sử dụng. Hai loại phổ biến nhất là TCP và UDP.

Phân loại Socket

Có hai loại socket chính là Stream Socket và Datagram Socket, mỗi loại có những đặc điểm và ứng dụng riêng.

Stream Socket

Stream Socket hoạt động dựa trên giao thức TCP (Transmission Control Protocol). Giao thức này thiết lập một kết nối hai chiều, đáng tin cậy giữa máy khách và máy chủ. Do đó, Stream Socket còn được gọi là socket hướng kết nối.

TCP đảm bảo dữ liệu được truyền đến đích một cách chính xác và theo đúng thứ tự. Nó sử dụng các cơ chế quản lý luồng và chống tắc nghẽn để đảm bảo tính ổn định của kết nối.

Đặc điểm của Stream Socket:

  • Thiết lập một đường kết nối (địa chỉ IP) giữa hai tiến trình.
  • Một tiến trình phải đợi tiến trình kia yêu cầu kết nối.
  • Mô hình client/server, trong đó server lắng nghe và chấp nhận kết nối từ client.
  • Mỗi thông điệp gửi đi đều yêu cầu xác nhận trả về.
  • Các gói tin được chuyển đi theo thứ tự.

Stream Socket phù hợp với các ứng dụng yêu cầu độ tin cậy cao, chẳng hạn như truyền tải file, duyệt web và email.

Datagram Socket

Datagram Socket sử dụng giao thức UDP (User Datagram Protocol). UDP không yêu cầu thiết lập kết nối trước khi truyền dữ liệu, do đó Datagram Socket được gọi là socket không hướng kết nối.

Datagram SocketDatagram Socket

UDP không cung cấp các cơ chế đảm bảo độ tin cậy như TCP, vì vậy dữ liệu có thể bị mất hoặc đến không đúng thứ tự. Tuy nhiên, UDP có tốc độ truyền dữ liệu nhanh hơn vì không có các bước thiết lập và duy trì kết nối phức tạp.

Datagram Socket phù hợp với các ứng dụng yêu cầu tốc độ cao và có thể chấp nhận mất mát dữ liệu nhỏ, chẳng hạn như trò chơi trực tuyến, truyền video trực tuyến và VoIP.

WebSocket là gì?

WebSocket là một giao thức giao tiếp hai chiều, cho phép truyền dữ liệu liên tục giữa máy khách và máy chủ. WebSocket khác với HTTP ở chỗ nó duy trì một kết nối liên tục, cho phép dữ liệu được truyền theo cả hai hướng mà không cần phải thiết lập lại kết nối cho mỗi lần truyền.

WebSocketWebSocket

Giao thức chuẩn của WebSocket là ws://, và giao thức an toàn là wss://. WebSocket hỗ trợ truyền dữ liệu dưới dạng chuỗi (String), mảng byte (buffered arrays) và các đối tượng lớn (blobs).

Ưu điểm của WebSocket

  • Giao tiếp hai chiều: Cho phép dữ liệu được truyền theo cả hai hướng một cách đồng thời.
  • Độ trễ thấp: Giảm thiểu thời gian trễ trong quá trình truyền dữ liệu.
  • Hiệu quả: Các gói tin của WebSocket nhẹ hơn nhiều so với HTTP, giúp giảm tải cho mạng.

WebSocket thường được sử dụng trong các ứng dụng yêu cầu cập nhật dữ liệu theo thời gian thực, chẳng hạn như:

  • Ứng dụng chat
  • Hiển thị biểu đồ
  • Thông tin chứng khoán

Các thuộc tính của WebSocket

Thuộc tính Mô tả
readyState Diễn tả trạng thái kết nối. Có các giá trị sau: 0 (CONNECTING), 1 (OPEN), 2 (CLOSING), 3 (CLOSED).
bufferedAmount Biểu diễn số byte của UTF-8 đã được xếp hàng bởi phương thức send().

Ví dụ:

switch (socket.readyState) {
  case WebSocket.CONNECTING:
    // Xử lý khi đang kết nối
    break;
  case WebSocket.OPEN:
    // Xử lý khi đã kết nối
    break;
  case WebSocket.CLOSING:
    // Xử lý khi đang đóng kết nối
    break;
  case WebSocket.CLOSED:
    // Xử lý khi đã đóng kết nối
    break;
  default:
    // Trường hợp không xác định
    break;
}

Các sự kiện WebSocket

Sự kiện Event Handler Mô tả
open onopen Xảy ra khi kết nối WebSocket được thiết lập thành công.
message onmessage Xảy ra khi WebSocket nhận dữ liệu từ máy chủ.
error onerror Xảy ra khi có lỗi trong quá trình giao tiếp.
close onclose Xảy ra khi kết nối bị đóng. Sự kiện này cung cấp thông tin về mã lỗi, lý do đóng kết nối và trạng thái kết nối.

Các event handler có thể được tạo bằng cách sử dụng phương thức addEventListener().

Ví dụ:

  • onopen:
socket.onopen = function(event) {
  // Xử lý sự kiện open
};

socket.addEventListener("open", function(event) {
  // Xử lý sự kiện open
});
  • onmessage:
socket.onmessage = function(event) {
  var data = event.data;
  // Xử lý dữ liệu nhận được
};

socket.addEventListener("message", function(event) {
  var data = event.data;
  // Xử lý dữ liệu nhận được
});
  • onerror:
socket.onerror = function(event) {
  // Xử lý sự kiện error
};

socket.addEventListener("error", function(event) {
  // Xử lý sự kiện error
});
  • onclose:
socket.onclose = function(event) {
  var code = event.code;
  var reason = event.reason;
  var wasClean = event.wasClean;
  // Xử lý sự kiện close
};

socket.addEventListener("close", function(event) {
  var code = event.code;
  var reason = event.reason;
  var wasClean = event.wasClean;
  // Xử lý sự kiện close
});

Các phương thức của WebSocket

Phương thức Mô tả
send() Gửi dữ liệu đến máy chủ. Dữ liệu có thể là chuỗi, ArrayBuffer hoặc blob.
close() Đóng kết nối hiện tại.

Ví dụ:

var data = new ArrayBuffer(1000000);
// Thực hiện một số thao tác trên ArrayBuffer
socket.send(data);

if (socket.bufferedAmount === 0) {
  // Dữ liệu đã được gửi
} else {
  // Dữ liệu chưa được gửi
}

Kết luận

Socket là một công cụ mạnh mẽ cho phép các ứng dụng giao tiếp với nhau qua mạng. Việc hiểu rõ về các loại socket khác nhau và cách chúng hoạt động sẽ giúp bạn xây dựng các ứng dụng mạng hiệu quả và đáng tin cậy. Hy vọng bài viết này đã cung cấp cho bạn những kiến thức hữu ích về socket.