如何在Ruby中检测断开连接的Unix域套接字?
我正在使用Ruby中的Unix域套接字编写简单的echo服务器/客户端。这是我的密码: server.rb如何在Ruby中检测断开连接的Unix域套接字?,ruby,sockets,Ruby,Sockets,我正在使用Ruby中的Unix域套接字编写简单的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 con
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.get
块。如何检测断开的套接字并使服务器线程正确退出?当连接关闭时,sock.get
返回nil,即
input = sock.gets
break if input.nil?
input = input.chomp
应该有用
用于调试目的
require 'socket'
Thread.abort_on_exception=true
可以使用。原始代码将因以下原因而结束:
nil:NilClass(NoMethodError)的未定义方法“chomp”
有关更多详细信息,请参阅。Ahh,我尝试检查空字符串,但没有找到nil。成功了,谢谢。但是,为什么我的代码虽然调用了nil.chomp,却没有引发NoMethodError呢?@aosho235我猜,
NoMethodError
是被引发的,但不知何故它被丢弃了,因为它发生在一个线程中。再次感谢,@J.J.Hakala。通过使用Thread.abort\u on\u exception=true
,Ruby打印了异常。