BOSWatch 3
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
 
Loading...
Searching...
No Matches
boswatch.network.server.TCPServer Class Reference

TCP server class. More...

Public Member Functions

 __init__ (self, alarmQueue, timeout=3)
 Create a new instance.
 
 __del__ (self)
 
 start (self, port=8080)
 Start a threaded TCP socket server.
 
 stop (self)
 Stops the TCP socket server.
 
 countClientsConnected (self)
 Number of currently connected Clients.
 
 getClientsConnected (self)
 A list of all connected clients with their IP address and last seen timestamp _clients[ThreadName] = {"address", "timestamp"}.
 
 isRunning (self)
 Property of server running state.
 

Protected Attributes

 _server
 
 _server_thread
 
 _timeout
 
 _alarmQueue
 
 _clientsConnectedLock
 
 _clientsConnected
 

Detailed Description

TCP server class.

Constructor & Destructor Documentation

◆ __init__()

boswatch.network.server.TCPServer.__init__ (   self,
  alarmQueue,
  timeout = 3 
)

Create a new instance.

Parameters
alarmQueuepython queue instance
timeoutserver timeout in sec (3)
89 def __init__(self, alarmQueue, timeout=3):
90 r"""!Create a new instance
91
92 @param alarmQueue: python queue instance
93 @param timeout: server timeout in sec (3)
94 """
95 self._server = None
96 self._server_thread = None
97 self._timeout = timeout
98 self._alarmQueue = alarmQueue
99
100 self._clientsConnectedLock = threading.Lock()
101 self._clientsConnected = {}
102

◆ __del__()

boswatch.network.server.TCPServer.__del__ (   self)
103 def __del__(self):
104 if self.isRunning:
105 self.stop()
106

Member Function Documentation

◆ start()

boswatch.network.server.TCPServer.start (   self,
  port = 8080 
)

Start a threaded TCP socket server.

Start a TCP Socket Server in a new thread that will then start one more thread for each client request. The ip address for binding the server socket is always 'localhost'

Parameters
portServer Port (8080)
Returns
True or False
107 def start(self, port=8080):
108 r"""!Start a threaded TCP socket server
109
110 Start a TCP Socket Server in a new thread that will
111 then start one more thread for each client request.
112 The ip address for binding the server socket is always 'localhost'
113
114 @param port: Server Port (8080)
115
116 @return True or False"""
117 if not self.isRunning:
118 try:
119 socketserver.TCPServer.allow_reuse_address = True # because we can start two instances on same port elsewhere
120 self._server = _ThreadedTCPServer(("", port), _ThreadedTCPRequestHandler)
121 self._server.timeout = self._timeout
122 self._server.alarmQueue = self._alarmQueue
123 self._server.isActive = True
124
125 self._server.clientsConnectedLock = self._clientsConnectedLock
126 self._server.clientsConnected = self._clientsConnected
127
128 self._server_thread = threading.Thread(target=self._server.serve_forever)
129 self._server_thread.name = "Thread-BWServer"
130 self._server_thread.daemon = True
131 self._server_thread.start()
132 logging.debug("TCPServer started in Thread: %s", self._server_thread.name)
133 return True
134 except socket.error as e:
135 logging.error(e)
136 return False
137 else:
138 logging.warning("server always started")
139 return True
140

◆ stop()

boswatch.network.server.TCPServer.stop (   self)

Stops the TCP socket server.

Returns
True or False
141 def stop(self):
142 r"""!Stops the TCP socket server
143
144 @return True or False"""
145 if self.isRunning:
146 self._server.shutdown()
147 self._server.isActive = False
148 self._server.server_close()
149 self._server_thread.join()
150 self._server_thread = None
151 self._server = None
152 logging.debug("TCPServer stopped")
153 return True
154 logging.warning("server always stopped")
155 return True
156

◆ countClientsConnected()

boswatch.network.server.TCPServer.countClientsConnected (   self)

Number of currently connected Clients.

Returns
Connected clients
157 def countClientsConnected(self):
158 r"""!Number of currently connected Clients
159
160 @return Connected clients"""
161 with self._clientsConnectedLock: # because our list is not threadsafe
162 return len(self._clientsConnected)
163

◆ getClientsConnected()

boswatch.network.server.TCPServer.getClientsConnected (   self)

A list of all connected clients with their IP address and last seen timestamp _clients[ThreadName] = {"address", "timestamp"}.

Returns
List of onnected clients
164 def getClientsConnected(self):
165 r"""!A list of all connected clients
166 with their IP address and last seen timestamp
167 _clients[ThreadName] = {"address", "timestamp"}
168
169 @return List of onnected clients"""
170 # todo return full list or write a print/debug method?
171 with self._clientsConnectedLock: # because our list is not threadsafe
172 return self._clientsConnected
173

◆ isRunning()

boswatch.network.server.TCPServer.isRunning (   self)

Property of server running state.

175 def isRunning(self):
176 r"""!Property of server running state"""
177 if self._server:
178 return True
179 return False

Field Documentation

◆ _server

boswatch.network.server.TCPServer._server
protected

◆ _server_thread

boswatch.network.server.TCPServer._server_thread
protected

◆ _timeout

boswatch.network.server.TCPServer._timeout
protected

◆ _alarmQueue

boswatch.network.server.TCPServer._alarmQueue
protected

◆ _clientsConnectedLock

boswatch.network.server.TCPServer._clientsConnectedLock
protected

◆ _clientsConnected

boswatch.network.server.TCPServer._clientsConnected
protected