Repository navigation
Expand file tree
/
Copy pathChatServer.py
More file actions
90 lines (74 loc) · 2.91 KB
/
Copy pathChatServer.py
File metadata and controls
90 lines (74 loc) · 2.91 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
import socket, sys, select
from multiprocessing.pool import ThreadPool
class ChatServer:
def __init__(self, host, port):
self.active = True
self.clients = set([])
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.host = host
self.port = port
self.server_socket.bind((host, port))
self.server_socket.listen(5)
self.pool = ThreadPool(25)
self.greeting_message = "User joined to chat. Greet him/her!\r\n"
def start(self):
self.pool.apply_async(self.listen_to_new_connections)
self.pool.apply_async(self.listen_to_client_messages)
def stop(self):
if self.active:
self.active = False
self.server_socket.close()
def handle_new_connection(self, conn):
self.clients.add(conn)
print "Added user"
self.broadcast_message(conn, self.greeting_message, self.clients)
def listen_to_new_connections(self):
print "Listening"
while self.active:
conn, addr = self.server_socket.accept()
print "Connection recieved"
self.handle_new_connection(conn)
def get_number_of_active_clients(self):
return len(self.clients)
def listen_to_client_messages(self):
while self.active:
if self.clients:
try:
read_clients, write_clients, error_clients = select.select(self.clients, self.clients, [])
self.read_and_broadcast(read_clients, write_clients)
except:
print "Error!"
def read_and_broadcast(self, read_clients, write_clients):
for client in read_clients:
try:
message = client.recv(4096)
print "Message recieved"
except: # windows throws exception when connection is closed
message = ""
if message:
self.broadcast_message(client, message, write_clients)
else:
client.close()
self.clients.remove(client)
print "User removed"
def broadcast_message(self, messaged_client, message, write_clients):
for client in write_clients:
if messaged_client != client:
self.pool.apply_async(self.send_message, (client, message))
def send_message(self, client, message):
client.send(message)
client.flush()
if __name__ == '__main__':
if len(sys.argv) > 1:
host = sys.argv[1]
else:
host = "localhost"
if len(sys.argv) > 2:
port = int(sys.argv[2])
else:
port = 2023
chat_server = ChatServer(host, port)
print "Starting the server"
chat_server.start()
sys.stdin.read(1)