日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python Socket編程詳解

瀏覽:48日期:2022-06-21 11:19:00
背景

關(guān)于Python Socket編程,首先需要了解幾個(gè)計(jì)算機(jī)網(wǎng)絡(luò)的知識(shí),通過(guò)以下的幾個(gè)問(wèn)題,有助于更好的理解Socket編程的意義,以及整個(gè)框架方面的知識(shí):

TCP和UDP協(xié)議本質(zhì)上的區(qū)別?

TCP協(xié)議,面向連接,可靠,基于字節(jié)流的傳輸層通信協(xié)議;UDP協(xié)議無(wú)連接,不可靠,基于數(shù)據(jù)包的傳輸層協(xié)議。

TCP協(xié)議在建立連接的過(guò)程需要經(jīng)歷三次握手,斷開(kāi)連接則需要經(jīng)歷四次揮手,而這建立連接的過(guò)程增加了傳輸過(guò)程中的安全性。而建立連接的過(guò)程則會(huì)消耗系統(tǒng)的資源,消耗更多的時(shí)間,而相比較UDP協(xié)議傳輸過(guò)程則不會(huì)出現(xiàn)這種問(wèn)題。

總結(jié)來(lái)講,基于TCP協(xié)議傳輸,需要不斷的確認(rèn)對(duì)方是否收到信息,從而建立連接(確認(rèn)過(guò)程次數(shù)有限制,即三次握手),UDP協(xié)議傳輸則不需要確認(rèn)接收端是否收到信息,只需要將信息發(fā)給對(duì)方。

TCP/IP協(xié)議棧、HTTP協(xié)議、Socket之間的區(qū)別和聯(lián)系?

TCP/IP協(xié)議棧就是一系列網(wǎng)絡(luò)協(xié)議,可以分為四層模型來(lái)分析:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、鏈路層;

HTTP協(xié)議(超文本傳輸協(xié)議)就是在這一協(xié)議棧中的應(yīng)用層協(xié)議;HTTP協(xié)議簡(jiǎn)單來(lái)說(shuō),它的作用就是規(guī)范數(shù)據(jù)的格式,讓程序能夠方便的識(shí)別,并且收發(fā)雙方都需要遵循同樣的協(xié)議格式進(jìn)行數(shù)據(jù)傳輸。(應(yīng)用層的協(xié)議也和HTTP協(xié)議的作用類似,不一樣的是定義不同的數(shù)據(jù)格式。)

Socket可以理解為TCP/IP協(xié)議棧提供的對(duì)外的操作接口,即應(yīng)用層通過(guò)網(wǎng)絡(luò)協(xié)議進(jìn)行通信的接口。Socket可以使用不同的網(wǎng)絡(luò)協(xié)議進(jìn)行端對(duì)端的通信;

TCP Socket服務(wù)器的通信過(guò)程?

Server端:

建立連接(socket()函數(shù)創(chuàng)建socket描述符、bind()函數(shù)綁定特定的監(jiān)聽(tīng)地址(ip+port)、listen()函數(shù)監(jiān)聽(tīng)socket、accept()阻塞等待客戶端連接)

數(shù)據(jù)交互(read()函數(shù)阻塞等待客戶端發(fā)送數(shù)據(jù)、write()函數(shù)發(fā)送給客戶端數(shù)據(jù))

Client端:

建立連接(socket()函數(shù)創(chuàng)建socket描述符、connect()函數(shù)向指定的監(jiān)聽(tīng)地址發(fā)送連接請(qǐng)求)

數(shù)據(jù)交互(wirte()函數(shù)發(fā)送服務(wù)端數(shù)據(jù)、read()函數(shù)足阻塞等待接受服務(wù)端發(fā)送的數(shù)據(jù))

socket和websocket之間的聯(lián)系?

webosocket是一種通信協(xié)議,不同于HTTP請(qǐng)求,客戶端請(qǐng)求服務(wù)端資源,服務(wù)端響應(yīng)的通信過(guò)程;websocket允許服務(wù)端主動(dòng)向客戶端推送消息,同時(shí)做到客戶端和服務(wù)端雙向通訊的協(xié)議。(具體底層原理有待后面實(shí)踐,暫時(shí)未接觸)

HTTP,WSGI協(xié)議的聯(lián)系和區(qū)別?

HTTP協(xié)議(超文本傳輸協(xié)議),屬于TCP/IP協(xié)議棧中應(yīng)用層的協(xié)議。用于規(guī)范傳輸數(shù)據(jù)的格式,是一種客戶端和服務(wù)端傳輸?shù)囊?guī)則。

