Bạn có muốn tạo các máy khách &máy chủ mạng tùy chỉnh trong Ruby không? Hay chỉ cần hiểu cách hoạt động?
Sau đó, bạn sẽ phải xử lý các ổ cắm.
Tham gia cùng tôi trong chuyến tham quan lập trình mạng ruby này để tìm hiểu những điều cơ bản và bắt đầu nói chuyện với các máy chủ và máy khách khác bằng Ruby!
Vậy ổ cắm là gì ?
Sockets là điểm cuối của kênh giao tiếp, cả máy khách và máy chủ đều sử dụng socket để giao tiếp.
Cách chúng hoạt động rất đơn giản :
Sau khi kết nối được thiết lập, bạn có thể đưa dữ liệu vào ổ cắm của mình và nó sẽ đi đến đầu kia, nơi bộ thu sẽ đọc từ ổ cắm để xử lý dữ liệu đến.
Các loại ổ cắm
Có một số loại socket có sẵn cho bạn, loại phổ biến nhất - TCP Socket - sẽ cho phép bạn tạo kết nối với các dịch vụ dựa trên TCP như HTTP hoặc FTP.
Nếu bạn phải sử dụng giao thức dựa trên UDP thì bạn có thể sử dụng UDP Socket.
Các loại ổ cắm khác kỳ lạ hơn một chút, ổ cắm Unix cho phép IPC (Giao tiếp giữa các quá trình) trong hệ thống Unix mà không cần kết nối TCP đầy đủ.
Sử dụng Sockets trong Ruby
Bây giờ chúng ta biết những gì ổ cắm có thể làm cho chúng ta, đã đến lúc bắt đầu sử dụng chúng.
Trước tiên, yêu cầu thư viện ổ cắm vào chương trình của bạn:
yêu cầu 'ổ cắm'
Để tạo ổ cắm TCP, bạn có thể sử dụng TCPSocket lớp, dưới dạng các tham số, bạn sẽ cần địa chỉ IP đích và cổng.
Thao tác này sẽ cố gắng thiết lập kết nối, nếu không thể thiết lập thì bạn sẽ nhận được Errno ::ECONNREFUSED lỗi.
socket =TCPSocket.new ('google.com', 80)
Bây giờ bạn có thể gửi tin nhắn qua socket của mình, bạn sẽ phải tuân theo giao thức mà bạn đang giao tiếp để đầu bên kia có thể hiểu được bạn.
socket.write "GET / HTTP / 1.1" socket.write "\ r \ n \ r \ n"
Nhiều phương thức bạn sẽ sử dụng đến từ các lớp cha của TCPSocket
.
Để đọc phản hồi từ máy chủ, bạn có thể sử dụng phương thức recv.
Bạn cần chuyển số byte mà bạn muốn đọc từ socket dưới dạng tham số:
đặt socket.recv (100)
Có một vấn đề nhỏ, bạn có thể không lấy lại được bất kỳ dữ liệu nào và ứng dụng của bạn có vẻ như không hoạt động gì.
Lý do là nếu không có đủ dữ liệu để đọc, chương trình của bạn sẽ "chặn".
Điều này có nghĩa là nó sẽ đợi cho đến khi có một số dữ liệu có sẵn hoặc máy chủ đóng kết nối .
Bạn có thể muốn tăng hoặc giảm lượng dữ liệu đang đọc tùy thuộc vào giao thức bạn đang làm việc.
Nếu việc chặn là một vấn đề đối với bạn, hãy xem các phương thức readpartial và read_nonblock từ lớp IO.
Cách viết máy chủ TCP
Hãy xây dựng một máy chủ! Quá trình này tương tự như viết ứng dụng khách, nhưng chúng tôi sẽ cần yêu cầu socket bind vào một giao diện, sau đó nghe trên đó và cuối cùng là chấp nhận kết nối đến.
Lớp TCPServer đã thực hiện hai phần đầu tiên cho chúng tôi.
Đây là một ví dụ :
request 'socket'socket =TCPServer.new (' 0.0.0.0 ', 8080) client =socket.acceptputs "New client! # {client}" client.write ("Xin chào từ máy chủ") client.closeMáy chủ mẫu của chúng tôi sẽ lắng nghe trên cổng 8080 và chào một ứng dụng khách đang kết nối bằng một tin nhắn.
Lưu ý cách chúng tôi chỉ có thể chấp nhận một khách hàng và chương trình sẽ kết thúc.
Chấp nhận Nhiều Khách hàng
Để có thể chấp nhận và trả lời nhiều khách hàng, chúng tôi sẽ cần một vòng lặp và một số chuỗi.
Ví dụ :
request 'socket'PORT =8081socket =TCPServer.new (' 0.0.0.0 ', PORT) def handle_connection (client) đặt ứng dụng khách "New client! # {client}" client.write ("Xin chào từ máy chủ"). closeendputs "Đang nghe trên # {PORT}. Nhấn CTRL + C để hủy." loop do client =socket.accept Thread.new {handle_connection (client)} endĐiều đó sẽ bắt đầu một máy chủ mới tiếp tục lắng nghe cho đến khi bạn dừng nó.
Nếu bạn muốn tìm hiểu cách đưa điều này lên cấp độ tiếp theo và viết một máy chủ web trong Ruby, hãy đọc bài đăng trên blog này.
Kết luận
Bạn đã biết TCP socket là gì, cách chúng hoạt động và cách bạn có thể sử dụng một số lớp Ruby như
TCPServer
&TCPSocket
để tạo các ứng dụng Ruby có thể tương tác với các máy khác trên internet.Chơi với lập trình mạng ruby thật thú vị!
Bây giờ, hãy tạo thứ gì đó thú vị và chia sẻ nó với mọi người trong phần bình luận 🙂
Cũng đừng quên tham gia bản tin của tôi nếu bạn muốn tiếp tục cải thiện kỹ năng Ruby của mình!