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
74 changes: 74 additions & 0 deletions hw_lesson_08/client/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
from argparse import ArgumentParser
import socket
import datetime
import logging
import jim
import settings


def get_presence_msg(action, data):
time = datetime.datetime.now()
msg = {
"action": action,
"time": time.isoformat(),
"user": {
"account_name": "anonim",
"status": "Yep, I am here!"
},
"data": data
}

return jim.pack(msg)


host = getattr(settings, 'HOST', '127.0.0.1')
port = getattr(settings, 'PORT', 7777)

parser = ArgumentParser()
parser.add_argument('-a', '--addr', type=str, help='Sets ip address')
parser.add_argument('-p', '--port', type=int, help='Sets port')
parser.add_argument('-m', '--mode', type=str, default='w')

args = parser.parse_args()

if args.addr:
host = args.addr
if args.port:
port = args.port

logger = logging.getLogger('main')
handler = logging.FileHandler('client.log', encoding=settings.ENCODING)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

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

logger.setLevel(logging.DEBUG)
logger.addHandler(handler)

try:
sock = socket.socket()
sock.connect((host, port))
logger.info(f'Client started with {host}:{port}')
print(f'Client started with {host}:{port}')

if args.mode == 'w':
while True:
action = input('Enter action to send:')
data = input('Enter data to send:')

msg = get_presence_msg(action, data)
sock.sendall(msg)
else:
while True:
response = sock.recv(settings.BUFFERSIZE)
response = jim.unpack(response)
logger.info(f'Got next response from server: {response}')
print(f'Got next response from server: {response}')

except KeyboardInterrupt:
logger.info('Client closed')
print('Client closed')



9 changes: 9 additions & 0 deletions hw_lesson_08/client/client.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
2019-04-25 20:53:53,396 - INFO - Client started with 127.0.0.1:7777
2019-04-25 20:54:16,453 - INFO - Client started with 127.0.0.1:7777
2019-04-25 20:55:07,847 - INFO - Client closed
2019-04-25 20:57:12,278 - INFO - Client started with 127.0.0.1:7777
2019-04-25 20:57:15,885 - INFO - Client started with 127.0.0.1:7777
2019-04-25 20:57:27,881 - INFO - Got next response from server: {'action': 'echo', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'time': 1556215047.880693, 'data': 'test', 'code': 200}
2019-04-25 20:57:47,815 - INFO - Got next response from server: {'action': 'now', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'time': 1556215067.814953, 'data': '2019.04.25', 'code': 200}
2019-04-25 20:57:58,583 - INFO - Got next response from server: {'action': 'bad', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'time': 1556215078.583333, 'data': 'Action is not supported', 'code': 404}
2019-04-25 20:58:30,582 - INFO - Client closed
21 changes: 21 additions & 0 deletions hw_lesson_08/client/jim.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import json


def pack(dict_msg):
"""
Создание сообщения, пригодного для отправки через TCP
:param dict_msg: dict
:return: str
"""
str_msg = json.dumps(dict_msg)
return str_msg.encode('utf-8')


def unpack(bt_str):
"""
Распаквка полученного сообщения
:param bt_str: str
:return: dict
"""
str_decoded = bt_str.decode('utf-8')
return json.loads(str_decoded)
4 changes: 4 additions & 0 deletions hw_lesson_08/client/settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
HOST = "127.0.0.1"
PORT = 7777
BUFFERSIZE = 1024
ENCODING = 'utf-8'
109 changes: 109 additions & 0 deletions hw_lesson_08/server/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
from argparse import ArgumentParser
import socket
import datetime
import logging
import select
import threading
import jim
import settings
from routes import resolve, get_server_routes
from protocol import (
validate_request, make_response,
make_400, make_404
)

from handlers import handle_request


def get_response_msg():
msg = {
"response": 200,
"alert": "Необязательное сообщение/уведомление"
}
return jim.pack(msg)


def read_client_data(client, requests, buffersize):
b_request = client.recv(buffersize)
requests.append(b_request)


def write_client_data(client, response):
client.send(response)


host = getattr(settings, 'HOST', '127.0.0.1')
port = getattr(settings, 'PORT', 7777)