WSGI協(xié)議則是Python定義的Web服務(wù)器和框架程序通信的接口規(guī)則。兩者聯(lián)系不大,強(qiáng)行說(shuō)的話,Python框架程序主要處理的是HTTP請(qǐng)求。

(后期可以實(shí)現(xiàn)一個(gè)WSGI協(xié)議的Python框架,用于處理HTTP請(qǐng)求的實(shí)驗(yàn)。)

主流Web框架,異步Web框架?

主流Web框架:Django、Flask

異步Web框架:Tornado(內(nèi)置異步模塊)、Snaic(Python自帶asyncio)、FastAPI(基于Starlette庫(kù)) 、aiohttp(基于asyncio)

asyncio,aiohttp之間的聯(lián)系?(異步編程)

asyncio是一個(gè)異步IO庫(kù),aiohttp就是基于asyncio的異步HTTP框架(支持客戶端/服務(wù)端)

代碼設(shè)計(jì)

Python提供了基本的socket模塊:

socket模塊;提供了標(biāo)準(zhǔn)的BSD Sockets API; socketserver模塊:提供了服務(wù)器中心類,簡(jiǎn)化服務(wù)器的開(kāi)發(fā); TCP Socket服務(wù)端

socket模塊:

# -*- coding: utf-8 -*-from socket import socket, AF_INET, SOCK_STREAMdef echo_handler(sock ,address):print('Get Connection from address:', address)while True:response = sock.recv(8192)if not response:breakprint(f'Got {response}')sock.sendall(response)def echo_server(address, back_log=5):sock = socket(AF_INET, SOCK_STREAM)sock.bind(address)sock.listen(back_log)while True:sock_client, address = sock.accept()echo_handler(sock_client, address)if __name__ == '__main__':echo_server((’localhost’, 5000))

代碼詳解:

創(chuàng)建一個(gè)基于IPV4和TCP協(xié)議的Socket,這里AF_INET指的是使用IPV4協(xié)議,SOCK_STREAM指定使用面向流的TCP協(xié)議,綁定監(jiān)聽(tīng)端口,設(shè)置等待連接的最大數(shù)量 創(chuàng)建一個(gè)永久循環(huán),獲取客戶端請(qǐng)求的連接,accept()會(huì)等待并返回一個(gè)客戶端的連接; 連接建立后,等待客戶端數(shù)據(jù),接受完客戶端數(shù)據(jù),然后返回?cái)?shù)據(jù)給客戶端,最后關(guān)閉連接

存在的問(wèn)題:當(dāng)出現(xiàn)多個(gè)客戶端請(qǐng)求時(shí),由于是單個(gè)線程會(huì)發(fā)生阻塞的情況,所以如果需要多線程處理多個(gè)客戶端請(qǐng)求,可以這樣改;

from threading import Threadwhile True:client_sock, address = sock.accept()thread = Thread(target=echo_handler, args=(client_sock, address))thread.start()

這樣的話,就會(huì)在每個(gè)客戶端請(qǐng)求的時(shí)候,生成一個(gè)子線程然后處理請(qǐng)求;(但是存在一個(gè)問(wèn)題:當(dāng)突然大量請(qǐng)求連接,消耗系統(tǒng)資源達(dá)到上限后,很可能造成程序無(wú)法處理后續(xù)請(qǐng)求。)

socketserver模塊:

from socketserver import BaseRequestHandler, TCPServerclass EchoHandler(BaseRequestHandler): def handle(self):print('Got Connection From: %s' % str(self.client_address))while True: msg = self.request.recv(8192) if not msg:break self.request.send(msg)if __name__ == '__main__': server = TCPServer(('', 5000), EchoHandler) server.serve_forever()

from socketserver import StreamRequestHandler, TCPServer, ThreadingTCPServerimport timeclass EchoHandler(StreamRequestHandler): def handle(self):print('Got Connection Address: %s' % str(self.client_address))for line in self.rfile: print(line) self.wfile.write(bytes('hello {}'.format(line.decode(’utf-8’)).encode(’utf-8’)))if __name__ == '__main__': serv = ThreadingTCPServer(('', 5000), EchoHandler) serv.serve_forever()

代碼詳解:

處理多個(gè)客戶端,初始化一個(gè)ThreadingTCPServer實(shí)例; 設(shè)置綁定的IP地址和端口,以及處理類; 使用StreamRequestHandler(使用流的請(qǐng)求處理程序類,類似file-like對(duì)象,提供標(biāo)準(zhǔn)文件接口簡(jiǎn)化通信過(guò)程),重寫(xiě)里面的handle方法,獲取請(qǐng)求數(shù)據(jù),返回?cái)?shù)據(jù)給客戶端; TCP Socket客戶端

