From b6f72ecdfea35a93c863e17087668ef738dbd911 Mon Sep 17 00:00:00 2001 From: "Bhakti Ghadge (ghadgeb)" Date: Mon, 13 Mar 2023 23:31:22 +0800 Subject: [PATCH] Add files via upload --- README.md | 11 +++ client.py | 110 ++++++++++++++++++++++++ home.cpython-37.pyc | Bin 0 -> 4227 bytes home.py | 158 +++++++++++++++++++++++++++++++++++ main.py | 166 +++++++++++++++++++++++++++++++++++++ serversetup.cpython-37.pyc | Bin 0 -> 1513 bytes serversetup.py | 62 ++++++++++++++ 7 files changed, 507 insertions(+) create mode 100644 README.md create mode 100644 client.py create mode 100644 home.cpython-37.pyc create mode 100644 home.py create mode 100644 main.py create mode 100644 serversetup.cpython-37.pyc create mode 100644 serversetup.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..cf693e1 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Python Network Communication +Python Implementation of Network Communication + +The tools is written using Python3 + + +## Requirements +- Kivy +- kivymd +- psutil + diff --git a/client.py b/client.py new file mode 100644 index 0000000..e33b088 --- /dev/null +++ b/client.py @@ -0,0 +1,110 @@ +# imports + +import socket +from threading import Thread +import struct, psutil + +import subprocess + + + +# The Kivy Design for user interface +# The Client Class +class Client: + def __init__(self,host,port): + ''' + host -> String Server Address + port -> integer Server Port + ''' + self.socket = socket.socket() + self.host = host + self.port = port + self.connect() + def getSysInfo(self): + Id = subprocess.check_output(['systeminfo']).decode('utf-8').split('\n') + new = [] + # arrange the string into clear info + for item in Id: + new.append(str(item.split("\r")[:-1])) + result = '' + for i in new: + result += (i[2:-2] + '\n ') + return result + + def connect(self): + ''' + Connect the Client to the Server + ''' + print('connecting to server') + try: + self.socket.connect((self.host,int(self.port))) + print('Client Connected') + print('waiting for commands from the controller') + #Thread(target=self.getCommand).start() + self.getCommand() + except Exception as e: + print('Error Connnecting to Server', e) + def recvall(self,sock, size): + msg = b"" + while len(msg) < size: + + packet = sock.recv(size - len(msg)) + if not packet: + return None + msg += packet + + return msg + def getUsers(self): + users = [] + user_list = psutil.users() + for user in user_list: + users.append(user.name) + return ' '+str(users) + def getCommand(self): + + while True: + try: + size = struct.unpack("I", self.recvall(self.socket, struct.calcsize("I")))[0] + data = self.recvall(self.socket, size) + if data.decode(): + print(f'Command Received: {data.decode()}') + if data.decode() == 'Info': + msg = self.getSysInfo().encode() + size = len(msg) + self.socket.sendall(struct.pack("I", size)) + self.socket.sendall(msg) + print('Respond Sent') + if data.decode() == 'Close': + msg = ' Shuttingdown Device'.encode() + size = len(msg) + self.socket.sendall(struct.pack("I", size)) + self.socket.sendall(msg) + self.socket.close() + print('Respond Sent') + break + if data.decode() == 'Users': + msg = self.getUsers().encode() + size = len(msg) + self.socket.sendall(struct.pack("I", size)) + self.socket.sendall(msg) + print('Respond Sent') + + + + + except: + import traceback + trace = traceback.format_exc() + print(trace) + break + + + + + +if __name__ == '__main__': + host = input('Host: ') + port = input('Port: ') + c = Client(host,port) + + diff --git a/home.cpython-37.pyc b/home.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fe613af47a68719d0743dae6f72d1599aa97a00 GIT binary patch literal 4227 zcmdTH$!^<5loYj*mThHeinbRbC@QNE1lw@hfJg(^Hjo6c+#v3P3I+(8Gm&VK9Ck=K zRu=T&TmrN}Pel$rB*%V1|Ap6{`U^evy%}n=C8G%nv?avR%-h%D%+}(fp}_Ooi#%y8 zDa!A-7(RKJY{DD=0s~Qq>MMcTR#lwm{9K^5H8I!xd{Af?f?~TU)_K1al-p%7FZg<3 zv<+3E>Z=7(d=1=p6jCDP=L#v)@~PIYz*;8;tPQHcdXX-Xg}1y&uzmtdBXGPh>2m52$5>DlRk2mx&tiB{HE>i~!&$DIPSc6OaZ>Z24rp(lxD z*3A2Zq{~8ck0y^8@0r^y48a8uZthcl?71{X+4@5kCU%?*e6Z^7h5&)hQQ{p_yGy-J zH?h9teQF|Y*YUj$80UhWlq2ng*FyO$R^*Jm#~=OaKb%~11z#t{qSEF$_j`OO=R;cuP}J`yojghm5=w$5GFkqLM!bv|-WYXT5xk|o=6 zLZ?Hy2qhR1gdL7nNTdw#R2>5DY$h+LM?pOvya6%GWnb?2Gx^Fzvp~=v) z$trKIOPi)z9KD<*8nyy}vtEO4xCz~mc{kY+BZv08{e-Ybp}FnjhB0(VKU4WJ4N2zp zN^RR`F|A!J_YO_WuVUHPXy}CkkuU~lcAa|NLge!gTy z=?lGYTC(R-aY2PnmG?!((%QM_vhYlzJOEiW0{c*s?Oza;h{a+Hw4T&B?yEIx?O7JT z$xx$zO^l%VnOV!Cb>34wAogJ=+y91}Q=@q^69{2rzW=pHA7O2pGoFcFnSm7`=q)s6 zjsPT?6To=_<+lbt1^6jj+rR|RBMlth>qp|#a{-m;lk+7q-i(3w&9}DyN1cF^|Cut8 zU%7d?{MV}li$KRxz|AA^)GQNP+8nM2V*PBy0vo*pC%I#J!hw~W zd6R)xIAclUV~2NQ=?fYmxJONo5PZZ=jpU+~MjGZik34T+@kk)@;bRysp0kHf4knxM z#_z*Gm9|Qhc8+R9JyqLzS~ykOMUsQlxt1E^oTbWMy_A-18;>xyof@_sFw*yNUa{@( z`i?I#yZ}j!x1Y(@iK296i-#we+*mQ?|n@XUh+Uxk5d{lvxyKb$-OLbgWdgs9vNh=b%mRJ|0Q@QrXACHUo(DAkX+r

