我有一种情况,我的服务器可能会关闭 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) 让我更接近,因为这只是替换了进程,并且应该维护文件(而不是关闭它们)。

最佳答案

你不能。套接字仅在进程的生命周期内有效:当进程退出时,它被操作系统关闭。这反过来使连接无效,因此另一端仍未连接。

10-08 04:20