首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭Ruby TCPSocket客户端时关闭流(TCPSocket)

关闭Ruby TCPSocket客户端时关闭流(TCPSocket)
EN

Stack Overflow用户
提问于 2011-06-23 15:25:15
回答 1查看 2.4K关注 0票数 3

我有一个Ruby TCPSocket客户端,除了我试图关闭它的时候,它工作得很好。当我在下面的代码中调用断开连接方法时,我会得到以下错误:

代码语言:javascript
复制
./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

以下是(简化的)代码:

代码语言:javascript
复制
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

有什么方法可以防止或捕捉到这个错误吗?我不是套接字编程方面的专家(很明显!),所以我们非常感谢所有的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-02 01:17:48

您的线程位于IO.select()中,而陷阱代码却愉快地用@socket.close猛击它的门,因此您会收到一些抱怨。

不要将abort_on_exception设置为true,或者在代码中正确处理异常:

像这样的东西..。

代码语言:javascript
复制
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

...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6456568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档