P3#%NDg-;g;#JW;qVR)@8U3)CuZmszXZb%@MbxwXaa(zf!8nFhKpFCwF3vh zsWhSco5(d?bWm)0qGGDr1)@Qa^Jxh!M0OR(@xgz5MShAfNtDwpAF9w@S7ivs){5{K z4)Id?5*TFg)yIpO=%&ETa9~sDBaL$YXy6`iKl~q|(IYRd8S5m#_9S@qm14n;! zIK3v;eea|hi(4(6hVhEPvE0&SfsEw!)`N7SIN3f|5fzXoa>9n`iyJOS-%~?yxjrG52d4_P&@r_mSbu8mh9=<7;cfNids>t@K)6P P_lj0jt6H^OMp*eTAA|=# literal 0 HcmV?d00001 diff --git a/home.py b/home.py new file mode 100644 index 0000000..df415ee --- /dev/null +++ b/home.py @@ -0,0 +1,158 @@ +from kivy.lang import Builder +from kivy.uix.screenmanager import Screen +from kivy.properties import ObjectProperty,StringProperty +from kivymd.uix.boxlayout import MDBoxLayout +from kivy.clock import mainthread +Builder.load_string(''' +: + name:'home' + BoxLayout: + orientation:'vertical' + padding:dp(20) + spacing:dp(20) + MDLabel: + text: ' Python Network Connection Services' + font_style:'H4' + adaptive_height:True + halign:'center' + MDBoxLayout: + adaptive_height:True + size_hint_y:None + height:dp(60) + Button: + text:'Home' + id:home + background_color:0,0,1,1 + on_release:app.go('home',self) + Button: + text:'Responses' + background_color:.5,.5,.5,.5 + on_release:app.go('responses',self) + id:res + Button: + text:'Logs' + background_color:.5,.5,.5,.5 + on_release:app.go('logs',self) + id:log + ScreenManager: + id:mngr + Screen: + name:'home' + MDBoxLayout: + orientation:'vertical' + MDLabel: + text:'Devices' + adaptive_height:True + halign:'center' + font_style:'H5' + GridLayout: + cols:4 + id:grid + MDLabel: + text:'Apply Commands:' + adaptive_height:True + halign:'center' + font_style:'H5' + Widget: + size_hint_y:.2 + BoxLayout: + size_hint_y:None + height:dp(80) + + Button: + text:'Shutdown Client' + on_release:app.sendCommand('Close') + + Button: + text:'Get User' + on_release:app.sendCommand('Users') + Button: + text:'Get Client Device Info' + on_release:app.sendCommand('Info') + Screen: + name:'logs' + MDBoxLayout: + orientation:'vertical' + MDBoxLayout: + adaptive_height:True + Label: + adaptive_height:True + MDIconButton: + icon:'delete' + pos_hint:{'right':1} + on_release:logs.text = '' + MDBoxLayout: + md_bg_color:.5,.5,.5,.8 + ScrollView: + MDLabel: + id:logs + adaptive_height:True + font_size:dp(14) + markup:True + + + Screen: + name:'responses' + MDBoxLayout: + orientation:'vertical' + MDBoxLayout: + adaptive_height:True + Label: + adaptive_height:True + MDIconButton: + icon:'delete' + pos_hint:{'right':1} + on_release:res.text = '' + MDBoxLayout: + md_bg_color:.5,.5,.5,.8 + ScrollView: + MDLabel: + id:res + adaptive_height:True + font_size:dp(14) + markup:True + + + + + + +: + spacing:dp(10) + adaptive_height:True + MDCheckbox: + size_hint: None, None + size: "48dp", "48dp" + pos_hint: {'center_x': .5, 'center_y': .5} + on_active:app.on_checkbox_active(root,*args) + + MDLabel: + text:root.text + adaptive_height:True + pos_hint: {'center_x': .5, 'center_y': .5} + + + +''') +class MyCheckbox(MDBoxLayout): + text = StringProperty('') + socket = ObjectProperty() +class Home(Screen): + @mainthread + def addLogs(self,txt): + self.ids.logs.text += txt + @mainthread + def addRes(self,txt): + self.ids.res.text += txt + +if __name__ == '__main__': + from kivymd.app import MDApp + class HomeApp(MDApp): + active = ObjectProperty() + def build(self): + return Home() + + + + + HomeApp().run() diff --git a/main.py b/main.py new file mode 100644 index 0000000..29046ea --- /dev/null +++ b/main.py @@ -0,0 +1,166 @@ +from kivymd.app import MDApp +from kivy.properties import ObjectProperty,ListProperty,StringProperty +from kivy.uix.screenmanager import ScreenManager +from kivy.core.window import Window +from kivy.clock import Clock, mainthread +from kivymd.uix.boxlayout import MDBoxLayout + +from serversetup import Setup +from home import Home, MyCheckbox + +import socket,struct +from threading import Thread + + + +class NetworkApp(MDApp): + active = ObjectProperty() + server = None + clients = ListProperty() + selected = ListProperty() + def build(self): + self.root = ScreenManager() + return self.root + def on_start(self): + self.setup = Setup() + self.home = Home() + self.root.add_widget(self.setup) + self.root.add_widget(self.home) + self.active = self.home.ids.home + Clock.schedule_interval(self.testConnection,0) + + def testConnection(self,dt): + disconnected = [] + if self.clients: + for d in self.clients: + try: + d.sendall(b'') + except: + disconnected.append(d) + for d in disconnected: + self.clients.remove(d) + + + def acceptClients(self): + while self.server: + try: + client, add = self.server.accept() + self.clients.append(client) + Thread(target=self.getResponse,args=(client,)).start() + except Exception as e : + print(e) + break + + def getResponse(self,client): + while True: + try: + size = struct.unpack("I", self.recvall(client, struct.calcsize("I")))[0] + data = self.recvall(client, size) + if data: + self.home.addRes(f'Device {self.clients.index(client)+1} : {data.decode()}\n') + + + except: + import traceback + if client in self.clients: + self.clients.remove(client) + break + + + + def sendCommand(self,command): + + + if not self.clients: + self.home.addLogs('>> No Client Found\n') + return + if not self.selected: + self.home.addLogs('>> Please Select Any Client\n') + return + for r in self.selected: + msg = command.encode() + size = len(msg) + r.sendall(struct.pack("I", size)) + r.sendall(msg) + self.home.addLogs( f'>> To Device {self.clients.index(r)+1} "{command}" sent\n') + + @mainthread + def on_clients(self,*args): + + self.home.ids.grid.clear_widgets() + for i,client in enumerate(self.clients): + c = MyCheckbox(text=f'Device {i+1}',socket = self.clients[i]) + self.home.ids.grid.add_widget(c) + + def on_stop(self): + # stop the server after exiting the application + if self.server: + self.server.close() + self.server = None + @mainthread + def on_checkbox_active(self,client, checkbox, value): + ''' + Selecting and desecting devices + ''' + if value: + self.selected.append(client.socket) + else: + self.selected.remove(client.socket) + + + def recvall(self,sock, size): + msg = b"" + while len(msg) < size: + + packet = sock.recv(size - len(msg)) + if not packet: + return None + msg += packet + + return msg + def shutdown(self): + self.server.close() + self.root.current = 'setup' + self.server = None + + + def setupServer(self): + host = self.setup.ids.host.text + port = self.setup.ids.port.text + if not host or not port: + self.setup.ids.error.text = 'Incomplete Data' + return + if not port.isnumeric(): + self.setup.ids.error.text = 'Invalid Port' + return + try: + self.server = socket.socket() + self.server.bind((host,int(port))) + self.server.listen(10) + self.root.current = 'home' + self.home.addLogs(f'>> Server Created ({host}:{port})\n') + Thread(target = self.acceptClients).start() + except Exception as e: + self.setup.ids.error.text = str(e) + + + + + + + def exit(self): + if self.server: + self.server.close() + Window.close() + + def go(self,name,wdt): + if self.active: + self.active.background_color = [.5,.5,.5,.5] + self.active = wdt + self.active.background_color = [0,0,1,1] + self.home.ids.mngr.current = name + + + +if __name__ == '__main__': + NetworkApp().run() diff --git a/serversetup.cpython-37.pyc b/serversetup.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c5bd6bfb388c58f5cdecdfdfcde078555dcc2be GIT binary patch literal 1513 zcmbVMPjAym6rYKm)Z+xy1LE9Uh_q`JL?vVp>NZ{AKqI7pRvT6FPBV|hs_pTP$5jGa zaVQ@Ij(jCw_q1PN4}048#?2O55YjrDmznqH_j~WnpMx7WLWbYp?|e1&8T*qKn-AA) zA4jE7D5iMEaz5jn=AEpQdozzS;2(VDeMIe3rhL_X&r}z@b8ps#p6Z=;%x~zum2Kt0 zEO0)766hl!Kpz3(oP7vCGQ>IaJb{e7g@u)k zcZNGtFzCE9)2_PgcV? z+WP}-M~Bz2OKq-Vzd+Uh!TzjYOUS`xn#^^kO*|aemDRaJr2;P0cYoN$-(AWY%LHSz zq50SPM*45J4Xt17uefZ>I-ckPTzI<+s=TweJ0iv9W{ZQ`T09G+ZFhV4^D1q-AWr1` zbYXN|sOxD9T_grFkQKzTEF-|EJKqN%8;}+*&XeoPbrx*Qra4zx+?j3<<5jXvO<@?$ z>85Nxj+1>H)c^&s8CPu9Q51_bKKUip#`R=RKQw%EJQuCU6B%B$Y`Y{nHrZsCp}Y z$@~hk*O$c@fo@Irgr1d$6h_R9zqz>qkDO^T@=X^FhEUBGiJK(;Yf3vKFhjkLact_P z^<>m<#A$lAjxt#+43RXq-MUU!QRQB;To!VH*8$%%*7P$i6}~JcMR)3;qi;fr$yJ1> o&h$x3;EiYM;%lii!J~FNA5&MVZ4?7O==i%mzU>8kz_0pSUN#{d8T literal 0 HcmV?d00001 diff --git a/serversetup.py b/serversetup.py new file mode 100644 index 0000000..41bf819 --- /dev/null +++ b/serversetup.py @@ -0,0 +1,62 @@ +from kivy.lang import Builder +from kivy.uix.screenmanager import Screen + +Builder.load_string(''' +: + name:'setup' + BoxLayout: + orientation:'vertical' + Widget: + MDLabel: + text: ' Server Connection Setup' + font_style:'H4' + adaptive_height:True + halign:'center' + Widget: + MDTextField: + id:host + hint_text:'Host' + size_hint_x:.8 + pos_hint:{'center_x':.5} + MDTextField: + id:port + hint_text:'Port' + size_hint_x:.8 + pos_hint:{'center_x':.5} + MDLabel: + theme_text_color:'Custom' + text_color:1,0,0,1 + id:error + adaptive_height:True + halign:'center' + Widget: + + BoxLayout: + size_hint_y:None + height:dp(50) + Widget: + Button: + text:'Exit' + background_color:1,0,0,1 + on_release:app.exit() + Widget: + Button: + text:'Create Server' + background_color:0,1,0,1 + on_release:app.setupServer() + Widget: + Widget: + + + +''') +class Setup(Screen): + pass + +if __name__ == '__main__': + from kivymd.app import MDApp + class SetupApp(MDApp): + def build(self): + return Setup() + + SetupApp().run()