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)
94 def __init__(self, alarmQueue, timeout=3):
95 r"""!Create a new instance
96
97 @param alarmQueue: python queue instance
98 @param timeout: server timeout in sec (3)
99 """
100 self._server = None
101 self._server_thread = None
102 self._timeout = timeout
103 self._alarmQueue = alarmQueue
104
105 self._clientsConnectedLock = threading.Lock()
106 self._clientsConnected = {}
107

◆ __del__()

boswatch.network.server.TCPServer.__del__ (   self)
108 def __del__(self):
109 if self.isRunning:
110 self.stop()
111

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

◆ stop()

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

Stops the TCP socket server.

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

◆ countClientsConnected()

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

Number of currently connected Clients.

Returns
Connected clients
162 def countClientsConnected(self):
163 r"""!Number of currently connected Clients
164
165 @return Connected clients"""
166 with self._clientsConnectedLock: # because our list is not threadsafe
167 return len(self._clientsConnected)
168

◆ 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
169 def getClientsConnected(self):
170 r"""!A list of all connected clients
171 with their IP address and last seen timestamp
172 _clients[ThreadName] = {"address", "timestamp"}
173
174 @return List of onnected clients"""
175 # todo return full list or write a print/debug method?
176 with self._clientsConnectedLock: # because our list is not threadsafe
177 return self._clientsConnected
178

◆ isRunning()

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

Property of server running state.

180 def isRunning(self):
181 r"""!Property of server running state"""
182 if self._server:
183 return True
184 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