我在Ruby中使用Unix Domain Socket编写简单的echo服务器/客户端。这是我的代码:
server.rb
require 'socket'
# Listens server.sock and enters an infinite loop
Socket.unix_server_loop('server.sock') do |sock, addr|
# When accepted a connection, creates a new thread
puts "Accepted connection from:"
Thread.new do
loop do
rs = IO.select([sock], [], [sock])
p rs
input = sock.gets.chomp
puts "input = [#{input}]"
sock.puts("response to #{input}")
end
puts "Thread quits."
sock.close
end
end
puts "Server quits."
client.rb
require 'socket'
UNIXSocket.open('server.sock') do |sock|
5.times do |i|
begin
sock.puts "#{Time.now}: Hello #{i} from #{Process.pid}"
puts "Recived " + sock.gets
sleep 1
rescue Errno::EPIPE => e
puts "Connection closed."
break
end
end
sock.close
end
puts "Client quits."
它们正常工作,除了服务器没有检测到客户端退出并且它永远等待输入。虽然select
返回文件描述符(这意味着描述符已经准备好阅读,但据我理解),sock.gets
阻塞。如何检测断开的套接字并使服务器线程正常退出?
答案 0 :(得分:0)
当连接关闭时,class
返回nil,即
sock.gets
应该有用。
出于调试目的
input = sock.gets
break if input.nil?
input = input.chomp
可以使用。然后原始代码将因
而结束未定义的方法`chomp'代表nil:NilClass(NoMethodError)
有关详细信息,请参阅this answer。