Skip to main content

socket_select_multiplex

⚙️ Handling Multiple Sockets with select

When your server needs to manage multiple clients without blocking, Ruby’s IO.select is your friend. This example demonstrates how to wait on multiple sockets (server + clients) and only read from sockets ready for I/O.

require 'socket'

server = TCPServer.new(4000)
clients = []

loop do
# Build the list: server + all connected clients
ready = IO.select([server] + clients)

ready[0].each do |io|
if io == server
client = server.accept
clients << client
puts "New client connected"
else
data = io.gets
if data
io.puts "Echo: #{data.chomp}"
else
puts "Client disconnected"
clients.delete(io)
io.close
end
end
end
end

This approach avoids one thread per connection, improves scalability, and keeps resource usage low.