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
105 changes: 86 additions & 19 deletions client/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,12 @@ def read_response(response, mode='w'):
if mode == 'w':
logger.debug(f"Response Message: {response.get('alert')}")
print(
f"Response Message: {response.get('alert')}"
f"{response.get('alert')}"
)
else:
print(
f"{response.get('user')['account_name']}: {response.get('user')['status']}\n",
f"Server: {response.get('alert')}"
f"{response.get('alert')}"
)
else:
logger.critical(f"Error request: {response.get('error')}")
Expand All @@ -77,32 +77,99 @@ def read_response(response, mode='w'):
hash_obj = hashlib.sha1()
hash_obj.update(b'secret_key')

user = {
"account_name": username,
"status": 'Online'
}

msg_presence = json.dumps(
{
"action": "presence",
"time": datetime.now().timestamp(),
"type": "status",
"user": {
"account_name": username,
"status": input("Your message: ")
}
"user": user
}
)
# отправить сообщение серверу;
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)

while True:
action = input("Enter action (chat, p2p, text, exit): ")
if action == 'exit':
logger.info(f"client closed")
sock.close()
break
elif action == 'text':
msg_action = json.dumps(
{
"action": input("Enter action (lower_text, upper_text): "),
"data": input("Enter data: "),
"user": user
}
)
sock.send(msg_action.encode())
# получить ответ сервера;
data = sock.recv(1024)
read_response(data)
elif action == 'chat':
join_request = json.dumps(
{
"action": "join",
"time": datetime.now().timestamp(),
"room": "#common",
"user": user
}
)
sock.send(join_request.encode())
data = sock.recv(1024)
while True:
message = input("Enter message (or exit): ")
if message == 'exit':
leave_request = json.dumps(
{
"action": "leave",
"time": datetime.now().timestamp(),
"room": "#common",
"user": user
}
)
sock.send(leave_request.encode())
break
chat_request = json.dumps({
"action": "msg",
"time": datetime.now().timestamp(),
"to": '#common',
"from": username,
"encoding": "utf-8",
"message": message,
"user": user
})
# отправить сообщение серверу;
sock.send(chat_request.encode())
# получить ответ сервера;
data = sock.recv(1024)
read_response(data)
elif action == 'p2p':
sendto = input("Enter user_name for send: ")
while True:
message = input("Enter message (or exit): ")
if message == 'exit':
break

p2p_request = json.dumps({
"action": "msg",
"time": datetime.now().timestamp(),
"to": sendto,
"from": username,
"encoding": "utf-8",
"message": message,
"user": user
})
# отправить сообщение серверу;
sock.send(p2p_request.encode())
# получить ответ сервера;
data = sock.recv(1024)
read_response(data)
else:
while True: # Постоянный опрос сервера
data = sock.recv(1024)
Expand Down
81 changes: 47 additions & 34 deletions server/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
from socket import socket, AF_INET, SOCK_STREAM
import argparse
import select

import threading
import collections


