基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程
生活随笔
收集整理的這篇文章主要介紹了
基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基于UDP協議 的socket套接字編程
1.UDP套接字簡單示例
1.1服務端
import socketserver = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 建立一個UDP協議的服務器 server.bind(("127.0.0.1",8080))while True:data,addr = server.recvfrom(1024)server.sendto(data.upper(),addr) server.close()1.2客戶端
import socketclient = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 建立一個UDP協議的客戶端while True:msg = input("請輸入傳輸內容:>>").strip()client.sendto(msg.encode("utf8"),("127.0.0.1,8080"))data,addr = client.recvfrom(1024)print(data)client.close() - UDP是無鏈接的,先啟動那一端都不會報錯 - UDP協議是數據報協議.發空的時候也會自帶報頭,因此客戶端輸入空,服務器也能收到2.UDP套接字無粘包問題
2.1服務端
import socketserver = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(("127.0.0.1",8080))data,addr = server.recvfrom(1024) print("第一次:",data) data,addr = server.recvfrom(1024) print("第二次:",data)server.close()2.2客戶端
import socketclient = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)client.sendto("hello".encode("utf8"),("127.0.0.1",8080)) client.sendto("word".encode("utf8"),("127.0.0.1",8080))client.close() - UDP協議一般不用于傳輸大數據 - UDP套接字雖然沒有粘包問題,但是不能代替TCP套接字,因為UDP協議有一個缺陷:如果數據發送途中,數據丟失,則數據就丟失了, 而TCP協議不會有這種缺陷,因此一般UDP套接字編程只用于無關緊要的數據發送.例如qq聊天基于socketserver實現并發的socket編程
"本質是導入socketserver庫,重寫handle函數,在handle函數中寫入傳遞信息的語句"
1.基于TCP協議
- 基于tcp的套接字,關鍵就是兩個循環,一個鏈接循環,一個通信循環 - socketserver模式中分為兩大類:server類(解決鏈接問題)和request類(解決通信問題)1.1服務端
import socketserverclass My_socket(socketserver.BaseRequestHandler): # 必須繼承括號里面的父類def handle(self): # 必須重寫handle方法while True: # 這里包括以下是正常使用的之前的方法去寫接收和發送數據try:data = self.request.recv(1024) except Exception:continueif len(data) == 0: # 這一句在linux系統才可以運行breakprint(data)self.request.send(data.upper())if __name__ == '__main__':s = socketserver.ThreadingTCPServer(("192.168.11.30", 8080),My_socket) # 用封裝的方法創建一個TCP的服務器s.serve_forever() # 循環連接 封裝好的方法,直接拿來使用,就是創建一個線程 - 循環建立連接,每建立一個連接就會啟動一個線程 + 調用MyHandler類產生一個對象,調用該對象下的handle方法, 專門與剛剛建立好的連接做通信循環.1.2客戶端
- 因為這個封裝socket就是對服務器進行創建多線程的操作,所以客戶端不需要這個庫去改寫,只要正常的客戶端就歐克啦. import socketclient = socket.socket() client.connect(("192.168.11.30", 8080)) while True:msg = input("請輸入消息:").strip()if msg == "q":breakclient.send(msg.encode("utf8"))data = client.recv(1024)print(data) client.close()2.基于UDP協議
2.1服務端
import socketserverclass My_Udp_server(socketserver.BaseRequestHandler):def handle(self):data = self.request[0]print(f"收到來自{self.client_address}的數據:{data}")self.request[1].sendto(data.upper(),self.client_address) # self.request[1] 是一個對象if __name__ == '__main__':s = socketserver.ThreadingUDPServer(("192.168.11.30", 8080),My_Udp_server) # 創建一個UDP協議的服務器s.serve_forever() # 循環連接,這里學的比較淺的多線程就得使用這個庫中封裝的這個方法2.2客戶端
import socketclient = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)while True:msg = input('請輸入需要傳遞的信息:').strip()if msg == "q":breakclient.sendto(msg.encode("utf8"),("192.168.11.30", 8080))data = client.recvfrom(1024)print(data) client.close()轉載于:https://www.cnblogs.com/xiongchao0823/p/11493446.html
總結
以上是生活随笔為你收集整理的基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 数学函数bc的使用(浮点数计算)
- 下一篇: 设计模式-Adapter模式