本篇文章給大家分享的是有關(guān)Python進(jìn)行簡單的網(wǎng)絡(luò)編程,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)長期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為豐潤企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,豐潤網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
OSI 模型介紹
應(yīng)用層 -- 對接受的數(shù)據(jù)進(jìn)行解釋、加密與解密、壓縮與解壓縮。
會話層 -- 通過傳輸層(端口號: 傳輸端口和接受端口) 建立數(shù)據(jù)傳輸?shù)耐贰?/p>
傳輸層 -- 定義了一些傳輸數(shù)據(jù)的協(xié)議和端口號(www端口80等),如:TCP。
網(wǎng)絡(luò)層 -- 主要將從下層接收到的數(shù)據(jù)進(jìn)行IP地址(例:192.168.0.1)的封裝與解封裝。
數(shù)據(jù)鏈路層 -- 主要將從物理層接收的數(shù)據(jù)進(jìn)行MAC地址的封裝與解封裝。
物理層 -- 主要定義物理設(shè)備標(biāo)志,如往昔的接口類型,跟蹤傳輸介質(zhì)的傳輸速率等。
TCP/IP協(xié)議
參考模型把所有的TCP/IP系列協(xié)議歸類到四個(gè)抽象層中。
應(yīng)用層 -- TFTP,HTTP,SNMP,F(xiàn)TP,SMTP,DNS,Telnet 等等
傳輸層 -- TCP,UDP
網(wǎng)絡(luò)層 -- IP,ICMP,OSPF,EIGRP,IGMP
數(shù)據(jù)鏈路層 -- SLIP,CSLIP,PPP,MTU
Socket 通信流程
相關(guān)方法及參數(shù)介紹
family=AF_INET: 服務(wù)器之間的通信 family=AF_UNIX: Unix 不同進(jìn)程間通信 sk.bind(address) #s.bind(address) 將套接字綁定到地址。address地址的格式取決于地址族。在AF_INET下,以元組(host,port)的形式表示地址。 sk.listen(backlog) #開始監(jiān)聽傳入連接。backlog指定在拒絕連接之前,可以掛起的最大連接數(shù)量。 #backlog等于5,表示內(nèi)核已經(jīng)接到了連接請求,但服務(wù)器還沒有調(diào)用accept進(jìn)行處理的連接個(gè)數(shù)最大為5 #這個(gè)值不能無限大,因?yàn)橐趦?nèi)核中維護(hù)連接隊(duì)列 sk.setblocking(bool) #是否阻塞(默認(rèn)True),如果設(shè)置False,那么accept和recv時(shí)一旦無數(shù)據(jù),則報(bào)錯(cuò)。 sk.accept() #接受連接并返回(conn,address),其中conn是新的套接字對象,可以用來接收和發(fā)送數(shù)據(jù)。address是連接客戶端的地址。 #接收TCP 客戶的連接(阻塞式)等待連接的到來 sk.connect(address) #連接到address處的套接字。一般,address的格式為元組(hostname,port),如果連接出錯(cuò),返回socket.error錯(cuò)誤。 sk.connect_ex(address) #同上,只不過會有返回值,連接成功時(shí)返回 0 ,連接失敗時(shí)候返回編碼,例如:10061 sk.close() #關(guān)閉套接字 sk.recv(bufsize[,flag]) #接受套接字的數(shù)據(jù)。數(shù)據(jù)以字符串形式返回,bufsize指定最多可以接收的數(shù)量。flag提供有關(guān)消息的其他信息,通??梢院雎浴? sk.send(string[,flag]) #將string中的數(shù)據(jù)發(fā)送到連接的套接字。返回值是要發(fā)送的字節(jié)數(shù)量,該數(shù)量可能小于string的字節(jié)大小。即:可能未將指定內(nèi)容全部發(fā)送。 sk.sendall(string[,flag]) #將string中的數(shù)據(jù)發(fā)送到連接的套接字,但在返回之前會嘗試發(fā)送所有數(shù)據(jù)。成功返回None,失敗則拋出異常。 #內(nèi)部通過遞歸調(diào)用send,將所有內(nèi)容發(fā)送出去。
簡單的通信(client 端發(fā)送消息,server 端接收,一發(fā)一收)
# server 端 import socket sk = socket.socket() address=('127.0.0.1', 8000) sk.bind(address) sk.listen(3) print('waiting....') conn, addr = sk.accept() while 1: data = conn.recv(1024) # server 端通過 conn 接收和發(fā)送數(shù)據(jù) print('.....',str(data, 'utf8')) if not data: break inp = input('>>>') conn.send(bytes(inp,'utf8')) sk.close() # client 端 import socket sk = socket.socket() address = ('127.0.0.1', 8000) sk.connect(address) while True: inp = input('>>>') if inp == 'exit': break sk.send(bytes(inp, 'utf8')) # client 端通過 sk 接收和發(fā)送數(shù)據(jù) data = sk.recv(1024) print(str(data,'utf8')) sk.close()
簡單的通信(server 持續(xù)監(jiān)聽)
# server 端 import socket sk = socket.socket() address=('127.0.0.1', 8000) sk.bind(address) sk.listen(3) print('waiting....') while 1: conn, addr = sk.accept() print(addr) while 1: try: data = conn.recv(1024) except Exception: break print('.....',str(data, 'utf8')) inp = input('>>>') conn.send(bytes(inp,'utf8')) sk.close() # client 端 import socket sk = socket.socket() address = ('127.0.0.1', 8000) sk.connect(address) while True: inp = input('>>>') if inp == 'exit': break sk.send(bytes(inp, 'utf8')) data = sk.recv(1024) print(str(data,'utf8')) sk.close()
使用python執(zhí)行命令
import subprocess a = subprocess.Popen('dir', shell=True, stdout=subprocess.PIPE) print(str(a.stdout.read(),'gbk')) # windows 機(jī)器默認(rèn)編碼為 gbk 所以輸出需要解碼為 gbk
bytes編碼 與 str編碼相互轉(zhuǎn)換
str : unicode bytes : 十六進(jìn)制 s = 'hello,陳先生' print(type(s)) #b = bytes(s, 'utf8') # str 編碼成 bytes print(type(b)) # print(b) # b'hello,\xe9\x99\x88\xe5\x85\x88\xe7\x94\x9f b2 = s.encode('utf8') # str 編碼成 bytes print(type(b2)) # print(b) # b'hello,\xe9\x99\x88\xe5\x85\x88\xe7\x94\x9f s1 = str(b2, 'utf8') # bytes 解碼成 str print(s1) # hello,陳先生 s2 = b2.decode('utf8') # bytes 解碼成 str print(s2) # hello,陳先生
以上就是Python進(jìn)行簡單的網(wǎng)絡(luò)編程,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。