from protocol import (
Expand All @@ -27,42 +28,41 @@ def get_client_fullname(host, port):
return f'{ host }:{ port }'


def read_requests(r_clients, all_clients):
def read_requests(sock, allclients):
""" Чтение запросов из списка клиентов
"""
responses = []
#responses = []
#print('read_requests')
for sock in r_clients:
try:
print('client 1')
data = sock.recv(1024).decode('utf-8')
#responses[sock] = json.loads(data)
responses.append(json.loads(data))
print(responses[sock])
except:
print('Клиент {} {} отключился'.format(sock.fileno(), sock.getpeername()))
#all_clients.remove(sock)

return responses


def write_responses(requests, w_clients, all_clients):
for req in requests:
#for sock in r_clients:
try:
data = sock.recv(1024).decode('utf-8')
#responses[sock] = json.loads(data)
#print(responses[sock])
requests.append(json.loads(data))
#print(requests[sock])
except:
print('Клиент {} {} отключился'.format(sock.fileno(), sock.getpeername()))
clients.remove(sock)

#return responses


def write_responses(req, sock, all_clients):
#for req in requests:
#print('write_responses')
#print(req)
# Разобрать все запросы
response = handle_client_request(req)
response_string = json.dumps(response)
for sock in w_clients:
try:
# отправить всем
sock.send(response_string.encode('utf-8'))
#print('Сообщение отправлено')
except: # Сокет недоступен, клиент отключился
print('Клиент {} {} отключился'.format(sock.fileno(), sock.getpeername()))
#sock.close()
#all_clients.remove(sock)
requests.remove(req)
#for sock in w_clients:
try:
# отправить всем
sock.send(response_string.encode('utf-8'))
#print('Сообщение отправлено')
except: # Сокет недоступен, клиент отключился
print('Клиент {} {} отключился'.format(sock.fileno(), sock.getpeername()))
#sock.close()
#all_clients.remove(sock)


parser = createParser()
Expand All @@ -74,11 +74,11 @@ def write_responses(requests, w_clients, all_clients):
sock.listen(5)
sock.settimeout(0.2)

requests = []
requests = collections.deque()
responses = collections.deque()
connections = []
clients = []


try:
while True:
try:
Expand All @@ -98,10 +98,23 @@ def write_responses(requests, w_clients, all_clients):
try:
r, w, e = select.select(clients, clients, [], wait)

#print('r:', len(r), ' w:', len(w), ' e:', len(e))
requests = read_requests(r, clients) # Сохраним запросы клиентов

for sock in r:
#print('r:', len(r), ' w:', len(w), ' e:', len(e))
read_thred = threading.Thread(
target=read_requests, args=(sock, clients),
)
read_thred.start()

# requests = read_requests(r, clients) # Сохраним запросы клиентов
if requests:
write_responses(requests, w, clients) # Выполним отправку ответов
request = requests.popleft()
for sock in w:
write_thred = threading.Thread(
target=write_responses, args=(request, sock, clients)
)
write_thred.start()
#write_responses(requests, w, clients) # Выполним отправку ответов
except:
pass # Ничего не делать, если какой-то клиент отключился

Expand Down
17 changes: 17 additions & 0 deletions server/join/controllers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from protocol import make_response, make_400
from log import log

@log
def jim_join(request):
room = request.get('room')
user = request.get('user')
print('jim_join')
if not user or not room:
return make_400(request)
return make_response(
request,
200,
send_to=room,
send_from=user['account_name'],
alert=f"{user['account_name']} join the room: {room} "
)
6 changes: 6 additions & 0 deletions server/join/routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from .controllers import jim_join


routes = [
{'action': 'join', 'controller': jim_join}
]
16 changes: 16 additions & 0 deletions server/leave/controllers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from protocol import make_response, make_400
from log import log

@log
def jim_leave(request):
room = request.get('room')
user = request.get('user')
if not user or not room:
return make_400(request)
return make_response(
request,
200,
send_to=room,
send_from=user['account_name'],
alert=f"{user['account_name']} leave the room: {room} "
)
6 changes: 6 additions & 0 deletions server/leave/routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from .controllers import jim_leave


routes = [
{'action': 'leave', 'controller': jim_leave}
]
22 changes: 22 additions & 0 deletions server/msg/controllers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from protocol import make_response, make_400
from log import log

@log
def jim_msg(request):
request_to = request.get('to')
request_from = request.get('from')
user = request.get('user')
print('jim_msg')

message = request.get('message')

if not user or not request_to or not request_from:
return make_400(request)
return make_response(
request,
200,
send_to=request_to,
send_from=request_from,
alert=f"{user['account_name']}: {message} "
)

6 changes: 6 additions & 0 deletions server/msg/routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from .controllers import jim_msg


routes = [
{'action': 'msg', 'controller': jim_msg}
]
7 changes: 5 additions & 2 deletions server/presence/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@
from log import log

@log
def send_presence(request):
def jim_presence(request):

user = request.get('user')
if not user:
return make_400(request)
return make_response(
request,
200,
alert=f"{user['account_name']} Your message is send "
send_to=user['account_name'],
send_from=user['account_name'],
alert=f"HI {user['account_name']}"
)
4 changes: 2 additions & 2 deletions server/presence/routes.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from .controllers import send_presence
from .controllers import jim_presence


routes = [
{'action': 'presence', 'controller': send_presence}
{'action': 'presence', 'controller': jim_presence}
]
5 changes: 3 additions & 2 deletions server/protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ def validate_request(raw):
return False


def make_response(request, code, data=None, error=None, alert=None):
def make_response(request, code, send_to=None, send_from=None, data=None, error=None, alert=None):
return {
'action': request.get('action'),
'user': request.get('user'),
'to': send_to,
'from': send_from,
'time': datetime.now().timestamp(),
'data': data,
'response': code,
Expand Down
16 changes: 16 additions & 0 deletions server/quit/controllers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from protocol import make_response, make_400
from log import log

@log
def jim_quit(request):
user = request.get('user')

if not user:
return make_400(request)
return make_response(
request,
200,
send_to=user['account_name'],
send_from=user['account_name'],
alert=f"{user['account_name']} quit "
)
6 changes: 6 additions & 0 deletions server/quit/routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from .controllers import jim_quit


routes = [
{'action': 'quit', 'controller': jim_quit}
]
Loading