71 lines
2.1 KiB
Python
71 lines
2.1 KiB
Python
import socket
|
|
import select
|
|
|
|
HEADER_LENGTH=10
|
|
IP="172.16.0.27."
|
|
#IP="86.242.99.166"
|
|
#IP='192.168.1.11'
|
|
IP=socket.gethostname()
|
|
IP=''
|
|
print(IP)
|
|
PORT=1236
|
|
|
|
|
|
server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
|
|
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
|
|
|
|
server_socket.bind((IP,PORT))
|
|
|
|
server_socket.listen()
|
|
|
|
sockets_list=[server_socket]
|
|
|
|
clients={}
|
|
|
|
def receive_message(client_socket):
|
|
try:
|
|
message_header=client_socket.recv(HEADER_LENGTH)
|
|
if not len(message_header):
|
|
return False
|
|
else:
|
|
message_length=int(message_header.decode("utf-8").strip())
|
|
return {"header":message_header,"data":client_socket.recv(message_length)}
|
|
except:
|
|
return False
|
|
|
|
while True:
|
|
read_sockets,_,exception_sockets=select.select(sockets_list,[],sockets_list)
|
|
for notified_socket in read_sockets:
|
|
if notified_socket==server_socket:
|
|
client_socket,client_address=server_socket
|
|
|
|
user = receive_message(client_socket)
|
|
if user is False:
|
|
continue
|
|
|
|
sockets_list.append(client_socket)
|
|
|
|
clients[client_socket]=user
|
|
|
|
print(f"Accepted new connection from {client_address[0]}:{client_address[1]} username: {user['data'].decode('utf-8')}")
|
|
|
|
else:
|
|
message=receive_message(notified_socket)
|
|
if message is False:
|
|
m=clients[notified_socket]['data'].decode('utf-8')
|
|
print("Closed connection from {}".format(m))
|
|
sockets_list.remove(notified_socket)
|
|
del clients[notified_sockets]
|
|
continue
|
|
|
|
user = clients[notified_socket]
|
|
|
|
print(f"Received message from {user['data'].decode('utf-8')}: {message['data'].decode('utf-8')}")
|
|
for client_socket in clients:
|
|
if client_socket != notified_socket:
|
|
client_socket.send(user['header']+user['data']+message['header']+message['data'])
|
|
|
|
for notified_socket in exception_sockets:
|
|
sockets_list.remove(notified_socket)
|
|
del clients[notified_socket]
|