Найти - Пользователи
Полная версия: Демон udp.
Начало » Python для новичков » Демон udp.
1 2
iandriyanov
Недавно начал изучать. И взялся за демон сервера UDP который слушает все что ему приходит на порт: По-умолчанию это JSON.

Программа висит на порту, получает строку json'а, парсит, и записывает в БД (postgresql) объявленные данные, параллельно записывая эту строку в файл. Естественно для новичка, все это выглядит более или менее криво. Нужен рефакторинг, но это лирика.

Гораздо интереснее мне узнать как, осуществить проверку. Но для начала я опишу что хотелось бы мне от сообщества, какого рода помощи, быть может примеров.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys                                              # Standart library for compile source
import psycopg2                                         # Library for use connection with pgsql
import simplejson                                       # Lobrary for parse string in JSON
# Server program
from socket import *                                    # Foll import library of using and create UDP server (sock)
# Set the socket parameters
host = ""                                               # Listen any interfaces
port = 5005                                             # Port Listener
buf = 1500                                              # Size buffer for UDP listener
addr = (host,port)                                      # VARiable of sock connection
# Create socket and bind to address
UDPSock = socket(AF_INET,SOCK_DGRAM)                    # The create of socket connection
UDPSock.bind(addr)                                      # and accept configure
# Connector pgsql
con = psycopg2.connect('host=localhost dbname=logger_py user=log')          # Connector for database pgsql 
cur = con.cursor()                                      # Database connection cursor, aka. OPEN stream
# Receive messages
while True:
        data,addr = UDPSock.recvfrom(buf)               # Recive the data input on host (listen up comment of 'addr') in standart stream on the UDPsock
        if data:                                        # Statement of data
                res = simplejson.loads(data)            # VARiable of using standart lib simplejson for parse stream in data (Recived on UDPSock)
                cur.execute("insert into logger_py(point, datatime, event_id, cardnumber, firstname, lastname, dep, nick) values (%s, %s, %s, %s, %s, %s, %s, %s)", (res['POINT'], res['DATATIME'], res['EVENTID'], res['CARDNUMBER'], res['FIRSTNAME'], res['LASTNAME'], res['DEP'], res['MIDDLENAME']))
                                                        # This is string of request in database with 8(eight row) and 8(eight) Values, 
                                                                # Which take the value of the parse content JSON
                con.commit()                            # Send request after check on exploite or injection, and close connection
                print "\nReceived message '", data,"'"  # DEBUG info
                f = open('out.txt', 'a')                # -= Special for СКЛЕРОЗ =-
                f.write("\nReceived message '")         # -=  параллельно пишем  =-
                f.write(data)                           # -=  полученные даныне  =-
                f.write("' ;")                          # -=  в файл в каталоге  =- 
                f.close()                               # -=      ЗАКРЫВАЕМ      =-
                print "\nReceived message '", data,"'"  # DEBUG info
# Close socket
UDPSock.close()

JSON
Received message '{"POINT":"Дверь3","DATATIME":"2012-06-21 13:14:24","EVENTID":"22","CARDNUMBER":"********","FIRSTNAME":"username","LASTNAME":"usersurname","MIDDLENAME":"nickname","DEP":"departament"}' ;

Приведенный листинг, создает демон и начинает на порту слушать все что ему отправлет устройство, устройство натравлено на отправку данных именно на этот адрес:порт. Тут же процедура распарсивания JSON'а.

Однако если данные коннектора не верные (имя или порт) программа падает. Если все верно указано но база лежит, то программа запускается, однако как только прилетает на порт информация и срабатывает процедура, программа падает.

Что хотелось бы: Даже если коннектор не верный, или база лежит, программа чтобы не падала, но писала в файл, максимум в sqlite. Или же если коннектор вдруг упал или база, то и\или начать писать события в файл, причем помечая когда началась запись с отступом в файле о начале и об окончании, для визуального различия начала\конца операции, если коих будет не одна а несколько. Чтобы не путаться.

Заранее благодарю, за напуствия.
funnyman
Заюзать исключения и обрабутку исключений?
iandriyanov
funnyman
Заюзать исключения и обрабутку исключений?

Если бы я хотел поржать то неприменно написал бы на ЯП. За конструктив вам минус. Без обид. Топик новичков RTFM
fata1ex
iandriyanov
Если бы я хотел поржать то неприменно написал бы на ЯП. За конструктив вам минус. Без обид. Топик новичков RTFM

Непонятно, что вас не устроило в совершенно логичном ответе funnyman. Распарсить мне удалось только третье предложение, остальные ни в какую :(

Надеюсь, смысл уловите:
import logging
import random
import time
 
 
def action():
    if random.choice([True, False]):
        raise ValueError
    return time.time()
 
 
while True:
    try:
        current_time = action()
        print current_time
     
    except ValueError:
        logging.error('No time.')
     
    time.sleep(3)

[21:23] home:~/dev python exc.py 
1341941004.31
ERROR:root:No time.
1341941010.32
1341941013.33
ERROR:root:No time.
1341941019.33
...
iandriyanov
fata1ex
Надеюсь, смысл уловите:

Не уловил. Подскажите как это мне поможет, осуществить проверку, о которой я писал?
fata1ex
Программы в питоне сами по себе не падают. Перед падением они швыряются исключениями, которые можно ловить. Если при попытке подключения к коннектору по адресу-порту программа падает, значит можно исключение отловить и обработать по своему усмотрению (например, направлять гневный вывод в лог-файл). Если не работает база, то ловим исключение около подключения к базе и работаем по соответствующему вашему желанию сценарию.
iandriyanov
fata1ex
Программы в питоне сами по себе не падают. Перед падением они швыряются исключениями, которые можно ловить. Если при попытке подключения к коннектору по адресу-порту программа падает, значит можно исключение отловить и обработать по своему усмотрению (например, направлять гневный вывод в лог-файл). Если не работает база, то ловим исключение около подключения к базе и работаем по соответствующему вашему желанию сценарию.

Угу..вот так уже ближе к телу. Идея ясна
funnyman
а нельзя как нибудь убрать неадекватный минус из репы?
odnochlen
Ты на мои посмотри.
fata1ex
funnyman, по-моему я вам его убрал, разве нет?
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