parser = ArgumentParser()
parser.add_argument('-a', '--addr', type=str, help='Sets ip address')
parser.add_argument('-p', '--port', type=int, help='Sets port')

args = parser.parse_args()

if args.addr:
host = args.addr
if args.port:
port = args.port

handler = logging.FileHandler('main.log', encoding=settings.ENCODING)
error_handler = logging.FileHandler('error.log', encoding=settings.ENCODING)

logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
handler,
error_handler,
logging.StreamHandler(),
]
)


def main():

requests = []
connections = []

try:
sock = socket.socket()
sock.bind((host, port))
sock.settimeout(0)
sock.listen(5)
logging.info(f'Server started with {host}:{port}')
while True:
try:
client, address = sock.accept()
logging.info(f'Client detected {address}')
connections.append(client)
except Exception:
pass

if connections != []:
rlist, wlist, xlist = select.select(
connections, connections, connections, 0
)

for r_client in rlist:
thread = threading.Thread(
target=read_client_data,
args=(r_client, requests, settings.BUFFERSIZE)
)
thread.start()

if requests:
b_request = requests.pop()
b_response = handle_request(b_request)

for w_client in wlist:
thread = threading.Thread(
target=write_client_data,
args=(w_client, b_response)
)
thread.start()

except KeyboardInterrupt:
logging.info('Server closed')


main()
Empty file.
11 changes: 11 additions & 0 deletions hw_lesson_08/server/dates/controllers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from datetime import datetime
from protocol import make_response
from decorators import logged


@logged
def get_date_now(request):
date = datetime.now()
return make_response(
request, 200, date.strftime('%Y.%m.%d')
)
7 changes: 7 additions & 0 deletions hw_lesson_08/server/dates/routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from .controllers import (
get_date_now
)

routes = [
{'action': 'now', 'controller': get_date_now}
]
17 changes: 17 additions & 0 deletions hw_lesson_08/server/dates/tests/test_dates_now.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from datetime import datetime

from dates.controllers import get_date_now


def test_get_date_now():
date = datetime.now()
s_date = date.strftime('%Y.%m.%d')

request = {
'time': datetime.now().timestamp(),
'action': 'now'
}

response = get_date_now(request)

assert response.get('data') == s_date
14 changes: 14 additions & 0 deletions hw_lesson_08/server/decorators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import logging
import sys

logger = logging.getLogger('decorators')


def logged(func):
def wrapper(*args, **kwargs):
logger.debug(f'{ func.__name__ } - with args:{ args }, { kwargs }')
caller = sys._getframe(1).f_code.co_name
logger.debug(f'{func.__name__} called from function: {caller}')
return func(*args, **kwargs)

return wrapper
Empty file.
14 changes: 14 additions & 0 deletions hw_lesson_08/server/echo/controllers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from datetime import datetime
from protocol import make_response, make_400
from decorators import logged


@logged
def get_echo(request):
data = request.get('data')
if data:
return make_response(
request, 200, data
)

return make_400(request)
7 changes: 7 additions & 0 deletions hw_lesson_08/server/echo/routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from .controllers import (
get_echo
)

routes = [
{'action': 'echo', 'controller': get_echo}
]
15 changes: 15 additions & 0 deletions hw_lesson_08/server/echo/tests/test_echo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from datetime import datetime

from echo.controllers import get_echo

def test_get_echo():
request = {
'time': datetime.now().timestamp(),
'action': 'now',
'data': 'Hello'
}

response = get_echo(request)

assert response.get('data') == 'Hello'

13 changes: 13 additions & 0 deletions hw_lesson_08/server/echo/tests/test_echo_bad_request.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from datetime import datetime

from echo.controllers import get_echo

def test_echo_bad_request():
request = {
'time': datetime.now().timestamp(),
'action': 'now'
}

response = get_echo(request)

