2011-06-23 18 views
3

私はRuby TCPSocketクライアントを持っています。私は以下の私のコードで切断メソッドを呼び出すと、私はこのエラーを取得する:Ruby TCPSocketクライアントを終了するときにストリームが閉じられました(IOError)

./smartlinc.rb:70:in `start_listen': stream closed (IOError) 
    from ./smartlinc.rb:132:in `initialize' 
    from ./smartlinc.rb:132:in `new' 
    from ./smartlinc.rb:132:in `start_listen' 
    from bot.rb:45:in `initialize' 
    from bot.rb:223:in `new' 
    from bot.rb:223 

はここ(簡体字)のコードです:

class Smartlinc 

    def initialize 
     @socket = TCPSocket.new(HOST, PORT) 
    end 

    def disconnect 
     @socket.close 
    end 

    def start_listen 
     # Listen on a background thread 
     th = Thread.new do 
      Thread.current.abort_on_exception = true 

      # Listen for Ctrl-C and disconnect socket gracefully. 
      Kernel.trap('INT') do 
       self.disconnect 
       exit 
      end 

      while true 
       ready = IO.select([@socket]) 
       readable = ready[0] 
       readable.each do |soc| 
        if soc == @socket 
         buf = @socket.recv_nonblock(1024) 
         if buf.length == 0 
          puts "The socket connection is dead. Exiting." 
          exit 
         else 
          puts "Received Message" 
         end 
        end 
       end # end each 
      end # end while 

     end # end thread 
    end # end message callback 

end 

私はこのエラーを防止またはキャッチすることができます方法はあります?私はソケットプログラミングの専門家ではありません(明らかに!)ので、すべての助けに感謝します。

答えて

2

あなたのスレッドはに座っていますが、トラップコードは幸いにドアの表面を@socket.closeでうっとりしているので、何か不平を感じます。

trueにabort_on_exception設定、または、あなたのコード内で適切に例外を処理しないでください。これらの線に沿って
何か...

Kernel.trap('INT') do 
    @interrupted = true 
    disconnect 
    exit 
end 

... 
ready = nil 
begin 
    ready = IO.select(...) 
rescue IOError 
    if @interrupted 
    puts "Interrupted, we're outta here..." 
    exit 
    end 
    # Else it was a genuine IOError caused by something else, so propagate it up.. 
    raise 
end 

... 
関連する問題