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

私はルビーのプログラミングの経験がありません。.Netの場合、なんらかのキープアライブプロトコルがないとふりをすることはできません。サーバーがx秒後にクライアントからデータを取得しない場合、サーバーはクライアントが切断されていると見なします。クライアントは、通信していないときにサーバーに何かを送信するためのタイマーを持っている必要があります。

于 2012-04-12T10:23:56.357 に答える
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 に答える