2010-03-05 8 views
15

Juste demandé comment check if an internet connection exists using javascript et obtenu de bonnes réponses. Quelle est la façon la plus simple de le faire dans Ruby? En essayant de rendre le code de balisage html généré aussi propre que possible, je voudrais rendre conditionnellement le tag de script pour les fichiers javascript selon si une condition Internet ou non. Quelque chose comme (ce qui est HAML):Vérifiez si Internet Connection existe avec Ruby?

- 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"} 
+1

double possible de [Vérification de la connexion Internet] (http://stackoverflow.com/questions/1641984/checking-for-internet -connexion) –

+0

@CiroSantilli la question que vous avez indiquée est plus ancienne, mais c'est mieux formulé et a des réponses sensiblement meilleures ... –

+1

@BradWerth celui que nous dupe est bien par moi;) Je pense que l'autre est aussi bon que le contexte ici n'a pas ajouté beaucoup à mon sous-entendu: j'ai lu le seul paquebot de l'autre question et ai compris la même question. –

Répondre

6

Vous pouvez utiliser la classe Ping.

require 'resolv-replace' 
require 'ping' 

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

La méthode renvoie true ou false et ne soulève pas d'exceptions.

+1

Pourquoi la nécessité d'exiger 'resolv-replace'? En outre, 'ping' a été supprimé de la bibliothèque standard 1.9. Je suis venu avec un assez simple travail autour de [ici] (http://github.com/myronmarston/vcr/commit/30b6242a1b0e97a21c27808e416e9b9e8215f994) ... mais s'il y a une meilleure façon de le faire pour 1.9, faites le moi savoir. –

+1

Voir http://github.com/mperham/em-resolv-replace –

+1

Ceci est faux. Un pare-feu pourrait bloquer ICMP, auquel cas cela retournerait false. Mais la connexion internet pourrait être bien. –

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 
18
require 'open-uri' 

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

est plus proche de ce que l'OP cherche. Cela fonctionne dans Ruby 1.8 et 1.9. C'est un peu plus propre aussi.

+0

+1 J'ai eu un besoin similaire et c'était la solution la meilleure et la plus concise. – allesklar

+0

Le problème avec cette commande est qu'elle peut bloquer pendant longtemps si la connexion est en désordre et ajouter ': read_timeout' n'est pas toujours fiable:' open ("http://www.google.com ", {read_timeout: 5})' peut bloquer pendant plus de 5 secondes –

+1

En ce moment, avec ma connexion Internet en désordre: met Benchmark.measure {open ("http://www.google.com", {read_timeout: 5}.)} sorties 0,010000 0,000000 0,010000 (35,588267) => néant –

7

J'aime la façon dont tout le monde suppose simplement que les serveurs de googles sont en place. Creds à google.

Si vous voulez savoir si vous avez Internet sans compter sur google, vous pouvez utiliser DNS pour voir si vous êtes en mesure d'obtenir une connexion.

Vous pouvez utiliser Ruby DNS Resolv pour essayer de traduire une URL en adresse IP. Works pour la version Ruby 1.8.6+

Alors:

#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 

Hope this helps quelqu'un :)

+1

Ou utilisez [icann.org] (http://icann.org) Si ce réprouve alors DNS et Internet, – Automatico

+0

Obtenir une adresse IP ne signifie pas que l'IP est joignable –

+1

Bon point sur icann.org Je pense qu'une autre raison pour laquelle les gens par défaut à google est qu'il répond avec le contenu plus rapidement. même être plus rapide et à mon humble avis une meilleure solution –

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

Comme il utilise un nom d'hôte, la première chose qu'il doit faire est Recherche DNS, ce qui provoque l'exception s'il n'y a pas de connexion Internet.

+0

Souvent, les recherches DNS sont mises en cache sur un serveur local. ce n'est pas une garantie que l'internet est accessible. –

+0

Certainement une possibilité. – Kris

+0

@MarkThomas Le même argument peut être utilisé pour la page Web elle-même. Souvent, il y a des serveurs CDN et éventuellement des caches sur les routeurs eux-mêmes. Et qu'en est-il des pays qui bloquent google.com? Le seul moyen sûr de savoir est que vous vous connectez à un serveur que vous possédez qui a des données dépendantes du temps qu'il vous transfère que vous pouvez vérifier localement, et que vous savez seulement que vous avez accès à ce serveur. Je sais que le DNS est plus courant, mais je dis simplement qu'il peut y avoir beaucoup d'autres choses qui se passent aussi. – Automatico

2

bases mêmes que dans Simone Carletti's answer mais compatible avec Ruby 2:

# gem install "net-ping" 

require "net/ping" 

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

Même système que j'utilise dans mon _pet_ tool [internée] (https://rubygems.org/gems/interneeee) – fguillen

+0

Encore un autre moyen plus efficace que la réponse acceptée. Utilise moins de bande passante. – Rishav

Questions connexes