在Ruby中處理UDP通信并發(fā)可以通過使用多線程或異步IO來實現(xiàn)。這里,我們將介紹如何使用Thread
和IO.select
來實現(xiàn)并發(fā)UDP通信。
使用Thread
require 'socket'
def udp_server(port)
server = UDPServer.new(port)
server.bind('0.0.0.0')
loop do
message, _ = server.recvfrom(1024)
puts "Received message: #{message}"
# 創(chuàng)建一個新線程來處理接收到的消息
Thread.new do
handle_message(message)
end
end
end
def handle_message(message)
# 處理消息的邏輯
puts "Handling message: #{message}"
end
# 啟動服務(wù)器
udp_server(12345)
使用IO.select
require 'socket'
def udp_server(port)
server = UDPServer.new(port)
server.bind('0.0.0.0')
inputs = [server]
outputs = []
sockets = {}
loop do
readable, writable, exceptional = IO.select(inputs, outputs, sockets)
readable.each do |sock|
if sock == server
message, _ = sock.recvfrom(1024)
puts "Received message: #{message}"
# 將服務(wù)器套接字添加到sockets字典中
sockets[sock] = true
# 創(chuàng)建一個新線程來處理接收到的消息
Thread.new do
handle_message(message)
end
else
handle_client(sock, message)
end
end
writable.each do |sock|
# 處理可寫套接字
end
exceptional.each do |sock|
# 處理異常套接字
puts "Socket exception: #{sock}"
sockets.delete(sock)
end
end
end
def handle_client(sock, message)
# 處理客戶端消息的邏輯
puts "Handling client message: #{message}"
sock.send("Response from server".encode)
end
def handle_message(message)
# 處理消息的邏輯
puts "Handling message: #{message}"
end
# 啟動服務(wù)器
udp_server(12345)
這兩種方法都可以實現(xiàn)Ruby中的UDP通信并發(fā)。使用Thread
方法會為每個接收到的消息創(chuàng)建一個新線程,而使用IO.select
方法則允許你在單個線程中處理多個套接字。根據(jù)你的需求和場景,可以選擇合適的方法來處理UDP通信并發(fā)。