ruby - 如何在 ruby​​ 中创建非阻塞 TCP 服务器和 TCP 套接字,只有以下更改才会有所不同?

标签 ruby sockets tcp nonblocking

就像在客户端套接字中一样

     socket = Socket.new(AF_INET, SOCK_STREAM, 0) 
     sockaddr = Socket.pack_sockaddr_in(2200, 'localhost') 
     socket.connect_nonblock(sockaddr)
     server_msg = socket.recv_nonblock(3058)
                   vs
     clientSession = TCPSocket.new( "localhost",2200)
     server_msg = socket.recv(3058)

像在服务器中

      socket = Socket.new(AF_INET, SOCK_STREAM, 0)
      sockaddr = Socket.sockaddr_in(6212, 'localhost')
      socket.bind(sockaddr)
      socket.listen(5)
                    vs
      server = TCPServer.new("localhost",3000)

是语法上不同还是逻辑上我们应该让它们成为非阻塞的?

最佳答案

也许你可以使用超时?

我们使用以下代码让 ruby​​ 套接字客户端在没有响应时超时:

@socket = TCPSocket.new(host, port)

timeout=30.0
ready = IO.select([@socket], nil, nil, timeout)

if ready
  response = @socket.recv(SOCKET_READ_SIZE)
else
  message = "Socket communications timed out after #{timeout} seconds"
  logger.error message
  @socket.close if @socket.present?
  raise message
end

关于ruby - 如何在 ruby​​ 中创建非阻塞 TCP 服务器和 TCP 套接字,只有以下更改才会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12653532/

相关文章:

sockets - Socat 没有关闭 tcp 连接

sockets - Netty是否支持通过UNIX域套接字的数据报包?

Linux:从 NAS 读取文件并通过套接字发送的最有效方法是什么

delphi - Indy 10 TCP Client Server - 测试开放通信 channel

c++ - QT QTcpServer 没有及时连接

python - 模拟 "socket.socket.connect"方法以断言它是使用给定参数调用的,同时保持功能

ruby-on-rails - Ruby/Rails 中的模糊比较

ruby - **args 作为 Ruby 中的函数参数

ruby - 从 ruby​​ 中的哈希中选择和删除

ruby - 将带空格的枚举放入 Rails 集合中