socket模塊:

# -*- coding: utf-8 -*-from socket import socket, AF_INET, SOCK_STREAMimport timedef request_handler():start_time = time.time()sock_client = socket(AF_INET, SOCK_STREAM)sock_client.connect((’localhost’, 5000))book_content = ''with open('send_books.txt', 'r') as f:book_content = f.read()content_list = book_content.split('n')for content in content_list:if content:sock_client.send((content).encode())time.sleep(2)response = sock_client.recv(8192)print(response)end_time = time.time()print('總共耗時(shí):', end_time-start_time)if __name__ == '__main__':request_handler()UDP Socket

Socket模塊:

from socket import socket, AF_INET, SOCK_DGRAMimport timedef time_server(address): sock = socket(AF_INET, SOCK_DGRAM) sock.bind(address) while True:msg, addr = sock.recvfrom(8192)print(’Get message from’, addr)resp = time.ctime()sock.sendto(resp.encode(’ascii’), addr)if __name__ == '__main__': time_server((’’, 5000))

代碼不詳解,和之前的差不多,注意不同的協(xié)議就完事了

客戶端測(cè)試:

from socket import socket, AF_INET, SOCK_DGRAMif __name__ == '__main__': s = socket(AF_INET, SOCK_DGRAM) s.sendto(b’hello’, (’localhost’, 5000)) text = s.recvfrom(8192) print(text)

socketserver模塊:

from socketserver import BaseRequestHandler, UDPServerimport timeclass TimeHandler(BaseRequestHandler): def handle(self):print('Got Connection %s'.format(str(self.client_address)))data = self.request[0]print(data)msg, sock = self.requestprint(msg)data = time.ctime()sock.sendto(data.encode(’ascii’), self.client_address)if __name__ == '__main__': u = UDPServer(('localhost', 9999), TimeHandler) u.serve_forever()

代碼不在贅述,如果需要多線程處理并發(fā)操作可以使用ThreadingUDPServer

總結(jié)

關(guān)于本篇介紹Python Socket編程,大都是皮毛,只是談到了Python實(shí)際處理socket的幾個(gè)模塊,關(guān)于socket底層方面的知識(shí)并未提及,先了解個(gè)大概,從實(shí)際使用方面出發(fā),在實(shí)際使用過(guò)程中結(jié)合計(jì)算機(jī)網(wǎng)絡(luò)知識(shí),能夠?qū)ocket在整個(gè)TCP/IP協(xié)議棧中的作用。

socket和socketserver模塊都可以用來(lái)編寫(xiě)網(wǎng)絡(luò)程序,不同的是socketserver省事很多,你可以專注業(yè)務(wù)邏輯,不用去理會(huì)socket的各種細(xì)節(jié),包括不限于多線程/多進(jìn)程,接收數(shù)據(jù),發(fā)送數(shù)據(jù),通信過(guò)程。

