server_socket.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import enum
  2. import socket
  3. import select
  4. class SOCKET_OP(enum.Enum):
  5. NEW_CONNECTION = 0
  6. DATA_IN = 1
  7. HANGUP = 2
  8. class Server_Socket:
  9. clients = []
  10. def __init__(self, host, port):
  11. self.host = host
  12. self.port = port
  13. def listen(self):
  14. serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  15. serversock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  16. serversock.bind((self.host, self.port))
  17. serversock.listen(10)
  18. while True:
  19. print('waiting in select')
  20. all_socks = self.clients + [serversock]
  21. readable, writable, exceptional = select.select(all_socks, [], all_socks)
  22. if len(exceptional) >= 1:
  23. print('exceptional! %s' % (exceptional,))
  24. continue
  25. if len(readable) >= 1:
  26. client = readable[0]
  27. if client == serversock:
  28. client = self.addConnection(serversock)
  29. data = None
  30. op = SOCKET_OP.NEW_CONNECTION
  31. else:
  32. data = client.recv(1024)
  33. if len(data) <= 0:
  34. print('client - hangup')
  35. self.clients.remove(client)
  36. op = SOCKET_OP.HANGUP
  37. else:
  38. op = SOCKET_OP.DATA_IN
  39. yield client, data, op
  40. def addConnection(self, serversock):
  41. print('serversock in')
  42. current_connection, client_address = serversock.accept()
  43. self.clients.append(current_connection)
  44. print('%s connected' % (client_address,))
  45. return current_connection
  46. @classmethod
  47. def broadcast(cls, client_list, data):
  48. jsondata = bytes(data, 'utf-8')
  49. for c in client_list:
  50. c.send(jsondata)