Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.coverage
__pycache__
.pytest_cache
116 changes: 116 additions & 0 deletions client/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
#!/usr/bin/python3
__author__ = "Андрей Петров"

"""
клиент отправляет запрос серверу;
сервер отвечает соответствующим кодом результата. Клиент и сервер должны быть реализованы в виде отдельных скриптов,
содержащих соответствующие функции.

Функции клиента:
сформировать presence-сообщение;
отправить сообщение серверу;
получить ответ сервера;
разобрать сообщение сервера;
параметры командной строки скрипта client.py <addr> [<port>]: addr — ip-адрес сервера;
port — tcp-порт на сервере,
по умолчанию 7777.

"""
import re
import sys
import argparse
from socket import socket, AF_INET, SOCK_STREAM
import json
import hashlib
from datetime import datetime
from client_log_config import logger
import select


def create_parser():
parser = argparse.ArgumentParser()
parser.add_argument('host', nargs='?', default='localhost')
parser.add_argument('port', nargs='?', default='7777')
parser.add_argument('-m', '--mode', nargs='?', type=str, default='w')
return parser


def read_response(response, mode='w'):
response = json.loads(
data.decode('utf-8')
)
# разобрать сообщение сервера;

if response.get('response') == 200:
if response.get('alert'):
if mode == 'w':
logger.debug(f"Response Message: {response.get('alert')}")
print(
f"Response Message: {response.get('alert')}"
)
else:
print(
f"{response.get('user')['account_name']}: {response.get('user')['status']}\n",
f"Server: {response.get('alert')}"
)
else:
logger.critical(f"Error request: {response.get('error')}")


parser = create_parser()
args = parser.parse_args(sys.argv[1:])

port = int(re.search('[0-9]{2,}', args.port).group(0))



try:
sock = socket(AF_INET, SOCK_STREAM)
sock.connect((args.host, port))

if args.mode == 'w':
username = input("Enter user Name: ")
while True:
# сформировать presence-сообщение;
# В формате JIM

hash_obj = hashlib.sha1()
hash_obj.update(b'secret_key')

msg_presence = json.dumps(
{
"action": "presence",
"time": datetime.now().timestamp(),
"type": "status",
"user": {
"account_name": username,
"status": input("Your message: ")
}
}
)
# отправить сообщение серверу;
sock.send(msg_presence.encode())
"""
msg_action = json.dumps(
{
"action": input("Enter action (lower_text): "),
"data": input("Enter data: ")
}
)

sock.send(msg_action.encode())
"""
# получить ответ сервера;
data = sock.recv(1024)
read_response(data)
else:
while True: # Постоянный опрос сервера
data = sock.recv(1024)
read_response(data, 'r')
#sock.close()
except KeyboardInterrupt:
logger.info(f"client closed")
sock.close()

except Exception:
logger.critical(f'client cant conntect to host:{args.host} port{port}')
18 changes: 18 additions & 0 deletions client/client_log_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
"""
Создание именованного логгера;
Сообщения лога должны иметь следующий формат: "<дата-время> <уровеньважности> <имямодуля> <сообщение>";
Журналирование должно производиться в лог-файл;
На стороне сервера необходимо настроить ежедневную ротацию лог-файлов.
"""

import logging.handlers

logger = logging.getLogger('client')
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(module)s - %(message)s')
handler = logging.handlers.TimedRotatingFileHandler('log/client.log', when='d', interval=1, backupCount=4)

handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)

logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
187 changes: 0 additions & 187 deletions lesson01/hw01.py

This file was deleted.

3 changes: 0 additions & 3 deletions lesson01/test_file.txt

This file was deleted.

13 changes: 0 additions & 13 deletions lesson02/file.yaml

This file was deleted.

42 changes: 0 additions & 42 deletions lesson02/info_1.txt

This file was deleted.

Loading