以上就是Python Socket編程詳解的詳細(xì)內(nèi)容,更多關(guān)于Python Socket編程的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩av不卡一区二区| 日韩深夜视频| 亚洲手机视频| 一区二区精品伦理...| 日韩avvvv在线播放| 日韩欧美在线精品| 欧美日韩伊人| 国产精品欧美大片| 麻豆久久一区| 日韩一区欧美| 国产精品呻吟| 亚洲精品在线国产| 日韩av一区二区三区四区| 18国产精品| 精品入口麻豆88视频| 国产91在线精品| 久久中文字幕二区| 99视频精品| 日韩一二三区在线观看| 免费在线观看精品| 青青青国产精品| 欧美专区一区| 韩国女主播一区二区三区| 国产成人精品三级高清久久91| 国产一区2区| 国产99精品| 蜜桃传媒麻豆第一区在线观看| 日韩午夜视频在线| 精品五月天堂| 欧美1级日本1级| 午夜精品影视国产一区在线麻豆| 国产一精品一av一免费爽爽| 国产videos久久| 欧美va天堂| 蜜桃久久精品一区二区| 欧美亚洲三级| 色网在线免费观看| 久久av在线| 免费观看亚洲天堂| 欧美国产91| 91嫩草精品| 涩涩av在线| 爽好多水快深点欧美视频| 国产精品一区高清| 丝袜美腿诱惑一区二区三区 | 国产精品麻豆成人av电影艾秋| 国产不卡精品在线| 日韩一区二区久久| 国产精品igao视频网网址不卡日韩| 97精品97| 91久久黄色| 久久丁香四色| 亚洲免费黄色| 国产精品magnet| 99国产成+人+综合+亚洲欧美| 国产精品免费不| 欧美.日韩.国产.一区.二区 | 丝瓜av网站精品一区二区| 国产精品视频一区二区三区四蜜臂 | 国产色99精品9i| 亚洲成人精品| 欧美日韩黄网站| 免费观看不卡av| 国产精品亚洲欧美一级在线| 99久久九九| 国产精品久久久网站| 欧美69视频| 精品中文在线| 日韩精品一卡二卡三卡四卡无卡| 久久精品国产福利| 伊人成人在线视频| 另类综合日韩欧美亚洲| 免费视频久久| 日本精品不卡| 久久久精品区| 日本不卡高清视频| 蜜桃视频欧美| 国产一区二区三区黄网站| 亚洲精品女人| 亚洲少妇自拍| 亚洲永久av| 久久av中文| 日韩在线麻豆| 亚洲欧洲午夜| 久久精品91| 国产精品一区二区三区四区在线观看| 99视频一区| 日韩三区免费| 福利一区二区三区视频在线观看| 日韩精品第一| 美女日韩在线中文字幕| 99久久夜色精品国产亚洲狼| 国产一区二区三区四区五区 | 成人影视亚洲图片在线| 欧美另类中文字幕| 亚洲精品成a人ⅴ香蕉片| 亚洲大全视频| 鲁鲁在线中文| 国产一区二区精品福利地址| 国产九九精品| 日韩国产在线观看| 日韩中文字幕无砖| 亚洲人成网站在线在线观看| 亚洲精品888| 欧美aa国产视频| 国产一区二区中文| 99精品小视频| 日韩毛片在线| 色综合www| 久久久国产亚洲精品| 97精品国产| 欧美国产偷国产精品三区| 国产日韩一区二区三区在线播放| 日本在线不卡视频| 日韩精品第一| 欧美视频久久| 日本不卡一二三区黄网| 一区二区三区国产盗摄| 亚洲图片久久| 日韩有码av| 日本精品久久| 国产精品欧美日韩一区| 国产精品白浆| 久久三级中文| 日韩国产综合| 久久五月天小说| 99视频精品全国免费| 亚洲不卡av不卡一区二区| 99视频精品全部免费在线视频| 播放一区二区| 亚洲经典在线| 亚洲精品极品| 久久国际精品| 欧美成a人片免费观看久久五月天| 国产亚洲久久| 欧美激情日韩| 91综合网人人| 久久国产影院| 尤物网精品视频| 中文字幕亚洲在线观看| 日本不卡一区二区| 国产精品亚洲人成在99www| 国产精品探花在线观看| 国产精品啊v在线| 91一区二区三区四区| 欧美中文一区二区| 蜜桃视频一区二区三区| 日韩有码av| 成人在线视频免费| 久久国产精品成人免费观看的软件| 欧美精品激情| 日本精品一区二区三区在线观看视频| 国产精品成人**免费视频| 日韩免费av| 亚洲一区二区三区在线免费| 国产精品一线| 日韩av福利| 在线亚洲观看| 日韩av在线播放中文字幕| 麻豆精品在线观看| 999久久久91| 日韩精品一区二区三区中文| 精品中文在线| 悠悠资源网久久精品| 91麻豆精品激情在线观看最新| 成人在线超碰| 999在线观看精品免费不卡网站| 欧美在线不卡| 婷婷成人在线| 日本成人一区二区| 麻豆视频在线观看免费网站黄| 欧美日韩视频| 人人爱人人干婷婷丁香亚洲| 国产精品99精品一区二区三区∴| 三级在线看中文字幕完整版| 爽爽淫人综合网网站| 精品国产三区在线| 99日韩精品| 久久中文字幕一区二区三区| 婷婷六月综合| 国产精品日本一区二区三区在线| 91精品推荐| 久久国产欧美日韩精品| 亚洲午夜在线| 91精品一区| 欧美理论视频| 美女精品视频在线| 丝袜美腿一区二区三区| 日本成人手机在线| 久久精品国产大片免费观看| 国产亚洲久久| 不卡在线一区| 精品视频在线观看网站| 国产精品三上| 久久精品国产久精国产爱| 久久av在线| 欧美成人a交片免费看| 久久国产三级| 午夜一级久久| 日韩在线欧美|