-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathserver.py
More file actions
168 lines (140 loc) · 5.97 KB
/
server.py
File metadata and controls
168 lines (140 loc) · 5.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import threading
import configparser
import argparse
import ipaddress
import socket
from typing import Final
# config parser
# read config file and initial config variables
config = configparser.ConfigParser()
try :
config.read('config.ini')
except :
raise FileExistsError("config.ini file is not exists.")
class Server():
""" Server Class use for receive report and data from cameras """
# default value for listen socket backLog
backlogListenVal : Final[int] = config['Server']["backlogListenVal"]
def __init__(self, serverIP : str = config['Server']['server IP'], \
portNumber : int = int(config['Server']['port']), \
DEBUG : bool = False):
""" initial class variables """
global _debug , _stream
self.serverIP = serverIP
self.portNumber = portNumber
self.__socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.__clientPool = []
_debug = DEBUG
if _debug :
print("\n++[Server object]++\n")
print(f"[Server IP : {self.__serverIP}]")
print(f"[Server Port Number : {self.__portNumber}]")
def __startConnection(self):
""" start connection socket """
try:
self.__socket.bind((self.__serverIP, self.__portNumber))
self.__socket.listen(int(self.backlogListenVal))
except :
raise ConnectionError(f"can't bind server listener, {self.__serverIP}:{self.__portNumber}")
if _debug :
print(f"\n**[Server connection started]**")
print("[Server socket bound to %s]" %(self.__portNumber))
print("{Server socket is listening ....}")
def __closeConnection(self):
""" socket close connection """
self.__socket.close()
if _debug :
print(f"\n**[Server connection closed]**\n")
def __shutDownConnection(self):
""" socket shutdown mode (only receive) """
self.__socket.shutdown()
if _debug :
print(f"\n**[Server connection shutdown]**\n")
# def stream(self, client):
""" receive video from camera """
# pass
def receiveReport(self, client):
""" receive counting objects """
if _debug :
print(f"Server : ^^ [receiver turn on] ^^ ")
while True :
msg = client.recv(1024).decode()
if len(msg) > 0 :
print(f" Server : [ <Camera> | {threading.currentThread().name} {msg}]")
else :
print(f" Server : [ <Camera> | {threading.currentThread().name} connection dead]")
break
def __getNewClient(self):
""" Threading Function """
""" receive and accept new clients """
if _debug :
print(f" Server : <client connector enable>")
while True :
client, address = self.__socket.accept()
cameraName = client.recv(1024).decode()
print(f' Server : <camera name : {cameraName} join to Server>')
print(f" Server : [Got connection from {address}]")
thReport = threading.Thread(target = self.receiveReport, args = (client,), name = cameraName)
self.__clientPool.append(((client, address),thReport))
thReport.start()
def run(self):
""" run server """
if _debug :
print("[Server app start to run]")
self.__startConnection()
getClient = threading.Thread(target = self.__getNewClient())
getClient.start()
# check Threads
while True :
(client, _), thread = self.__clientPool[0]
if not thread.is_alive() :
print(f" Server : >> {thread.getName()} is disconnect <<")
self.__clientPool[:] = self.__clientPool[1:]
#self.__shutDownConnection()
#self.__closeConnection()
@property
def serverIP(self):
""" return server IP """
return self.__serverIP
@serverIP.setter
def serverIP(self, serverIP : str):
""" set server IP """
try:
ipaddress.ip_address(serverIP)
self.__serverIP = serverIP
except:
raise ValueError("ip Address invalid, valid Types : [IPv4,IPv6]")
@property
def portNumber(self):
""" return server Port Number """
return self.__portNumber
@portNumber.setter
def portNumber(self, portNumber : int):
""" set server Port Number """
if not isinstance(portNumber, int):
raise ValueError("port number only integer valid")
if not 1 <= portNumber <= 65535 :
raise ValueError("port number invalid")
self.__portNumber = portNumber
if __name__ == "__main__":
""" this class, you can use this \
with import and create object \
or CLI run Server"""
print("[Server Running : CLI Mode]\n")
# argument parser
argparser = argparse.ArgumentParser(
description = "Server runner Script | run script for receive Camera Packets",\
prog = 'Server')
argparser.add_argument('host', metavar = 'host', type = str, nargs = 1, help = "Server Address for listening clients")
argparser.add_argument('port', metavar = 'port', type = int, nargs = 1, help = "port number")
argparser.add_argument('--test', action = "store_true", help = "flag for Enable defaults parameters run :: \n "+config['Server']['server IP']+" "+config['Server']['port'])
argparser.add_argument('--debug', action = "store_true", help = "flag for Enable Debug mode [show CLI logs]")
args = argparser.parse_args()
if args.test :
server = Server(DEBUG = True)
else :
if args.debug :
server = Server(str(args.host[0]),int(args.port[0]),True)
else :
server = Server(str(args.host[0]),int(args.port[0]))
server.run()