-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathServer.py
More file actions
88 lines (68 loc) · 2.95 KB
/
Server.py
File metadata and controls
88 lines (68 loc) · 2.95 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
from threading import Thread
import socket
import select
# network constants
HOST = 'localhost'
PORT = 5000
RECV_BUFFER = 4096
# global variables
server_socket = ''
accepted_socket = ''
socket_list = []
# ---------------------------------------------------#
# ---------INITIALIZE CONNECTION VARIABLES-----------#
# ---------------------------------------------------#
def init_connection():
global server_socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))
socket_list.append(server_socket)
# ---------------------------------------------------#
# ----------------CONNECTION MANAGEMENT--------------#
# ---------------------------------------------------#
# broadcast messages to all connected clients
def broadcast(sender_socket, message):
global socket_list, server_socket
for a_socket in socket_list:
# send the message only to peer
if (a_socket != server_socket) and (a_socket != sender_socket):
try:
a_socket.send(message)
except socket.error:
a_socket.close()
if a_socket in socket_list:
socket_list.remove(a_socket)
# run server, messages from clients will be broadcasted
def run_server():
global accepted_socket, server_socket
server_socket.listen(10)
accepted_socket, address = server_socket.accept()
socket_list.append(accepted_socket)
while True:
ready_to_read, ready_to_write, in_error = select.select(socket_list, [], [], 0)
for sock_ready2read in ready_to_read:
# a new connection request received
if sock_ready2read == server_socket:
accepted_socket, address = server_socket.accept()
socket_list.append(accepted_socket)
broadcast_msg = "%s entered our chatting room\n" % str(address)
broadcast(accepted_socket, broadcast_msg)
# a message from a client, not a new connection
else:
try:
# receiving data from the socket.
data = sock_ready2read.recv(RECV_BUFFER)
broadcast_msg = "\r" + str(sock_ready2read.getpeername()) + ': ' + data
broadcast(sock_ready2read, broadcast_msg)
except socket.error:
# recv method cannot be done means a socket is broken, so it has to be removed
sock_ready2read.close()
if sock_ready2read in socket_list:
socket_list.remove(sock_ready2read)
broadcast_msg = "Client %s is offline\n" % str(address)
broadcast(server_socket, broadcast_msg)
continue
accepted_socket.close()
if __name__ == '__main__':
init_connection()
Thread(target=run_server, name='Server').start()