日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程

發(fā)布時(shí)間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基于UDP協(xié)議 的socket套接字編程

1.UDP套接字簡(jiǎn)單示例

1.1服務(wù)端

import socketserver = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 建立一個(gè)UDP協(xié)議的服務(wù)器 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) # 建立一個(gè)UDP協(xié)議的客戶端while True:msg = input("請(qǐng)輸入傳輸內(nèi)容:>>").strip()client.sendto(msg.encode("utf8"),("127.0.0.1,8080"))data,addr = client.recvfrom(1024)print(data)client.close() - UDP是無鏈接的,先啟動(dòng)那一端都不會(huì)報(bào)錯(cuò) - UDP協(xié)議是數(shù)據(jù)報(bào)協(xié)議.發(fā)空的時(shí)候也會(huì)自帶報(bào)頭,因此客戶端輸入空,服務(wù)器也能收到

2.UDP套接字無粘包問題

2.1服務(wù)端

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協(xié)議一般不用于傳輸大數(shù)據(jù) - UDP套接字雖然沒有粘包問題,但是不能代替TCP套接字,因?yàn)閁DP協(xié)議有一個(gè)缺陷:如果數(shù)據(jù)發(fā)送途中,數(shù)據(jù)丟失,則數(shù)據(jù)就丟失了, 而TCP協(xié)議不會(huì)有這種缺陷,因此一般UDP套接字編程只用于無關(guān)緊要的數(shù)據(jù)發(fā)送.例如qq聊天

基于socketserver實(shí)現(xiàn)并發(fā)的socket編程

"本質(zhì)是導(dǎo)入socketserver庫(kù),重寫handle函數(shù),在handle函數(shù)中寫入傳遞信息的語句"

1.基于TCP協(xié)議

- 基于tcp的套接字,關(guān)鍵就是兩個(gè)循環(huán),一個(gè)鏈接循環(huán),一個(gè)通信循環(huán) - socketserver模式中分為兩大類:server類(解決鏈接問題)和request類(解決通信問題)

1.1服務(wù)端

import socketserverclass My_socket(socketserver.BaseRequestHandler): # 必須繼承括號(hào)里面的父類def handle(self): # 必須重寫handle方法while True: # 這里包括以下是正常使用的之前的方法去寫接收和發(fā)送數(shù)據(jù)try:data = self.request.recv(1024) except Exception:continueif len(data) == 0: # 這一句在linux系統(tǒng)才可以運(yùn)行breakprint(data)self.request.send(data.upper())if __name__ == '__main__':s = socketserver.ThreadingTCPServer(("192.168.11.30", 8080),My_socket) # 用封裝的方法創(chuàng)建一個(gè)TCP的服務(wù)器s.serve_forever() # 循環(huán)連接 封裝好的方法,直接拿來使用,就是創(chuàng)建一個(gè)線程 - 循環(huán)建立連接,每建立一個(gè)連接就會(huì)啟動(dòng)一個(gè)線程 + 調(diào)用MyHandler類產(chǎn)生一個(gè)對(duì)象,調(diào)用該對(duì)象下的handle方法, 專門與剛剛建立好的連接做通信循環(huán).

1.2客戶端

- 因?yàn)檫@個(gè)封裝socket就是對(duì)服務(wù)器進(jìn)行創(chuàng)建多線程的操作,所以客戶端不需要這個(gè)庫(kù)去改寫,只要正常的客戶端就歐克啦. import socketclient = socket.socket() client.connect(("192.168.11.30", 8080)) while True:msg = input("請(qǐng)輸入消息:").strip()if msg == "q":breakclient.send(msg.encode("utf8"))data = client.recv(1024)print(data) client.close()

2.基于UDP協(xié)議

2.1服務(wù)端

import socketserverclass My_Udp_server(socketserver.BaseRequestHandler):def handle(self):data = self.request[0]print(f"收到來自{self.client_address}的數(shù)據(jù):{data}")self.request[1].sendto(data.upper(),self.client_address) # self.request[1] 是一個(gè)對(duì)象if __name__ == '__main__':s = socketserver.ThreadingUDPServer(("192.168.11.30", 8080),My_Udp_server) # 創(chuàng)建一個(gè)UDP協(xié)議的服務(wù)器s.serve_forever() # 循環(huán)連接,這里學(xué)的比較淺的多線程就得使用這個(gè)庫(kù)中封裝的這個(gè)方法

2.2客戶端

import socketclient = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)while True:msg = input('請(qǐng)輸入需要傳遞的信息:').strip()if msg == "q":breakclient.sendto(msg.encode("utf8"),("192.168.11.30", 8080))data = client.recvfrom(1024)print(data) client.close()

轉(zhuǎn)載于:https://www.cnblogs.com/xiongchao0823/p/11493446.html

總結(jié)

以上是生活随笔為你收集整理的基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。