Найти - Пользователи
Полная версия: как узнать, доступен ли сервер
Начало » Python для новичков » как узнать, доступен ли сервер
1
Michael_Levin
Есть внутренний сервер по такому пути:
request = 'http://192.168.0.119:8066/api/nodes'

Я скачиваю из него дату:
urllib2.urlopen(request)

Никак не уразумею, как мне быстро понять,что сервер не доступен. Из дома например, или когда какой-то факап сети, он начинает по 20секунд обдумывать, прежде чем выдать эррор.

Значит я пытался использовать модуль ping ( http://stackoverflow.com/questions/316866/ping-a-site-in-python ), не понял как им воспользоваться в моем случае - он такой запрос не понимает. Еще пробовал NetServerGetInfo ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa370624(v=vs.85).aspx )
Он тоже не подходит.

Как правильно поступать?
odnochlen
Michael_Levin
как мне быстро понять,что сервер не доступен
ТАк и понять - ловить таймаут. Его можно сделать меньше.
Singularity
Может это ?
>>> a=urllib.urlopen2('http://www.google.com/', timeout=1)
>>> a.getcode()
200
Если ответ другой то с сервером что то не так

Michael_Levin
в общем, наверное, да, можно через таймаут, хотя в моем случае не очень понятно - дата скачивается за допустим 7 секунд, и если таймаут указать меньше он вылетает с ошибкой.

еще можно так:
http://snipplr.com/view/19639/

ping конечно поставил, он просто именно мой запрос не разобрал

спасибо!
odnochlen
Michael_Levin, попробуй выставить таймаут именно на процесс соединения.
Michael_Levin
odnochlen
Michael_Levin, попробуй выставить таймаут именно на процесс соединения.
имеется в виду это?
socket.create_connection(('192.168.0.119', 8066), 1)
socket.create_connection(('192.168.0.119', 8068), 1)

в первом случае (работающий адрес) - всё окей, во втором (не работающий) - socket.error: No connection could be made because the target machine actively refused it.

Я правильно понял? Ловить ошибку именно?
odnochlen
Вообще-то я имел в виду как-нибудь прописать это в http клиент, но так тоже можно - проверяем порт, если работает - запрашиваем файл.
Actor
def is_alive(address, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((address, port))
        return True
    except:
        return False
Michael_Levin
спасибо, ребят, так нормально!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB