在Ruby中读取套接字时了解IO.select

我有一些我用来从网络套接获取数据的代码.它工作正常,但我通过反复尝试错过了我的方式.我谦虚地承认我不完全明白它是如何工作的,但我真的很想. (这是我发现的货物培训工作代码)

我不明白的部分以“ready = IO.select …”开头我不清楚:

> IO.select正在做什么(我尝试查找它,但是与内核混淆甚至更加困惑)
> IO.select的数组参数是什么
什么准备[0]正在做
阅读1024字节的一般想法?一次

以下是代码

@mysocket = Tcpsocket.new('192.168.1.1',9761)

th = Thread.new do
    while true
        ready = IO.select([@mysocket])
        readable = ready[0]

        readable.each do |socket|
            if socket == @mysocket
                buf = @mysocket.recv_nonblock(1024)
                if buf.length == 0
                    puts "The server connection is dead. Exiting."
                    exit
                else
                    puts "Received a message"
                end
            end
        end

    end
end

提前感谢帮助我“学会钓鱼”.我讨厌我的代码,我不完全明白 – 这只是巧合的工作.

解决方法

1)IO.select需要一组套接字并等待,直到它们可以读取或写入(或者发生错误).它返回socket发生的事件.

2)数组包含检查事件的套接字.在您的情况下,您只指定插槽进行阅读.

3)IO.select返回一个套接字数组的数组.元素0包含可从中读取的插座,元素1 – 可以写入的套接字和元素2 – 带错误套接字.

获取套接字列表后,您可以读取数据.

4)是的,recv_nonblock参数是以字节为单位的大小.请注意,实际读取的数据大小可能小于1024,在这种情况下,您可能需要重复选择(如果实际数据对您很重要).

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...