以下代码是对具有3个工作程序(进程)的Web服务器的模拟,并且对于每个新连接,所选工作程序创建新线程。我无法理解的是如何选择一名工人来响应一个连接?以及三个工人如何在没有问题的情况下听取类似的端口。
require 'socket'
require 'thread'
server = TCPServer.new('0.0.0.0', 8080)
3.times do
break unless fork
end
loop do
connection = server.accept
Thread.new do
request = connection.gets
connection.puts request
connection.puts Process.pid.to_s # this will change with each request.
connection.puts "status"
connection.puts "Headers"
connection.puts "Body"
connection.close
end
end
答案 0 :(得分:2)
TCP服务器侦听端口,等待新的连接请求。当有人来时,它会为特定客户端(在另一个端口上)创建一个专用套接字,将其交给工作人员,然后继续监听主端口。
connection = server.accept
上面一行是工作人员告诉服务器“我已准备好接收新套接字”的行,服务器将返回它为最新客户端请求创建的套接字。
如果有多个工作人员在等待一个新套接字(所有调用server.accept
),服务器会选择其中一个(它不应该重要哪一个,但显而易见实施是“先到先得”),其余的只是等待下一个请求......