Advertisement
BanyRule

Untitled

Nov 27th, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.50 KB | None | 0 0
  1. //// СЕРВЕР
  2. #!/usr/bin/python
  3.  
  4. import errno
  5. import threading
  6. import socket
  7. import logging
  8. import json
  9.  
  10. HOST = ''
  11. PORT = 9090
  12.  
  13. BIND_ADDRESS = (HOST, PORT)
  14. BACKLOG = 100
  15.  
  16. logger = logging.getLogger('main')
  17.  
  18.  
  19. def handle(sock, clinet_ip, client_port):
  20.     # обработчик, работающий в процессе-потомке
  21.     logger.info('Start to process request from %s:%d' % (clinet_ip, client_port))
  22.     # читаем данные
  23.     in_buffer = b''
  24.     in_buffer += sock.recv(1024)
  25.     logger.info('In buffer: ' + repr(in_buffer))
  26.     # декодированные данные
  27.     decoded_array = json.loads(in_buffer.decode('utf-8'))
  28.     print(decoded_array)
  29.  
  30.     # ответ клиенту
  31.     try:
  32.         result = "OK"
  33.     except Exception as e:
  34.         result = repr(e)  # если словили исключение, сообщаем клиенту
  35.  
  36.     out_buffer = result.encode('utf-8') + b'\r\n'
  37.     logger.info('Out buffer = ' + repr(out_buffer))
  38.     # отправляем
  39.     sock.sendall(out_buffer)
  40.     sock.close()
  41.     logger.info('Done.')
  42.  
  43.  
  44. def server_loop():
  45.     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # слушающий сокет
  46.     sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # пример из docs.python.org/3/library/socket.html
  47.     sock.bind((HOST, PORT))
  48.     sock.listen(BACKLOG)
  49.     # слушаем и при получении нового входящего соединения,
  50.     # создаем новый thread, который будет его обрабатывать
  51.     logger.info('Listning no %s:%d...' % (HOST, PORT))
  52.     while True:
  53.         try:
  54.             connection, (client_ip, clinet_port) = sock.accept()
  55.         except IOError as e:
  56.             if e.errno == errno.EINTR:
  57.                 continue
  58.             raise
  59.         # запускаем нить
  60.         thread = threading.Thread(
  61.             target=handle,
  62.             args=(connection, client_ip, clinet_port)
  63.         )
  64.         thread.daemon = True
  65.         thread.start()
  66.  
  67.  
  68. def main():
  69.     # настраиваем логгинг
  70.     logger.setLevel(logging.DEBUG)
  71.     ch = logging.StreamHandler()
  72.     ch.setLevel(logging.DEBUG)
  73.     formatter = logging.Formatter(
  74.         '%(asctime)s [%(levelname)s] [%(thread)s] %(message)s',
  75.         '%H:%M:%S'
  76.     )
  77.     ch.setFormatter(formatter)
  78.     logger.addHandler(ch)
  79.     logger.info('Run')
  80.     # запускаем сервер
  81.     server_loop()
  82.  
  83.  
  84. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement