2010-03-05 13 views
15

Appena chiesto come check if an internet connection exists using javascript e ottenuto alcune grandi risposte. Qual è il modo più semplice per farlo in Ruby? Nel tentativo di rendere il codice di markup html più pulito possibile, mi piacerebbe rendere condizionatamente il tag script per i file javascript a seconda che fosse o meno una condizione di internet. Qualcosa di simile (questo è HAML):Verificare se la connessione Internet esiste con 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

possibile duplicato di [Controllo per la connessione internet] (http://stackoverflow.com/questions/1641984/checking-for-internet -connection) –

+0

@CiroSantilli la domanda che hai indicato è più vecchia, ma questo è meglio formulato e ha risposte sostanzialmente migliori ... –

+1

@BradWerth, a prescindere da uno che dupe va bene da me;) Penso che l'altro sia buono dato che il contesto qui non aggiungo molto al mio sottosaggio: ho letto l'unica fodera dall'altra domanda e ho capito la stessa domanda. –

risposta

6

È possibile utilizzare la classe Ping.

require 'resolv-replace' 
require 'ping' 

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

Il metodo restituisce true o false e non solleva eccezioni.

+1

Perché la necessità di richiedere "resolv-replace"? Inoltre, "ping" è stato eliminato dalla versione 1.9 standard. Ho trovato un lavoro abbastanza semplice in giro [qui] (http://github.com/myronmarston/vcr/commit/30b6242a1b0e97a21c27808e416e9b9e8215f994) ... ma se c'è un modo migliore per farlo per 1.9, fammi sapere. –

+1

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

+1

Questo è sbagliato. Un firewall potrebbe bloccare ICMP, nel qual caso ciò restituirebbe false. Ma la connessione Internet potrebbe andare bene. –

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 

Questo è più vicino a quello che il PO sta cercando. Funziona in Ruby 1.8 e 1.9. Anche un po 'più pulito.

+0

+1 Avevo un bisogno simile e quella era la soluzione migliore E più concisa. – allesklar

+0

Il problema con questo comando è che può bloccare a lungo se la connessione è disordinata e l'aggiunta di ': read_timeout' non è sempre affidabile:' open ("http://www.google.com ", {read_timeout: 5})' può bloccare per più di 5 secondi. –

+1

In questo momento, con la mia connessione internet disordinata: mette Benchmark.measure {open ("http://www.google.com", {read_timeout: 5}.)} uscite 0,010 mila 0.000000 0,010 mila (35,588,267 mila) => nil –

7

Mi piace il modo in cui tutti pensano che i server di Google siano attivi. Crediti per google.

Se si desidera sapere se si dispone di Internet senza fare affidamento su google, è possibile utilizzare DNS per verificare se è possibile ottenere una connessione.

È possibile utilizzare Ruby DNS Resolv per provare a tradurre un URL in un indirizzo IP. Lavori per la versione di Ruby 1.8.6+

Quindi:

#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 

Spero che questo aiuti qualcuno fuori :)

+1

Oppure utilizzare [icann.org] (http://icann.org) Se questo depreca poi DNS, e internet, deprecate fondamentalmente – Automatico

+0

Ottenere un indirizzo IP non significa che l'IP sia raggiungibile –

+1

Buon punto su icann.org .Penso che un altro motivo per cui le persone di default su google è che risponde con il contenuto più velocemente. anche essere più veloce e IMHO una soluzione migliore –

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

Dal momento che utilizza un nome host, la prima cosa che deve fare è Ricerca DNS, che causa l'eccezione se non c'è connessione a Internet.

+0

Spesso le ricerche DNS sono memorizzate nella cache su un server locale; questo non garantisce che Internet sia raggiungibile. –

+0

Certamente una possibilità. – Kris

+0

@MarkThomas Lo stesso argomento può essere utilizzato per la pagina Web stessa. Spesso ci sono server CDN e possibilmente cache sui router stessi. E i Paesi che bloccano google.com? L'unico modo sicuro per sapere è che ti colleghi a un server che possiedi che ha alcuni dati dipendenti dal tempo che ti trasferisce che puoi verificare localmente, e quindi, sai solo che hai accesso a quel server. So che il DNS è più comune, ma sto solo dicendo che possono esserci molte altre cose in corso. – Automatico

2

Stesse basi come in Simone Carletti's answer ma compatibile con Ruby 2:

# gem install "net-ping" 

require "net/ping" 

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

Lo stesso sistema che sto usando nel mio strumento _pet_ [interneeee] (https://rubygems.org/gems/interneeee) – fguillen

+0

Ancora un altro modo più efficiente della risposta accettata. Utilizza meno larghezza di banda. – Rishav

Problemi correlati