【问题标题】:Check if socket-client is still connected检查套接字客户端是否仍然连接
【发布时间】:2013-06-09 03:27:45
【问题描述】:

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

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

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

【问题讨论】:

  • 客户端是否在套接字上向您发送数据?如果是这样,只需在套接字上调用“recv”。如果套接字关闭,“recv”将返回错误。另一种方法是使用“选择”或“轮询”来检查套接字的状态。请检查 Ruby 中的等效调用。
  • 不幸的是,目前它只是“放置”结束“获取”“recv”方法仍然有效吗?

标签: ruby sockets networking


【解决方案1】:

看看这个,

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)

【讨论】:

  • 但是你怎么知道客户端是否连接了呢?不回答问题。
【解决方案2】:

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

【讨论】:

  • 我也考虑过这样做。但如果有更简单的方法会更好:) 好吧,如果没有其他方法,我仍然认为我必须这样做。
  • 如果超时不是知道套接字是否关闭的方法呢?
  • @Israel 我不知道那是什么意思。为什么不是超时?
【解决方案3】:
server = TCPServer.open 12345

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

您可以勾选“关闭?”在“客户”中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 2011-09-20
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多