Advertisement
Guest User

server.py

a guest
Apr 18th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.93 KB | None | 0 0
  1. from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
  2. from threading import Thread
  3. from datetime import datetime
  4. from select import select
  5.  
  6. class Server():
  7.     def __init__(self):
  8.         self.HEADER_LENGTH = 10
  9.         self.server = ('localhost', 1234)
  10.         self.server_socket = socket(AF_INET, SOCK_STREAM)
  11.         self.server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
  12.         self.sockets_list = [self.server_socket]
  13.         self.clients = {}
  14.  
  15.     def run(self):
  16.         try:
  17.             self.server_socket.bind((self.server[0], self.server[1]))
  18.             self.server_socket.listen()
  19.             print(f'Listening for connections on {self.server[0]}:{self.server[1]}...\n\n')
  20.             while True:
  21.                 read_sockets, _, exception_sockets = select(self.sockets_list, [], self.sockets_list)
  22.                 for notified_socket in read_sockets:
  23.                     if notified_socket == self.server_socket:
  24.                         client_socket, client_address = self.server_socket.accept()
  25.                         user = self.receive_message(client_socket)
  26.                         if user is False:
  27.                             continue
  28.                         self.sockets_list.append(client_socket)
  29.                         self.clients[client_socket] = user
  30.                         print(f'Accepted new connection from {client_address[0]}:{client_address[1]}, username: {user["data"].decode("utf-8")}')
  31.                     else:
  32.                         message = self.receive_message(notified_socket)
  33.                         if message is False:
  34.                             print('Closed connection from: {}'.format(self.clients[notified_socket]['data'].decode('utf-8')))
  35.                             self.sockets_list.remove(notified_socket)
  36.                             del self.clients[notified_socket]
  37.                             continue
  38.                         user = self.clients[notified_socket]
  39.                         print(f'Received message from {user["data"].decode("utf-8")}: {message["data"].decode("utf-8")}')
  40.                         for client_socket in self.clients:
  41.                             if client_socket != notified_socket:
  42.                                 client_socket.send(user['header'] + user['data'] + message['header'] + message['data'])
  43.                 for notified_socket in exception_sockets:
  44.                     self.sockets_list.remove(notified_socket)
  45.                     del self.clients[notified_socket]
  46.         except:
  47.             pass
  48.  
  49.     def receive_message(self, client_socket):
  50.         try:
  51.             message_header = client_socket.recv(self.HEADER_LENGTH)
  52.             if not len(message_header):
  53.                 return False
  54.             message_length = int(message_header.decode('utf-8').strip())
  55.             return {'header': message_header, 'data': client_socket.recv(message_length)}
  56.         except:
  57.             return False
  58.  
  59.  
  60. s = Server().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement