-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.py
More file actions
121 lines (101 loc) · 4.17 KB
/
client.py
File metadata and controls
121 lines (101 loc) · 4.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import argparse
import pickle
import socket
import threading
import time
import random
from bot.bot_chooser import pick_bot
from models.message import Message
description = "The client is responsible to connect to the server, write and read sockets to and from the " \
"server.\nArguments are not required. If arguments are not given, then those will be sett to the " \
"defaults. "
parser = argparse.ArgumentParser(description=description)
parser.add_argument('-ip', '--ipaddr', metavar='', type=str, help='IPv4 flag')
parser.add_argument('-p', '--port', metavar='', type=int, help='Port for the connection the default port is 6000')
parser.add_argument('-bn', '--botname', metavar='', type=str, help='The name of bot which represents a client.\n'
'Choose between those names (Alice, Bob, '
'Dora and Chuck)')
args = parser.parse_args()
def arg_handlers(arguments) -> tuple:
bots = ("Alice", "Bob", "Dora", "Chuck")
if (not arguments.botname) or (arguments.botname.title() not in bots):
username = random.choice(bots)
else:
username = arguments.botname.title()
if arguments.port:
port = arguments.port
else:
port = 6000
if arguments.ipaddr:
ipaddress = arguments.ipaddr
else:
ipaddress = socket.gethostbyname(socket.gethostname())
return username, ipaddress, port
# GLOBALS:
# Connection
USERNAME, IPADDR, PORT = arg_handlers(args)
ADDRESS = (IPADDR, PORT)
# Message:
FORMAT = 'utf-8'
BUFFER_SIZE = 1024
RECEIVED_MSGS_FROM_SERVER = []
RECEIVED_MSGS_FROM_BOTS = []
conn_refused = [False]
DISCONNECT = Message(sender=USERNAME, content="BYE", content_type="CONNECTION")
def receive_msg(connection: socket):
while True:
try:
received_msg = connection.recv(BUFFER_SIZE)
if received_msg:
message: Message = pickle.loads(received_msg)
else:
continue
if message.sender == "Host":
if message.content == "USERNAME":
connection.send(pickle.dumps(Message(sender=USERNAME, content_type="CONNECTION")))
elif message.content_type == "CONN-SUCCEED":
print(f"{message.sender}: {message.content}")
elif message.content_type == "DISCONNECT":
print(f"{message.sender}: {message.content}")
elif message.content_type == "CONN_REFUSED":
print(f"{message.sender}: {message.content}")
connection.send(pickle.dumps(DISCONNECT))
conn_refused[0] = True
break
else:
RECEIVED_MSGS_FROM_SERVER.append(message)
print(f"{message.sender}: {message.content}")
else:
RECEIVED_MSGS_FROM_BOTS.append(message)
time.sleep(2)
print(f"{message.sender}: {message.content}")
if len(RECEIVED_MSGS_FROM_BOTS) == 4:
connection.send(pickle.dumps(DISCONNECT))
break
except OSError as e:
print(e)
conn_refused[0] = True
break
connection.close()
def write_msg(connection: socket):
while True:
if len(RECEIVED_MSGS_FROM_SERVER) == 1:
# print(len(RECEIVED_MSGS_FROM_SERVER))
message = pick_bot(USERNAME, RECEIVED_MSGS_FROM_SERVER[0])
serialized_msg = pickle.dumps(message)
connection.send(serialized_msg)
break
elif conn_refused[0]:
break
else:
continue
if __name__ == "__main__":
try:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADDRESS)
receive_thread = threading.Thread(target=receive_msg, args=(client,))
receive_thread.start()
write_thread = threading.Thread(target=write_msg, args=(client,))
write_thread.start()
except ConnectionRefusedError:
print(f"You can't connect to the chatroom.\n Cause: No server is bind to address:{ADDRESS} not running")