检查 Ruby 是否存在互联网连接?

问题描述 投票:0回答:7

只是询问如何使用 javascript 检查是否存在互联网连接,并得到了一些很好的答案。 在 Ruby 中执行此操作最简单的方法是什么? 在尝试使生成的 html 标记代码尽可能干净时,我想根据是否有互联网条件有条件地呈现 javascript 文件的脚本标记。 像这样的东西(这是 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"}
ruby browser internet-connection
7个回答
22
投票
require 'open-uri'

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

这更接近OP所寻求的。它适用于 Ruby 1.8 和 1.9。也比较干净一点。


14
投票

我喜欢每个人都简单地假设谷歌服务器已经启动。谷歌的信用。

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

您可以使用 Ruby DNS Resolv 尝试将 url 转换为 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

希望这可以帮助别人:)


7
投票

您可以在 Ruby 中使用

Ping
类 <=1.9:

require 'resolv-replace'
require 'ping'

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

该方法返回

true
false
并且不会引发异常。


4
投票

Simone Carletti 的答案中的基础知识相同,但与 Ruby 2兼容:

# gem install "net-ping"

require "net/ping"

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

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

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 的套接字错误可能不会发生,因此此方法将起作用


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

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

© www.soinside.com 2019 - 2024. All rights reserved.