サーバーが閉じ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
、再起動前に開いていたソケットを再初期化するにはどうすればよいですか (もう一方の端がまだ接続されていると仮定します)。
これは単にプロセスをexec("./main", "--copyover", *$nCS, *$connected)
置き換え、ファイルを維持する必要があるためです(ファイルを閉じないでください)。