检查Ruby连接是否存在?

时间:2010-03-05 07:30:27

标签: ruby browser internet-connection

刚刚问过check if an internet connection exists using javascript如何得到一些很好的答案。在Ruby中最简单的方法是什么?在尝试使生成的html标记代码尽可能干净时,我想有条件地渲染javascript文件的脚本标记,具体取决于是否存在Internet条件。像(这是HAML)的东西:

- if internet_connection?
    %script{:src => "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js", :type => "text/javascript"}
- else
    %script{:src => "/shared/javascripts/jquery/jquery.js", :type => "text/javascript"}

7 个答案:

答案 0 :(得分:19)

require 'open-uri'

def internet_connection?
  begin
    true if open("http://www.google.com/")
  rescue
    false
  end
end

这更接近OP正在寻找的东西。它适用于Ruby 1.8和1.9。它也有点清洁。

答案 1 :(得分:10)

我喜欢每个人都认为googles服务器正常运行。谷歌的信用。

如果您想知道自己是否有互联网而不依赖谷歌,那么您可以使用DNS查看您是否能够获得连接。

您可以使用Ruby DNS Resolv尝试将网址转换为IP地址。 适用于Ruby版本1.8.6 +

所以:

#The awesome part: resolv is in the standard library

def has_internet?
  require "resolv"
  dns_resolver = Resolv::DNS.new()
  begin
    dns_resolver.getaddress("symbolics.com")#the first domain name ever. Will probably not be removed ever.
    return true
  rescue Resolv::ResolvError => e
    return false
  end
end

希望这可以帮助某人:)

答案 2 :(得分:4)

您可以使用Ping类。

require 'resolv-replace'
require 'ping'

def internet_connection?
  Ping.pingecho "google.com", 1, 80
end

该方法返回truefalse,但不会引发异常。

答案 3 :(得分:2)

Simone Carletti's answer相同的基础知识,但与 Ruby 2 兼容:

# gem install "net-ping"

require "net/ping"

def internet_connection?
  Net::Ping::External.new("8.8.8.8").ping?
end

答案 4 :(得分:1)

require 'open-uri'

page = "http://www.google.com/"
file_name = "output.txt"
output = File.open(file_name, "a")
begin
  web_page = open(page, :proxy_http_basic_authentication => ["http://your.company.proxy:80/", "your_user_name", "your_user_password"])  
  output.puts "#{Time.now}: connection established - OK !" if web_page
rescue Exception
  output.puts "#{Time.now}: Connection failed !"
  output.close
ensure
  output.close
end

答案 5 :(得分:0)

我试图找到与您类似的问题的解决方案,但找不到任何解决方案。不幸的是,由于某种我不知道的原因,Ping.pingecho 方法对我不起作用。我想出了一个解决方案。使用 httparty 的最新方法。我想在一个模块中使用它,所以这样做了,效果很好

# gem install httparty
require "httparty"

module Main
  def Main.check_net
    begin
      a = HTTParty.get("https://www.google.com")
      if a.length() >= 100
        puts "online"
      end
    rescue SocketError
      puts "offline"
    end
  end
end

include Main
Main.check_net

Google 的套接字错误可能不会发生,因此此方法有效

答案 6 :(得分:-1)

def connected?
  !!Socket.getaddrinfo("google.com", "http")  
rescue SocketError => e
  e.message != 'getaddrinfo: nodename nor servname provided, or not known'
end

由于它使用主机名,所以它需要做的第一件事是DNS查找,如果没有互联网连接,则会导致异常。