TCP和UDP的區別以及使用python服務端客戶端簡單編程
阿新 • • 發佈:2019-04-25
類型 情況 回車 退出 python spa 工作效率 效率 true
一、TCP、UDP區別總結
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
2、TCP提供可靠的服務,也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保證可靠交付
3、UDP具有較好的實時性,工作效率比TCP高,適用於對高速傳輸和實時性較高的通信或廣播通信
4、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5、TCP對系統資源要求較多,UDP對系統資源要求較少
二、TCP服務端以及客戶端編程
服務器端:
from socket import* #創建流式套接字 sockfd = socket(AF_INET,SOCK_STREAM,0) #綁定IP端口 sockfd.bind((‘192.168.80.217‘,8888)) #設置監聽套接字,創建監聽隊列 sockfd.listen(5) while True: print("waiting for connect....") #等待客戶端鏈接 connfd,addr = sockfd.accept() # accept函數主要用於服務器端,一般位於listen函數之後,默認會阻塞進程, # 直到有一個客戶請求連接,建立好連接後,它返回的一個新的套接字connfd,# 此後,服務器端即可使用這個新的套接字connfd與該客戶端進行通信, # 而sockfd則繼續用於監聽其他客戶端的連接請求 print("connect from",addr) while True: #收消息 data = connfd.recv(1024) if not data: break print(data.decode()) #發消息 connfd.send(‘來,確認下眼神‘.encode())#關閉套接字 connfd.close() sockfd.close()
客戶端:
from socket import * #創建套接字 sockfd = socket(AF_INET,SOCK_STREAM) #發起連接 sockfd.connect((‘192.168.80.217‘,8888)) while True: msg = input("發消息>>") #發送消息 sockfd.send(msg.encode()) if not msg: break #接收消息 data = sockfd.recv(1024) print(data.decode()) #關閉 sockfd.close()
三、UDP服務端以及客戶端編程
服務器端:
from socket import * import sys from time import ctime #從命令行傳入IP和端口 #python3 udp_server.py 172.60.50.42 8888 if len(sys.argv) < 3: print(‘‘‘ argv is error!!! input as python3 udp_server.py 172.60.50.42 8888 ‘‘‘) HOST = sys.argv[1] PORT = int(sys.argv[2]) ADDR = (HOST,PORT) BUFFERSIZE = 1024 #創建數據報套接字 sockfd = socket(AF_INET,SOCK_DGRAM) #綁定地址 sockfd.bind(ADDR) #收發消息 while True: data,addr = sockfd.recvfrom(BUFFERSIZE) print(‘recv from %s:%s‘%(addr,data.decode())) sockfd.sendto (("[%s] 接收到消息"%ctime()).encode(),addr) sockfd.close()
客戶端:
from socket import * import sys #從命令行傳入IP和端口 #python3 udp_server.py 172.60.50.42 8888 if len(sys.argv) < 3: print(‘‘‘ argv is error!!! input as python3 udp_server.py 172.60.50.42 8888 ‘‘‘) HOST = sys.argv[1] PORT = int(sys.argv[2]) ADDR = (HOST,PORT) BUFFERSIZE = 1024 #創建數據報套接字 sockfd = socket(AF_INET,SOCK_DGRAM) while True: data = input("消息>>") #直接回車退出 if not data: break sockfd.sendto(data.encode(),ADDR) data,addr = sockfd.recvfrom(BUFFERSIZE) print(‘從服務器收到:‘,data.decode()) sockfd.close()
四、TCP和UDP編程步驟區別總結
1、創建套接字
TCP使用的是SOCK_STREAM(套接字類型:字節流),SOCK_STREAM這種的特點是面向連接的,即每次收發數據之前必須通過connect建立連接
UDP使用的是SOCK_DGRAM(套接字類型:數據包),SOCK_DGRAM這種是User Datagram Protocol協議的網絡通訊,它是無連接的,不可靠的
2、TCP服務端使用listen開啟監聽以及accept阻塞進程來等待客戶端連接,UDP是面向無連接的則不需要
3、收發消息
TCP使用的是recv()接收消息,send()發送消息
UDP使用的是recvfrom()循環接收數據,sendto()發送數據
*TCP一旦發生丟包,TCP將後續的包緩存起來,等前面的包重傳並接收到後再繼續發送,延時會越來越大
UDP對實時性要求較為嚴格的情況下,采用自定義重傳機制,能夠把丟包產生的延遲降到最低,盡量減少網絡造成的影響
TCP和UDP的區別以及使用python服務端客戶端簡單編程