@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
,服务器只在线程中执行一次内容,在客户端连接之后立即执行。
答案 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
但是我猜你需要一些超时机制,如果在一段时间内没有消息就会关闭连接,否则你最终会有很多永久运行的线程