如何在Ruby中检测断开连接的Unix域套接字?

如何在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

我正在使用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 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打印了异常。