#學(xué)習(xí)網(wǎng)絡(luò)編程可以開(kāi)發(fā)一個(gè)cs架構(gòu)的軟件#學(xué)習(xí)并發(fā)、數(shù)據(jù)庫(kù)、前端、django可以開(kāi)發(fā)bs架構(gòu)的軟件#軟件開(kāi)發(fā)架構(gòu)C/S架構(gòu)(client/server) C:客戶(hù)端,APP S:服務(wù)端,架構(gòu) B/S架構(gòu)(browser/server) B:瀏覽器,taobao.com/jd.com S:服務(wù)端 bs架構(gòu)實(shí)際上也是cs架構(gòu) 統(tǒng)一接口:比如微信、支付寶 #服務(wù)端 24小時(shí)不間斷提供服務(wù) #客戶(hù)端 什么時(shí)候想體驗(yàn)服務(wù),什么時(shí)候去找心儀的服務(wù)端尋求服務(wù) #網(wǎng)絡(luò)編程發(fā)展史任何先進(jìn)的技術(shù)基本上都是來(lái)源于軍事 #回到過(guò)去 1.早期的電話電話線 2.大屁股電腦網(wǎng)線 3.筆記本電腦,無(wú)線電話 網(wǎng)卡 #要想實(shí)現(xiàn)遠(yuǎn)程通信,第一個(gè)需要具備的條件是:物理連接介質(zhì)人想要實(shí)現(xiàn)交流必須統(tǒng)一語(yǔ)言 >>> 英文 計(jì)算機(jī)想要與計(jì)算機(jī)遠(yuǎn)程通信,除了有物理連接介質(zhì)之外,還需要有一套公共的標(biāo)準(zhǔn)和協(xié)議 #OSI協(xié)議 OSI七層協(xié)議 應(yīng)用層 HTTP協(xié)議:超文本傳輸協(xié)議 HTTPS協(xié)議 FTP協(xié)議 表示層 會(huì)話層 傳輸層 TCP協(xié)議/UDP協(xié)議,都是基于端口工作的協(xié)議 TCP:流式協(xié)議、可靠協(xié)議(反饋機(jī)制),慢,打電話 基于TCP協(xié)議通信,必須先建立雙向通道:TCP協(xié)議的三次握手、四次揮手 三次握手: 洪水攻擊,一臺(tái)服務(wù)器在短時(shí)間內(nèi)接收到了大量的請(qǐng)求 四次揮手: time_wait UDP:數(shù)據(jù)報(bào)協(xié)議,不可靠的協(xié)議,快,發(fā)短信,QQ 無(wú)序建立雙向通道,數(shù)據(jù)的傳輸不安全 端口:用來(lái)唯一標(biāo)識(shí)計(jì)算機(jī)上的某個(gè)應(yīng)用程序(0~65535),統(tǒng)常0~1024這些都是操作系統(tǒng)默認(rèn)使用的端口號(hào),建議手動(dòng)指定8000以后的端口號(hào)(訪問(wèn)端口,輸出端口) mysql3306 redis6379 djando8000 flask5000 tomcat8080 IP 端口:唯一標(biāo)識(shí)接入互聯(lián)網(wǎng)的一臺(tái)計(jì)算機(jī)上的某個(gè)應(yīng)用程序 域名解析:URL DNS 網(wǎng)絡(luò)層 IP協(xié)議,規(guī)定了只要是接入互聯(lián)網(wǎng)的計(jì)算機(jī)都必須有一個(gè)IP地址(公網(wǎng)、私網(wǎng)) IP地址的特點(diǎn):點(diǎn)分十進(jìn)制(0.0.0.0 255.255.255.255) IP地址目前有兩個(gè)版本:IPV4、IPV6 路由器:實(shí)現(xiàn)局域網(wǎng)與局域網(wǎng)之間的互連 交換機(jī):功能強(qiáng)大的路由器,讓連接了交換機(jī)的計(jì)算機(jī),實(shí)現(xiàn)彼此之間的互連 局域網(wǎng):是構(gòu)成互聯(lián)網(wǎng)的基本單位 數(shù)據(jù)鏈路層 1.規(guī)定電信號(hào)的分組方式 2.規(guī)定了任何一臺(tái)接入互聯(lián)網(wǎng)的計(jì)算機(jī),都必須有一塊網(wǎng)卡,該網(wǎng)卡上有世界上獨(dú)一無(wú)二的編號(hào)(mac地址),該編號(hào)由12位16進(jìn)制數(shù)組成(前六位是廠商編號(hào),后六位是流水線編號(hào)) #1、2統(tǒng)稱(chēng)為以太網(wǎng)協(xié)議(通信基本靠吼)(局域網(wǎng)內(nèi)使用) 1.廣播風(fēng)暴(廣播、單播) #ARP協(xié)議:根據(jù)ip地址,獲取Mac地址,本地緩存 物理連接層 基于電信號(hào),傳輸0100010001這樣的二進(jìn)制數(shù)據(jù) OSI五層協(xié)議 應(yīng)用層 傳輸層 網(wǎng)絡(luò)層 數(shù)據(jù)鏈路層 物理連接層 #應(yīng)用程序所需要的的數(shù)據(jù),都是跟程序所在的那臺(tái)計(jì)算機(jī)的內(nèi)存去要#TCP協(xié)議之所以可靠的原因在于反饋機(jī)制反饋機(jī)制:計(jì)算機(jī)每次發(fā)數(shù)據(jù)的時(shí)候,必須等到對(duì)方的才會(huì)將內(nèi)存中的數(shù)據(jù)清除,否則會(huì)在一定的時(shí)間內(nèi),每隔一段時(shí)間發(fā)送一次
#serverimport socketserver = socket.socket() #不傳參數(shù),默認(rèn)使用的就是TCP協(xié)議,買(mǎi)手機(jī)server.bind(('127.0.0.1',8080)) #bind內(nèi)為元組,127.0.0.1,為本地回環(huán)地址,插電話卡server.listen(5) #半連接池,開(kāi)機(jī)conn,addr = server.accept() #接聽(tīng)電話,一直等待(阻塞)data = conn.recv(1024) #聽(tīng)別人說(shuō)話,接收1024個(gè)字節(jié),阻塞print(data)conn.send(b'hello baby') #給別人回話conn.close() #掛電話server.close() #關(guān)機(jī)#clientimport socketclient = socket.socket() #拿電話client.connect(('127.0.0.1',8080)) #撥號(hào),寫(xiě)對(duì)方的ip和端口client.send(b'hello world') #對(duì)別人說(shuō)話data = client.recv(1024) #聽(tīng)別人說(shuō)話,阻塞print(data)client.close() #掛電話#send()與recv()不要出現(xiàn)兩邊相同的情況#recv()是跟內(nèi)存要數(shù)據(jù),至于數(shù)據(jù)的來(lái)源,recv不管
#serverimport socketserver = socket.socket() #生成一個(gè)對(duì)象server.bind(('127.0.0.1',8080)) #綁定ip和端口server.listen(5) #半連接池conn,addr = server.accept() #阻塞while True: data = conn.recv(1024) #聽(tīng)別人說(shuō)話,接收1024個(gè)字節(jié) print(data) conn.send(data.upper()) #給別人回話# conn.close() #掛電話# server.close() #關(guān)機(jī)#clientimport socketclient = socket.socket() #生成一個(gè)對(duì)象client.connect(('127.0.0.1',8080))while True: msg = input('請(qǐng)輸入要發(fā)送的內(nèi)容>>>: ').encode('utf-8') client.send(msg) #對(duì)別人說(shuō)話 data = client.recv(1024) #聽(tīng)別人說(shuō)話 print(data)# client.close()
#serverimport socketserver = socket.socket() #生成一個(gè)對(duì)象server.bind(('127.0.0.1',8080)) #綁定ip和端口server.listen(5) #半連接池conn,addr = server.accept() #阻塞,addr就是客戶(hù)端的地址while True: try: data = conn.recv(1024) #conn()類(lèi)似于雙向通道 print(data) #Mac和linux客戶(hù)端異常退出之后,服務(wù)端不會(huì)報(bào)錯(cuò),會(huì)一致接收b'' if len(data) == 0:break conn.send(data.upper()) #給別人回話 except ConnectionResetError as e: print(e) breakconn.close() #掛電話server.close() #關(guān)機(jī)#clientimport socketclient = socket.socket() #生成一個(gè)對(duì)象client.connect(('127.0.0.1',8080))while True: msg = input('請(qǐng)輸入要發(fā)送的內(nèi)容>>>: ').encode('utf-8') if len(msg) == 0:continue #解決客戶(hù)端輸入空,resc()同時(shí)出現(xiàn)的情況 client.send(msg) #對(duì)別人說(shuō)話 data = client.recv(1024) #聽(tīng)別人說(shuō)話 print(data)# client.close()
#服務(wù)端固定的ip和端口 24小時(shí)不間斷提供服務(wù) #serverimport socketserver = socket.socket() #生成一個(gè)對(duì)象server.bind(('127.0.0.1',8080)) #綁定ip和端口server.listen(5) #半連接池,允許最大的等待數(shù)(連接數(shù)為6)while True: conn,addr = server.accept() #阻塞,addr就是客戶(hù)端的地址 while True: try: data = conn.recv(1024) #conn()類(lèi)似于雙向通道 print(data) #Mac和linux客戶(hù)端異常退出之后,服務(wù)端不會(huì)報(bào)錯(cuò),會(huì)一致接收b'' if len(data) == 0:break conn.send(data.upper()) #給別人回話 except ConnectionResetError as e: print(e) break conn.close() #掛電話# server.close() #關(guān)機(jī)#clientimport socketclient = socket.socket() #生成一個(gè)對(duì)象client.connect(('127.0.0.1',8080))while True: msg = input('請(qǐng)輸入要發(fā)送的內(nèi)容>>>: ').encode('utf-8') if len(msg) == 0:continue #解決客戶(hù)端輸入空,resc()同時(shí)出現(xiàn)的情況 client.send(msg) #對(duì)別人說(shuō)話 data = client.recv(1024) #聽(tīng)別人說(shuō)話 print(data)# client.close()
#subprocess模塊import subprocesswhile True: cmd = input('請(qǐng)輸入您的命令>>>: ') obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) print(obj.stdout.read().decode('gbk')) #正確命令返回結(jié)果,windows默認(rèn)使用gbk編碼 print(obj.stderr.read().decode('gbk')) #錯(cuò)誤命令返回結(jié)果
#TCP協(xié)議的特點(diǎn)會(huì)將數(shù)據(jù)量比較小的,并且時(shí)間間隔比較短的數(shù)據(jù)一次性打包發(fā)給對(duì)方#serverimport socketserver = socket.socket()server.bind(('127.0.0.1',8080))server.listen(5)conn,addr = server.accept()data = conn.recv(5)print(data)data = conn.recv(5)print(data)data = conn.recv(4)print(data)conn.send(b'hello baby')conn.close()server.close()#clientimport socketclient = socket.socket()client.connect(('127.0.0.1',8080))client.send(b'hello')client.send(b'world')client.send(b'baby')data = client.recv(8)print(data)client.close() #少的數(shù)據(jù)量將會(huì)一次打包發(fā)送給服務(wù)端,節(jié)省資源#如果知道數(shù)據(jù)的發(fā)送方發(fā)送的字節(jié)數(shù),那么雙方的信息就可以不用在擔(dān)心'字節(jié)長(zhǎng)度問(wèn)題'
#struct模塊可以將任意字符串打包成字節(jié)長(zhǎng)度為4的包,解包后仍可以得到原來(lái)字符串的長(zhǎng)度 當(dāng)原始數(shù)據(jù)特別大的時(shí)候,i模式裝不下了,這個(gè)時(shí)候就需要更換模式import structstr = 'evfreatteg.t.g..t;hyh;y;5;yjjjjjn'print('原始的: ',len(str))str1 = struct.pack('i',len(str)) #將數(shù)據(jù)打包print(len(str1)) #包長(zhǎng)度固定位4str2 = struct.unpack('i',str1)[0] #將數(shù)據(jù)解包print('解包后的: ',str2)原始的: 334解包后的: 33
#解決粘包問(wèn)題 服務(wù)端: 1.先制作一個(gè)要發(fā)送給客戶(hù)端的字典 2.制作字典的報(bào)頭 3.發(fā)送字典的報(bào)頭 4.發(fā)送字典 5.再發(fā)送真實(shí)數(shù)據(jù)長(zhǎng)度 客戶(hù)端: 1.先接受字典的報(bào)頭 2.解析拿到字典的數(shù)據(jù)長(zhǎng)度3.接收字典 4.從字典中獲取真實(shí)數(shù)據(jù)長(zhǎng)度 5.接收真實(shí)數(shù)據(jù) #serverimport socketimport subprocessimport structimport jsonserver = socket.socket()server.bind(('127.0.0.1',8080))server.listen(5)while True: conn,addr = server.accept() while True: try: cmd = conn.recv(1024) if len(cmd) == 0:break cmd = cmd.decode('utf-8') obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) res = obj.stdout.read() obj.stderr.read() d = {'name':'syy','file_size':len(res),'info':'大家為我驕傲'} json_d = json.dumps(d) #1.先制作一個(gè)字典的報(bào)頭 header = struct.pack('i',len(json_d)) #2.發(fā)送字典報(bào)頭 conn.send(header) #3.發(fā)送字典 conn.send(json_d.encode('utf-8')) #4.再發(fā)送真實(shí)數(shù)據(jù) conn.send(res) # conn.send(obj.stdout.read()) #只能read()一次 # conn.send(obj.stderr.read()) except ConnectionResetError as e: print(e) break conn.close()# server.close() #關(guān)機(jī)#clientimport socketimport structimport jsonclient = socket.socket() #生成一個(gè)對(duì)象client.connect(('127.0.0.1',8080))while True: msg = input('請(qǐng)輸入要發(fā)送的內(nèi)容>>>: ').encode('utf-8') if len(msg) == 0:continue #解決客戶(hù)端輸入空,resc()同時(shí)出現(xiàn)的情況 client.send(msg) #對(duì)別人說(shuō)話 #1.先接收字典報(bào)頭 header_dict = client.recv(4) #2.解析報(bào)頭,獲取字典長(zhǎng)度 dict_size = struct.unpack('i',header_dict)[0] #3.循環(huán)接收字典數(shù)據(jù) dict_bytes = client.recv(dict_size) dict_json = json.loads(dict_bytes.decode('utf-8')) #4.從字典中獲取信息 print(dict_json) recv_size = 0 real_data = b'' while recv_size < dict_json.get('file_size'): data = client.recv(1024) real_data = data recv_size = len(data) print(real_data.decode('gbk'))# client.close()
#習(xí)題寫(xiě)一個(gè)上傳電影的功能 1.循環(huán)打印某一個(gè)文件夾下面的所有的文件 2.用戶(hù)想要上傳的文件 3.將用戶(hù)選擇的文件上傳到服務(wù)器 4.服務(wù)端保存該文件 #serverimport socketimport subprocessimport structimport jsonserver = socket.socket()server.bind(('127.0.0.1',8080))server.listen(5)while True: conn,addr = server.accept() while True: try: header_len = conn.recv(4) #解析字典報(bào)頭 header_len = struct.unpack('i',header_len)[0] #在接收字典數(shù)據(jù) header_dic = conn.recv(header_len) real_dic = json.loads(header_dic.decode('utf-8')) #獲取真實(shí)數(shù)據(jù)長(zhǎng)度 total_size = real_dic.get('file_size') #循環(huán)接收并寫(xiě)入文件 recv_size = 0 with open(real_dic.get('file_name'),'wb') as f: while recv_size < total_size: data = conn.recv(1024) f.write(data) recv_size = len(data) print('上傳成功') except ConnectionResetError as e: print(e) break conn.close()# server.close() #關(guān)機(jī)#clientimport socketimport structimport jsonimport osclient = socket.socket() #生成一個(gè)對(duì)象client.connect(('127.0.0.1',8080))while True: #獲取電影列表,循環(huán)展示 MOVIE_DIR = r'D:\python視頻\day29\視頻' movie_list = os.listdir(MOVIE_DIR) for i,movie in enumerate(movie_list,1): print(i,movie) #用戶(hù)選擇 choise = input('請(qǐng)輸入電影序號(hào)>>>: ').strip() #判斷是否是數(shù)字字符串 if choise.isdigit(): choise = int(choise) #判斷用戶(hù)輸入的值的范圍是否有效 if choise in range(1,len(movie_list) 1): #獲取到用戶(hù)想要上傳的文件名 path = movie_list[choise-1] #拼接文件的絕對(duì)路徑 file_path = os.path.join(MOVIE_DIR,path) #獲取文件大小 file_size = os.path.getsize(file_path) #定義一個(gè)字典 res_d = { 'file_name':path, 'file_size':file_size, 'msg':'尼桑~' } #序列化字典 json_d = json.dumps(res_d) json_bytes = json_d.encode('utf-8') #1.制作字典格式報(bào)頭 header = struct.pack('i',len(json_bytes)) #2.發(fā)送字典報(bào)頭 client.send(header) #3.再發(fā)字典 client.send(json_bytes) #4.再發(fā)文件數(shù)據(jù),打開(kāi)文件循環(huán)發(fā)送 with open(file_path,'rb') as f: for line in f: client.send(line) else: print('請(qǐng)輸入數(shù)字序號(hào)!')
#什么是異常程序在運(yùn)行過(guò)程中,出現(xiàn)不可預(yù)知的錯(cuò)誤 并且該錯(cuò)誤沒(méi)有對(duì)應(yīng)的處理機(jī)制,那么就會(huì)以異常的形式表現(xiàn)出來(lái) 造成的影響是整個(gè)程序無(wú)法正常運(yùn)行 #異常的結(jié)構(gòu)1.異常的類(lèi)型NAMEERROP 2.異常的信息name 'hhhhhhh' is not defined 3.異常的位置File "E:/python_test/a.py", line 6, in <module> #異常的種類(lèi)1.語(yǔ)法錯(cuò)誤 是程序員可以立刻解決的,這種錯(cuò)誤是不能容忍的 2.邏輯錯(cuò)誤 這種錯(cuò)誤是可以被容忍的,因?yàn)橐谎劭床怀鰜?lái) 針對(duì)邏輯上的錯(cuò)誤,可以采用異常處理機(jī)制進(jìn)行捕獲 #常見(jiàn)的錯(cuò)誤類(lèi)型1.名字錯(cuò)誤NAMEERROP,變量名、函數(shù)名、類(lèi)名不存在 2.語(yǔ)法錯(cuò)誤SyntaxError,if/while 3.鍵不存在KeyErrord = {'name':'syy'}print(d['password'])4.值錯(cuò)誤ValueErrorint('ssss')5.索引錯(cuò)誤IndexErrorl = [1,2,3]print(l[111])6.關(guān)鍵字assert斷言錯(cuò)誤 AssertionError#異常處理在你認(rèn)為可能會(huì)出現(xiàn)bug的代碼塊上方try一下(try代碼塊越少越好) #異常處理的格式try: 想要監(jiān)控的代碼塊except 錯(cuò)誤類(lèi)型: 監(jiān)控到錯(cuò)誤類(lèi)型后自定義的反饋 try: 想要監(jiān)控的代碼塊except 錯(cuò)誤類(lèi)型 as e:#e代表本來(lái)代碼的錯(cuò)誤反饋 監(jiān)控到錯(cuò)誤類(lèi)型后自定義的反饋 try: 想要監(jiān)控的代碼塊except 錯(cuò)誤類(lèi)型: 監(jiān)控到錯(cuò)誤類(lèi)型后自定義的反饋else: print('被檢測(cè)的代碼沒(méi)有任何異常發(fā)生,才會(huì)走else')finally: print('被檢測(cè)的代碼無(wú)論有沒(méi)有異常發(fā)生,都會(huì)走finally') #例try: nameexcept NameError: print('NameError已被我處理') #except可以跟多個(gè)try: # name # l = [1,2,3] # l[100] # d = {'name':'syy'} # d['password'] # if#語(yǔ)法錯(cuò)誤不能被監(jiān)控 int('www')except NameError: print('NameError已被我處理')except IndexError: print('IndexError已被我處理')except KeyError: print('KeyError已被我處理')except SyntaxError: print('SyntaxError已被我處理')except ValueError: print('ValueError已被我處理') #萬(wàn)能異常捕獲try: # name # l = [1,2,3] # l[100] # d = {'name':'syy'} # d['password'] # if int('www')except Exception:#萬(wàn)能異常捕獲,繼承自BaseException print('所有異常已被我處理') #else語(yǔ)法try: # name # l = [1,2,3] # l[100] # d = {'name':'syy'} # d['password'] # if int('1')except Exception: print('所有異常已被我處理')else: print('被檢測(cè)的代碼沒(méi)有任何異常發(fā)生,才會(huì)走else')finally: print('被檢測(cè)的代碼無(wú)論有沒(méi)有異常發(fā)生,都會(huì)走finally')
#關(guān)鍵字raise,就是主動(dòng)拋出異常if 'syy' == 'cool': passelse: raise NameError('我覺(jué)得不對(duì)...')
#關(guān)鍵字assert在關(guān)鍵字assert預(yù)言的位置,如果語(yǔ)言對(duì)了,代碼正常執(zhí)行,錯(cuò)了的話,報(bào)AssertionError錯(cuò)誤l = [1,2,3]assert len(l) > 0print('斷言對(duì)了才會(huì)走這行代碼')
#主動(dòng)拋出異常,其實(shí)就是將異常類(lèi)的對(duì)象打印出來(lái),會(huì)走_(dá)_str__方法(對(duì)象的屬性被打印的時(shí)候觸發(fā))class MyError(BaseException): def __init__(self,msg): super().__init__() self.msg = msg def __str__(self): return '<%shhhhhh>' %self.msgraise MyError('自定義異常')
#UDP通信數(shù)據(jù)包協(xié)議自帶報(bào)頭 基于UDP協(xié)議的數(shù)據(jù)傳輸,數(shù)據(jù)是不安全的(客戶(hù)端只發(fā),無(wú)論服務(wù)端有沒(méi)有接收) #serverimport socketserver = socket.socket(type=socket.SOCK_DGRAM) #UDP協(xié)議server.bind(('127.0.0.1',8080))#UDP沒(méi)有半連接池的概念不需要設(shè)置半連接池#因?yàn)闆](méi)有雙向通道,所以不需要accept,直接設(shè)置通信循環(huán)即可while True: data,addr = server.recvfrom(1024) print('數(shù)據(jù)',data) #客戶(hù)端發(fā)來(lái)的消息 print('地址',addr) #客戶(hù)端地址 server.sendto(data.upper(),addr) #clientimport socketclient = socket.socket(type=socket.SOCK_DGRAM)#不需要建立連接,直接進(jìn)入通訊循環(huán)server_address = ('127.0.0.1',8080)while True: client.sendto(b'hellow',server_address) data,addr = client.recvfrom(1024) print('服務(wù)端發(fā)來(lái)的數(shù)據(jù)',data) print('服務(wù)端的地址',addr) #UDP類(lèi)似于發(fā)短信,TCP類(lèi)似于打電話
#TCP協(xié)議1.TCP協(xié)議客戶(hù)端允許為空 2.TCP協(xié)議存在粘包問(wèn)題 3.udp協(xié)議服務(wù)端不存在的情況下,客戶(hù)端照樣會(huì)報(bào)錯(cuò) 4.TCP協(xié)議不支持并發(fā),使用模塊可以做到并發(fā) #UDP協(xié)議1.udp協(xié)議客戶(hù)端允許為空?是的 2.udp協(xié)議不會(huì)粘包?會(huì)的 3.udp協(xié)議服務(wù)端不存在的情況下,客戶(hù)端照樣不會(huì)報(bào)錯(cuò)?會(huì)報(bào)錯(cuò),client.recvfrom(1024)報(bào)錯(cuò) 4.udp協(xié)議支持并發(fā)是的 #并發(fā):看起來(lái)像是同時(shí)運(yùn)行#并行:真正意義上的同時(shí)運(yùn)行
#serverimport socketserver = socket.socket(type=socket.SOCK_DGRAM) #UDP協(xié)議server.bind(('127.0.0.1',8080))while True: data,addr = server.recvfrom(1024) print(data.decode('utf-8')) #客戶(hù)端發(fā)來(lái)的消息 msg = input('請(qǐng)輸入你要發(fā)送的內(nèi)容>>>: ').strip() server.sendto(msg.encode('utf-8'),addr) #clientimport socketclient = socket.socket(type=socket.SOCK_DGRAM)server_address = ('127.0.0.1',8080)while True: msg = input('請(qǐng)輸入您要發(fā)送的內(nèi)容(客戶(hù)端1)>>>: ').strip() client.sendto(msg.encode('utf-8'),server_address) data,addr = client.recvfrom(1024) print(data.decode('utf-8'))
#serverimport socketserverclass MyServer(socketserver.BaseRequestHandler): def handle(self): print('來(lái)了?老弟') #創(chuàng)建一個(gè)基于TCP的對(duì)象#只要有客戶(hù)端連接,會(huì)自動(dòng)交給自定義類(lèi)中的handler方法去處理server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)#啟動(dòng)該服務(wù)的對(duì)象server.serve_forever()#clientimport socketclient = socket.socket()client.connect(('127.0.0.1',8080))
#serverimport socketserverclass MyServer(socketserver.BaseRequestHandler): def handle(self): # print('來(lái)了?老弟') while True: data = self.request.recv(1024) print(self.client_address) #客戶(hù)端地址 print(data.decode('utf-8')) self.request.send(data.upper())#村趕緊啊一個(gè)基于TCP的對(duì)象server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)#啟動(dòng)該服務(wù)的對(duì)象server.serve_forever()#clientimport socketclient = socket.socket()client.connect(('127.0.0.1',8080))while True: client.send(b'hello') data = client.recv(1024) print(data.decode('utf-8'))
#serverimport socketserverclass MyServer(socketserver.BaseRequestHandler): def handle(self): # print('來(lái)了?老弟') while True: data,sock = self.request print(self.client_address) #客戶(hù)端地址 print(data.decode('utf-8')) sock.sendto(data.upper(),self.client_address)#村趕緊啊一個(gè)基于TCP的對(duì)象server = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyServer)#啟動(dòng)該服務(wù)的對(duì)象server.serve_forever()#clientimport socketimport timeclient = socket.socket(type=socket.SOCK_DGRAM)server_address = ('127.0.0.1',8080)while True: client.sendto(b'hello',server_address) data,addr = client.recvfrom(1024) print(data.decode('utf-8'),addr) time.sleep(1)
來(lái)源:https://www.icode9.com/content-1-782451.html
聯(lián)系客服