Bạn có muốn tạo các network client và server tùy chỉnh bằng Ruby không? Hoặc đơn giản là muốn hiểu cách chúng hoạt động?
Bạn sẽ phải làm việc với sockets - những điểm cuối của kênh truyền thông.
Hãy cùng khám phá lập trình mạng Ruby để nắm vững cơ bản và bắt đầu giao tiếp với các server và client khác!
Socket Là Gì?
Sockets là các điểm cuối (endpoints) của kênh truyền thông. Cả client và server đều sử dụng sockets để giao tiếp với nhau.
Cách thức hoạt động rất đơn giản:
Khi một kết nối được thiết lập, bạn có thể đưa dữ liệu vào socket của mình và nó sẽ truyền đến đầu kia, nơi bên nhận sẽ đọc từ socket để xử lý dữ liệu đến.
Các Loại Socket
Có một vài loại socket có sẵn, phổ biến nhất là TCP Socket - cho phép kết nối đến các dịch vụ dựa trên TCP như HTTP hay FTP.
Nếu cần sử dụng giao thức dựa trên UDP, bạn có thể dùng UDP Socket.
Các loại socket khác hơi chuyên biệt hơn: Unix sockets cho phép giao tiếp giữa các tiến trình (IPC) trên hệ thống Unix mà không tốn chi phí của một kết nối TCP đầy đủ.
Sử Dụng Socket Trong Ruby
Đã hiểu được sockets có thể làm gì, giờ là lúc bắt đầu sử dụng chúng.
Trước tiên, require thư viện socket vào chương trình:
require 'socket'
Để tạo TCP socket, sử dụng class TCPSocket với tham số là địa chỉ IP đích và port:
socket = TCPSocket.new('google.com', 80)
Đoạn code này sẽ cố gắng thiết lập kết nối. Nếu không thể kết nối, bạn sẽ nhận được lỗi Errno::ECONNREFUSED.
Khi đã kết nối, bạn có thể gửi tin nhắn qua socket. Bạn cần tuân theo giao thức của dịch vụ đích để bên kia hiểu được:
socket.write "GET / HTTP/1.1" socket.write "\r\n\r\n"
Nhiều phương thức bạn sẽ dùng đến từ các class cha của TCPSocket.

Để đọc phản hồi từ server, dùng phương thức recv với tham số là số byte muốn đọc:
puts socket.recv(100)
Vấn đề nhỏ: Chương trình có thể bị "block" (đợi) nếu chưa đủ dữ liệu để đọc. Nó sẽ chờ cho đến khi có dữ liệu hoặc server đóng kết nối.
Bạn có thể điều chỉnh lượng dữ liệu đọc tùy theo giao thức. Nếu blocking gây vấn đề, hãy xem readpartial và read_nonblock từ class IO.
Cách Viết TCP Server
Hãy xây dựng một server! Quy trình tương tự client, nhưng cần: bind vào interface, listen, và accept kết nối đến.
Class TCPServer đã lo phần bind và listen:
require 'socket'
socket = TCPServer.new('0.0.0.0', 8080)
client = socket.accept
puts "New client! #{client}"
client.write("Hello from server")
client.close
Server này lắng nghe trên port 8080 và chào client mới. Lưu ý: chỉ chấp nhận được một client rồi chương trình kết thúc.
Chấp Nhận Nhiều Client
Để xử lý nhiều client cùng lúc, cần vòng lặp và thread:
require 'socket'
PORT = 8081
socket = TCPServer.new('0.0.0.0', PORT)
def handle_connection(client)
puts "New client! #{client}"
client.write("Hello from server")
client.close
end
puts "Listening on #{PORT}. Press CTRL+C to cancel."
loop do
client = socket.accept
Thread.new { handle_connection(client) }
end
Server này sẽ lắng nghe liên tục cho đến khi bạn dừng nó.
Muốn nâng cao hơn & viết web server Ruby? Đọc bài viết này.
Kết Luận
Bạn đã học: TCP sockets là gì, cách hoạt động, và cách dùng class TCPServer & TCPSocket để tạo ứng dụng Ruby giao tiếp qua mạng.
Lập trình mạng Ruby rất thú vị! Hãy tạo ra điều gì đó tuyệt vời và chia sẻ trong phần bình luận 🙂
Đừng quên đăng ký newsletter để nâng cao kỹ năng Ruby!