2010-03-05 20 views
15

Acabo de preguntar cómo check if an internet connection exists using javascript y obtuve excelentes respuestas. ¿Cuál es la forma más fácil de hacer esto en Ruby? Al tratar de hacer que el código de marcado html generado sea lo más limpio posible, me gustaría traducir condicionalmente la etiqueta del script para los archivos javascript dependiendo de si existe o no una condición de Internet. Algo así como (esto es HAML):Compruebe si existe conexión a internet 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

posible duplicado de [Comprobación de la conexión a Internet] (http://stackoverflow.com/questions/1641984/checking-for-internet -conexión) –

+0

@CiroSantilli la pregunta que indicó es anterior, pero está mejor redactada y tiene respuestas sustancialmente mejores ... –

+1

@BradWerth Cualquiera que engañamos está bien para mí;) Creo que el otro es tan bueno ya que el contexto aquí no le agregué mucho a mi subestimación: leí el delineador de la otra pregunta y entendí la misma pregunta. –

Respuesta

6

Usted puede utilizar la clase Ping.

require 'resolv-replace' 
require 'ping' 

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

El método devuelve true o false y no plantea excepciones.

+1

¿Por qué la necesidad de requerir 'resolv-replace'? Además, 'ping' ha sido eliminado de 1.9 lib estándar. Se me ocurrió una tarea bastante simple [aquí] (http://github.com/myronmarston/vcr/commit/30b6242a1b0e97a21c27808e416e9b9e8215f994) ... pero si hay una forma mejor de hacer esto para 1.9, házmelo saber. –

+1

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

+1

Esto es incorrecto. Un firewall podría estar bloqueando ICMP, en cuyo caso esto devolvería falso. Pero la conexión a internet podría estar 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 

Esto está más cerca de lo que el PO está buscando. Funciona en Ruby 1.8 y 1.9. También es un poco más limpio.

+0

+1 Tenía una necesidad similar y esa fue la mejor y más concisa solución. – allesklar

+0

El problema con este comando es que puede bloquear durante mucho tiempo si la conexión es desordenada y agregar ': read_timeout' no siempre es confiable:' open ("http://www.google.com ", {read_timeout: 5})' puede bloquear durante más de 5 segundos. –

+1

En este momento, con mi conexión a Internet desordenada: pone Benchmark.measure {open ("http://www.google.com", {read_timeout: 5}.)} salidas 0,010000 0,000000 0,010000 (35.588267) => nil –

7

Me encanta cómo todos simplemente asumen que los servidores de Google están listos. Creds a google.

Si quiere saber si tiene internet sin depender de google, entonces podría usar DNS para ver si puede obtener una conexión.

Puede usar Ruby DNS Resolv para tratar de traducir una url en una dirección IP. Obras para la versión de Ruby 1.8.6+

Así:

#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 

Esperamos que esto ayude a alguien :)

+1

O utilice [icann.org] (http://icann.org) Si desaprueba que a continuación, DNS, y el Internet, se deprecia básicamente. – Automatico

+0

Obtener una dirección IP no significa que la IP es alcanzable. –

+1

Un buen punto acerca de icann.org Creo que otra razón por la cual la gente usa Google es que responde con el contenido más rápido. Aunque una solicitud HTTP HEAD sería incluso ser más rápido y en mi humilde opinión una mejor solución. –

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

Puesto que utiliza un nombre de host que lo primero que tiene que hacer es Búsqueda DNS, que causa la excepción si no hay conexión a Internet.

+0

A menudo, las búsquedas DNS se almacenan en caché en un servidor local; esto no es garantía de que internet sea alcanzable. –

+0

Sin duda una posibilidad. – Kris

+0

@MarkThomas El mismo argumento se puede utilizar para la página web en sí. A menudo hay servidores CDN y posiblemente cachés en los mismos enrutadores. ¿Y qué hay de los países que bloquean google.com? La única forma segura de saber es que te conectas a un servidor que tienes que tiene algunos datos dependientes del tiempo que te transfiere y que puedes verificar localmente, y luego, solo sabes que tienes acceso a ese servidor. Sé que el DNS es más común, pero solo digo que también pueden suceder muchas otras cosas. – Automatico

2

Los mismos fundamentos como en Simone Carletti's answer pero compatible con Ruby 2:

# gem install "net-ping" 

require "net/ping" 

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

Mismo sistema que estoy usando en mi _pet_herramienta [interneeee] (https://rubygems.org/gems/interneeee) – fguillen

+0

Otra forma más eficiente que la respuesta aceptada. Utiliza menos ancho de banda. – Rishav

Cuestiones relacionadas