您好,登錄后才能下訂單哦!
小編給大家分享一下Pythony運維之Socket網絡編程的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Socket是什么?
Socket 是電腦網絡中進程間數據流的端點Socket 是操作系統的通信機制應用程序通過Socket進行網絡數據的傳輸
首先,簡單了解一下TCP通信過程:
TCP三次握手(面試常考):
第一次握手:客戶端 發送SYN報文,設置隨機數序號X,服務器由SYN=1知道,客戶端要求建立聯機
第二次握手:服務器端接收到客戶端的報文之后,經過處理,返回給客戶端SYN+ACK報文,同時設置隨機序號Y,此時返回的報文確認ACK=X+1
第三次握手:接收到報文的客戶端,會在處理確認之后,再發送一個報文給服務器端,此時確認為ACK=Y+1
服務器端接收到客戶端發送的報文之后,會在服務器端與客戶端形成一種通路,此后的數據就可以在這個通路上就可以傳輸。
Socket使用TCP協議的通信過程與上述相當類似:
Socket通信方式
Socket分為TCP和UDP兩種不同的通信方式
為什么選擇 Socket?
Socket是基礎應用,適應多種網絡協議,服務器的傳輸大量涉及網絡協議,離不開Socket的應用
以下編寫簡單的服務器和客戶端程序(以本機為例):
服務器端程序:
導入socket模塊(需要預先pip) import socket #創建實例 sk = socket.socket() #鼠標放在內建函數上,Ctrl+B,可以查看源碼 ip_port = ("127.0.0.1",8888) #綁定ip和port,以本機(127.0.0.1)和其他端口(8888)為例 sk.bind(ip_port) #綁定監聽 sk.listen(5) #最大連接數,大多數程序設置5足夠 print("正在接受數據") #打印一行提示信息 conn,address =sk.accept() #接收數據 msg ="hello world" #定義數據 conn.send(msg.encode()) #返回信息 , python3發送和接收網絡數據是byte類型,如果發送的是str類型就需要進行編碼 conn.close() #關閉連接
客戶端程序:
#導入socket模塊 import socket client = socket.socket() #實例初始化 ip_port = ("127.0.0.1", 8888) #訪問服務器端的ip和端口 client.connect(ip_port) #連接服務器 data = client.recv(1024) #接收服務器信息 print(data.decode()) #打印信息,python3是傳輸byte類型 ,需要編碼。
實現socket客戶端一次連接中連續消息發送:
server端:
#導入socket模塊 import socket import random sk=socket.socket() #創建實例 ip_port =("127.0.0.1",8888) #定義綁定IP和port sk.bind(ip_port) #綁定監聽 sk.listen(5) #設置最大連接數 while True: #連續接收數據 print("正在等待接收數據。。。。。") #提示信息 server,address=sk.accept() #接收數據 msg='歡迎來到socket世界' #定義信息 server.send(msg.encode()) #返回信息 while True: #連續接受客戶端發送的消息 data=server.recv(1024) #接收客戶端信息 print(data.decode()) #打印獲取的數據,實際開發生產一般不打印 if data == b'exit': #接收到退出命令 break sever.send(data.encode()) #處理客戶端數據 sever.send(str(random.randint(1,50000)).encode()) #發送隨機數據信息 conn.close() #主動關閉連接
client端:
import socket #導入模塊 client=socket.socket() #實例初始化 ip_port =("127.0.0.1",8888) #訪問服務端IP和端口 client.connect(ip_port) #連接sever端 while True: #定義循環,發送消息 date = client.recv(1024) # 接收sever端信息 print(data.decode()) # 打印接收數據 msg_input=input("請輸入發送的信息:") #輸入發送的信息 client.send(msg_input.encode()) #消息發送 if msg_input == "exit": #接收到退出命令 break data= client.recv(1024) #接收sever端信息 print(date.decode()) #打印接收的消息
上述是一個客戶端連接服務器,接下來介紹多個客戶端連接服務器:
首先對socket參數進行了解:
參數一:family地址簇
參數二:type類型
參數三:proto協議號
socket UDP通信:
服務器端:
import socket sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) ip_port = ("127.0.0.1",8888) sk.bind(ip_port) while True: data = sk.recv(1024) print(data.decode()) #bytes--->(decode)--->str
客戶端:
import socket client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) in_port = ("127.0.0.1",8888) while True: msg_input = input("輸入需要發送的信息:") if msg_input == "exit": break client.sendto(msg_input.encode(),in_port) # str--->(encode)--->bytes client.close()
socket非阻塞模塊:
前面談到的實例程序TCP socket存在阻塞,python能否實現非阻塞TCP通信,顯然是可以的,不然python也不會發展這么強大。
實現途徑:導入socketsever ,用多線程的方式實現非阻塞——繼承socketsever對象重載setup、handle、finish方法。
import socketserver #定義一個類 class Myserver(socketserver.BaseRequsetHandler): #如果handle方法報錯,則會跳過 #setup和finish方法無論如何都會執行 #首先執行setup方法 def setup(self): pass #然后執行handle方法 def handle(self): #定義連接變量 conn = self.request msg='歡迎來到socket世界' #定義信息 conn.send(msg.encode()) #返回信息 while True: #連續接受客戶端發送的消息 data=conn.recv(1024) #接收客戶端信息 print(data.decode()) #打印獲取的數據,實際開發生產一般不打印 if data == b'exit': #接收到退出命令 break conn.send(data.encode()) #處理客戶端數據 conn.send(str(random.randint(1,50000)).encode()) #發送隨機數據信息 conn.close() #最后執行finish方法 def finish(self): pass if name == "__main__": #創建多線程實例 server = socketserver.ThreadingTCPServer((“127.0.0.1",8888),Myserver) #開啟異步多線程,等待連接 server.serve_forever()`
然后用之前的TCP客戶端程序實現非阻塞多客戶端通信
實例——文件上傳程序:
運維通常會遇到文件上傳的情況,同時沒有第三方軟件的時候,這個時候我們 可以自己實現文件上傳
文件接收端(server):
import socket sk = socket.socket() ip_port = ("127.0.0.1",9999) sk.bind(ip_port) sk.listen(5) while True: conn,adress = sk.accept() with open("file","ab") as f: #ab可添加二進制模式 data = conn.recv(1024) if data == b"exit": break f.write(data) sk.close()
文件發送端(本機)(client):
import socket #發起連接 sk = socket.socket() ip_port = ("127.0.0.1", 9999) #服務器的端口 sk.connect(ip_port) #打開文件 with open(”test.py“,”rb“) as f: for i in f: sk,send(i) sk.send("exit",encode()) #結束信號
以上是“Pythony運維之Socket網絡編程的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。