我有一种情况,我的服务器可能会关闭 TCPServer
并重新启动,将所有用户保存到一个文件中,然后立即重新加载它们;他们的联系不会中断。
问题是我似乎无法重新初始化他们的流。
当我们重新启动(并尝试保持连接)时,我重新初始化 TCPServer,并加载我的连接用户数组——因为每个都有一个现有的套接字地址,存储为 <TCPSocket:0x00000000000000>
,我可以用 TCPServer 重新初始化这些地址吗?
通常,每个用户连接并被接受:
$nCS = TCPServer.new(HOST, PORT)
begin
while socket = $nCS.accept
Thread.new( socket ) do |sock|
begin
d = User.new(sock)
while sock.gets
szIn = $_.chomp
DBG( "Received '" + szIn + "' from Client " + sock.to_s )
d.parseInput( szIn )
end
rescue => e
$stdout.puts "ERROR: Caught error in Client Thread: #{e} \r\n #{e.backtrace.to_s.gsub(",", ",\r\n")}"
sock.write("Sorry, an error has occurred, and you have been disconnected."+EOL+"Please try again later."+EOL)
d.closeConnection
end
end
end
rescue => e
$stdout.puts "ERROR: Caught error in Server Thread: #{e} \r\n #{e.backtrace.to_s.gsub(",", ",\r\n")}"
exit
end
为了给它一个热重启命令,我们使用
exec('./main --copyover')
来标记正在发生复制。如果
$connected
持有一个所有用户的数组,并且每个用户都有一个socket,那么如何重新初始化重启前打开的socket(假设另一端还在连接)?我怀疑使用
exec("./main", "--copyover", *$nCS, *$connected)
让我更接近,因为这只是替换了进程,并且应该维护文件(而不是关闭它们)。 最佳答案
你不能。套接字仅在进程的生命周期内有效:当进程退出时,它被操作系统关闭。这反过来使连接无效,因此另一端仍未连接。