assert response.get('code') == 400
36 changes: 36 additions & 0 deletions hw_lesson_08/server/error.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
2019-04-25 20:53:31,685 - INFO - Server started with 127.0.0.1:7777
2019-04-25 20:53:53,396 - INFO - Client detected ('127.0.0.1', 41878)
2019-04-25 20:54:16,453 - INFO - Client detected ('127.0.0.1', 41880)
2019-04-25 20:54:28,942 - DEBUG - validate_request - with args:({'action': 'now', 'time': '2019-04-25T20:54:28.942254', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'data': 'hello'},), {}
2019-04-25 20:54:28,942 - DEBUG - validate_request called from function: handle_request
2019-04-25 20:54:28,974 - DEBUG - get_date_now - with args:({'action': 'now', 'time': '2019-04-25T20:54:28.942254', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'data': 'hello'},), {}
2019-04-25 20:54:28,974 - DEBUG - get_date_now called from function: handle_request
2019-04-25 20:54:28,974 - DEBUG - make_response - with args:({'action': 'now', 'time': '2019-04-25T20:54:28.942254', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'data': 'hello'}, 200, '2019.04.25'), {}
2019-04-25 20:54:28,974 - DEBUG - make_response called from function: get_date_now
2019-04-25 20:54:28,974 - INFO - Request is valid and processed by controller
2019-04-25 20:55:01,467 - INFO - Server closed
2019-04-25 20:57:05,445 - INFO - Server started with 127.0.0.1:7777
2019-04-25 20:57:12,278 - INFO - Client detected ('127.0.0.1', 41882)
2019-04-25 20:57:15,885 - INFO - Client detected ('127.0.0.1', 41884)
2019-04-25 20:57:27,878 - DEBUG - validate_request - with args:({'action': 'echo', 'time': '2019-04-25T20:57:27.877941', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'data': 'test'},), {}
2019-04-25 20:57:27,878 - DEBUG - validate_request called from function: handle_request
2019-04-25 20:57:27,880 - DEBUG - get_echo - with args:({'action': 'echo', 'time': '2019-04-25T20:57:27.877941', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'data': 'test'},), {}
2019-04-25 20:57:27,880 - DEBUG - get_echo called from function: handle_request
2019-04-25 20:57:27,880 - DEBUG - make_response - with args:({'action': 'echo', 'time': '2019-04-25T20:57:27.877941', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'data': 'test'}, 200, 'test'), {}
2019-04-25 20:57:27,880 - DEBUG - make_response called from function: get_echo
2019-04-25 20:57:27,880 - INFO - Request is valid and processed by controller
2019-04-25 20:57:47,814 - DEBUG - validate_request - with args:({'action': 'now', 'time': '2019-04-25T20:57:47.813459', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'data': 'test'},), {}
2019-04-25 20:57:47,814 - DEBUG - validate_request called from function: handle_request
2019-04-25 20:57:47,814 - DEBUG - get_date_now - with args:({'action': 'now', 'time': '2019-04-25T20:57:47.813459', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'data': 'test'},), {}
2019-04-25 20:57:47,814 - DEBUG - get_date_now called from function: handle_request
2019-04-25 20:57:47,814 - DEBUG - make_response - with args:({'action': 'now', 'time': '2019-04-25T20:57:47.813459', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'data': 'test'}, 200, '2019.04.25'), {}
2019-04-25 20:57:47,814 - DEBUG - make_response called from function: get_date_now
2019-04-25 20:57:47,814 - INFO - Request is valid and processed by controller
2019-04-25 20:57:58,582 - DEBUG - validate_request - with args:({'action': 'bad', 'time': '2019-04-25T20:57:58.581712', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'data': 'test'},), {}
2019-04-25 20:57:58,582 - DEBUG - validate_request called from function: handle_request
2019-04-25 20:57:58,582 - ERROR - Action bad does not exits
2019-04-25 20:57:58,582 - DEBUG - make_404 - with args:({'action': 'bad', 'time': '2019-04-25T20:57:58.581712', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'data': 'test'},), {}
2019-04-25 20:57:58,582 - DEBUG - make_404 called from function: handle_request
2019-04-25 20:57:58,583 - DEBUG - make_response - with args:({'action': 'bad', 'time': '2019-04-25T20:57:58.581712', 'user': {'account_name': 'anonim', 'status': 'Yep, I am here!'}, 'data': 'test'}, 404, 'Action is not supported'), {}
2019-04-25 20:57:58,583 - DEBUG - make_response called from function: make_404
2019-04-25 20:58:26,614 - INFO - Server closed
Loading