Python-ELMO is a Python library which offers an encapsulation of the binary tool ELMO, in order to manipulate it easily in Python and SageMath script.

servicethread.py 2.7KB

4 lat temu
4 lat temu
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import threading
  2. from .protocol import Protocol, ClosureException
  3. import socket
  4. class ServiceThread(threading.Thread):
  5. def run(self):
  6. self.execute()
  7. def execute(self):
  8. # Method where the service runs
  9. pass
  10. class OneShotServiceThread(ServiceThread):
  11. def __init__(self, ip, port, clientsocket):
  12. threading.Thread.__init__(self)
  13. self.ip = ip
  14. self.port = port
  15. self.clientsocket = clientsocket
  16. self.protocol = Protocol(clientsocket)
  17. def run(self):
  18. try:
  19. self.execute()
  20. except ClosureException:
  21. return
  22. def execute(self):
  23. # Method where the service runs
  24. pass
  25. class PermanentServiceThread(ServiceThread):
  26. def __init__(self):
  27. threading.Thread.__init__(self)
  28. self._is_running = True
  29. def is_running(self):
  30. return self._is_running
  31. def stop(self):
  32. self._is_running = False
  33. class ListeningThread(PermanentServiceThread):
  34. def __init__(self, host, port, threadclass, debug=False, **kwargs):
  35. super().__init__()
  36. self.hostname = host
  37. self.port = port
  38. self.threadclass = threadclass
  39. self.kwargs = kwargs
  40. self.debug = debug
  41. def execute(self):
  42. self.tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  43. self.tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  44. self.tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
  45. # self.tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_ATTACH_REUSEPORT_CBPF, 1)
  46. self.tcpsock.bind((self.hostname, self.port))
  47. self.tcpsock.listen(5)
  48. if self.debug:
  49. print('[port][%s] Listening' % self.port)
  50. while self.is_running():
  51. try:
  52. (clientsocket, (ip, port)) = self.tcpsock.accept()
  53. if self.is_running():
  54. if self.debug:
  55. print('[port][{}] Accepted: {} <=> {}'.format(
  56. self.port,
  57. clientsocket.getsockname(),
  58. clientsocket.getpeername(),
  59. ))
  60. newthread = self.threadclass(ip, port, clientsocket, **self.kwargs)
  61. newthread.start()
  62. else:
  63. break
  64. except socket.timeout:
  65. pass
  66. print('[port][%s] Stop listening' % self.port)
  67. def stop(self):
  68. super().stop()
  69. clientsocker = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  70. clientsocker.connect((self.hostname, self.port))
  71. self.tcpsock.close()