在Rails中与TCPServer的永久(保持活动)连接

时间:2014-06-03 09:50:57

标签: ruby-on-rails keep-alive tcpserver

@server = TCPServer.new('', 2001)
Thread.new do
  loop do
    puts 'loop iteration'
    Thread.start(@server.accept) do |client|
      puts 'in thread'
      client.puts Time.now
      puts client.read
      client.close #This is the line I don't like
    end
  end
end

如何在不重新连接的情况下阻止连接关闭并从客户端接受数据?

如果我评论client.close,服务器只在线程中执行一次内容,在客户端连接之后立即执行。

1 个答案:

答案 0 :(得分:0)

你也可以发布你的客户代码吗?

我认为这种情况正在发生,因为您只从客户端读取一条消息,直到client.read结束,而不是对此连接进行任何其他读取。 如果你关闭它,你的客户端可能只是重新连接,然后由TCPServer创建新的TCPSocket。

如果您不接受客户端发送任何更多消息,那么关闭连接就完全没问题了。

这是AcceptSocket(TCPServer)的用途。它允许您保存资源,而不是 有一个正在运行的线程来对传入的消息进行轮询。

如果您确实希望客户端在相对较短的时间内发送更多消息,那么您应该在正在侦听TCPSocket的Thread中有一个循环。

Thread.start(@server.accept) do |client|
  puts 'in thread'
  client.puts Time.now
  loop do
    puts client.gets #or client.read
  end
end

另请参阅ruby-tcp-chat Server#listen_user_messages

但是我猜你需要一些超时机制,如果在一段时间内没有消息就会关闭连接,否则你最终会有很多永久运行的线程