python的socket编程执行顺序_Python篇-Socket网络编程
TZ:多讀英文,少點煩躁
一 : 科普一分鐘
簡單來說Socket就是對TCP/IP等網絡協議的封裝和應用,其重要的兩個動作就是發送和接受當我們需要調用網絡連接時只需建立Socket連接,Socket需要知道目標計算機的IP地址和端口號,再指定協議類型即可。
二: Socket創建客戶端與服務端
客戶端
1.導入socket模塊
import socket
2.創建實體類,發送數據,端口號的作用是連接后具體指定哪個程序響應
#聲明 socket 類型,同時生成socket連接對象
client = socket.socket()
#連接ip地址和端口號
client.connect(('www.TianTianbaby.com',9999))
while True:
mes = input(">> :").strip()
if len(mes) == 0:
continue
if mes == 'q':
break
#客戶端發送數據
client.send(mes.encode())
#客戶端接收服務端返回的數據
data = client.recv(1024)
#打印返回信息
print("recv:",data.decode())
client.close()
服務端
1.導入socket模塊
import socket,os
2.創建實體類接收數據
server = socket.socket()
#綁定要監聽的端口
server.bind(('www.TianTianbaby.com',9999))
#監聽,參數為最大監聽數量
server.listen(5)
print("等待ing")
while True:
#conn就是客戶端連過來而在服務器端為其生成的一個連接實例
conn, addr = server.accept()
while True:
#接收數據,參數最大為 1024*8
data = conn.recv(1024)
print("Severrecv:",data)
#客戶端斷開
if not data:
print("client has lost")
break
#把執行的數據返回給客戶端
res = os.popen(data).read()
conn.send(res)
server.close()
三:Socket粘包
產生原因:
1.發送端需要等本機的緩沖區滿了以后才發送出去,造成粘包(發送數據時間間隔很端,數據很小,會合在一個起,產生粘包)
2.接收端不及時接收緩沖區的包,造成多個包接受(客戶端發送一段數據,服務端只收了一小部分,服務端下次再收的時候還是從緩沖區拿上次遺留的數據 ,就產生粘包)
解決辦法: 介紹兩個比較簡單的方法
1.sleep 讓上一次緩沖區超時.不等下一條.(不建議用)
缺點:造成速度延遲
conn.send(str(len(cmd_res.encode())).encode())
time.sleep(0.5)
conn.send(cmd_res.encode())
2.插入交互 : 插入一個接受響應,如果不響應,第一個發送就不會等待.解決了粘包問題
conn.send(str(len(cmd_res.encode())).encode())
client_ack = conn.rec(1024)#等待確認
conn.send(cmd_res.encode())
另一端手動加一個響應:
偽代碼:上一次接收 client.recv(1024)
# client.send("準備好接收了,可以發了".encode())
四:SocketServer服務端
SocketServer簡化了網絡服務器的編寫。在進行socket創建時,使用SocketServer會大大減少創建的步驟.
使用方法:
創建服務器的步驟。首先,你必須創建一個請求處理類,它是BaseRequestHandler的子類并重載其handle()方法。
實例化一個服務器類,傳入服務器的地址和請求處理程序類。
調用handle_request()(一般是調用其他事件循環或者使用select())或serve_forever()。
繼承關系:
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
代碼步驟:
1導入模塊SocketServer
import socketserver
2.創建類
class MyTCPHandler(socketserver.BaseRequestHandler):
#與客戶端所有的交互在handle完成
def handle(self):
while True:
try:
#接收客戶端數據
self.data = self.request.recv(1024).strip()
print("ip",self.client_address[0])
print(self.data)
# 如果客戶端斷開
if not self.data:
print(self.client_address, "斷開了")
break
#給客戶端發送數據
self.request.sendall(self.data.upper())
#如果客戶端斷開了
except ConnectionResetError as e:
print("err",e)
break
3.創建實例
if __name__ == "__main__":
HOST,PORT = 'www.TianTianbaby.com',9999
server =
#創建一個多并發的服務
socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
#永久打開
server.serve_forever()
五:總結
數據鏈路層上識別mac(物理)地址,在網絡層識別ip地址,而在傳輸層基于一些基本的協議如TCP/IP,'UDP'建立連接發送消息.
TCP/IP要建立三次握手,四次接受,上學時候學習網絡時候都有學習.
既然是建立的連接,就要發送和接受消息,所以側重點就是發和收,每個協議都要自己去實現發和收.比較繁瑣麻煩.
簡單來說socket就是簡化那么復雜的東西,封裝給我們一個可以建立連接的模塊方便我們使用.
在使用socket的時候 我們只關心如何收和發就好了,編寫出更高效的程序
附:在評論處留下郵箱地址即可獲得全注釋源碼
總結
以上是生活随笔為你收集整理的python的socket编程执行顺序_Python篇-Socket网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript:有符号整数与无符号
- 下一篇: python画一个祝福别人生日快乐_分享