2

我想实现一个 while 循环,只要客户端连接到我的套接字就运行。这将是基于线程的,所以我想确保一旦客户端断开连接,线程就会关闭。

  1. 问题:如何检查客户端是否仍然连接到我的套接字?

  2. 问题:如果我像这样启动它,当连接关闭时线程是否已经关闭: Thread.start(socket.accept) do |client| ...

4

3 回答 3

2

看一下这个,

require 'socket'                
th=[]
server = TCPServer.open(2000)

loop do
  Thread.start(server.accept) do |client|
    client.puts "server started.."

    # Something

    th = Thread.list
    th.each do |t|
      if t.status == "sleep" # checks all client status
        f = t.kill           # kills thread if client is disconnected
      end
    end
  end
end

您可以终止线程,或者您可以使用该线程将客户端的 IP 地址存储在数组中,并与确切客户端的 IP 地址进行比较。(如 t.addr)

于 2012-09-29T20:19:53.467 回答
1
server = TCPServer.open 12345

loop {
  Thread.start(server.accept) do |client|
    ...
    puts "client is offline!" if client.closed?
    ...
    client.close
  end
}

你可以检查“关闭?” 在“客户”中。

于 2013-06-08T19:27:45.013 回答
1

我没有编程红宝石的经验。如果它是 .Net,那么如果没有某种保活协议,你所假装的事情是不可能的。如果服务器在 x 秒后没有从客户端获取数据,则假定客户端已断开连接。客户端必须有一个计时器,以便在不通信时向服务器发送一些东西。

于 2012-04-12T10:23:56.357 回答