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

您的位置:首頁技術文章
文章詳情頁

Python Socket編程詳解

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

關于Python Socket編程,首先需要了解幾個計算機網絡的知識,通過以下的幾個問題,有助于更好的理解Socket編程的意義,以及整個框架方面的知識:

TCP和UDP協議本質上的區別?

TCP協議,面向連接,可靠,基于字節流的傳輸層通信協議;UDP協議無連接,不可靠,基于數據包的傳輸層協議。

TCP協議在建立連接的過程需要經歷三次握手,斷開連接則需要經歷四次揮手,而這建立連接的過程增加了傳輸過程中的安全性。而建立連接的過程則會消耗系統的資源,消耗更多的時間,而相比較UDP協議傳輸過程則不會出現這種問題。

總結來講,基于TCP協議傳輸,需要不斷的確認對方是否收到信息,從而建立連接(確認過程次數有限制,即三次握手),UDP協議傳輸則不需要確認接收端是否收到信息,只需要將信息發給對方。

TCP/IP協議棧、HTTP協議、Socket之間的區別和聯系?

TCP/IP協議棧就是一系列網絡協議,可以分為四層模型來分析:應用層、傳輸層、網絡層、鏈路層;

HTTP協議(超文本傳輸協議)就是在這一協議棧中的應用層協議;HTTP協議簡單來說,它的作用就是規范數據的格式,讓程序能夠方便的識別,并且收發雙方都需要遵循同樣的協議格式進行數據傳輸。(應用層的協議也和HTTP協議的作用類似,不一樣的是定義不同的數據格式。)

Socket可以理解為TCP/IP協議棧提供的對外的操作接口,即應用層通過網絡協議進行通信的接口。Socket可以使用不同的網絡協議進行端對端的通信;

TCP Socket服務器的通信過程?

Server端:

建立連接(socket()函數創建socket描述符、bind()函數綁定特定的監聽地址(ip+port)、listen()函數監聽socket、accept()阻塞等待客戶端連接)

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

Client端:

建立連接(socket()函數創建socket描述符、connect()函數向指定的監聽地址發送連接請求)

數據交互(wirte()函數發送服務端數據、read()函數足阻塞等待接受服務端發送的數據)

socket和websocket之間的聯系?

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

HTTP,WSGI協議的聯系和區別?

HTTP協議(超文本傳輸協議),屬于TCP/IP協議棧中應用層的協議。用于規范傳輸數據的格式,是一種客戶端和服務端傳輸的規則。

WSGI協議則是Python定義的Web服務器和框架程序通信的接口規則。兩者聯系不大,強行說的話,Python框架程序主要處理的是HTTP請求。

(后期可以實現一個WSGI協議的Python框架,用于處理HTTP請求的實驗。)

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

主流Web框架:Django、Flask

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

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

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

代碼設計

Python提供了基本的socket模塊:

socket模塊;提供了標準的BSD Sockets API; socketserver模塊:提供了服務器中心類,簡化服務器的開發; TCP Socket服務端

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))

代碼詳解:

創建一個基于IPV4和TCP協議的Socket,這里AF_INET指的是使用IPV4協議,SOCK_STREAM指定使用面向流的TCP協議,綁定監聽端口,設置等待連接的最大數量 創建一個永久循環,獲取客戶端請求的連接,accept()會等待并返回一個客戶端的連接; 連接建立后,等待客戶端數據,接受完客戶端數據,然后返回數據給客戶端,最后關閉連接

存在的問題:當出現多個客戶端請求時,由于是單個線程會發生阻塞的情況,所以如果需要多線程處理多個客戶端請求,可以這樣改;

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

這樣的話,就會在每個客戶端請求的時候,生成一個子線程然后處理請求;(但是存在一個問題:當突然大量請求連接,消耗系統資源達到上限后,很可能造成程序無法處理后續請求。)

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()

代碼詳解:

處理多個客戶端,初始化一個ThreadingTCPServer實例; 設置綁定的IP地址和端口,以及處理類; 使用StreamRequestHandler(使用流的請求處理程序類,類似file-like對象,提供標準文件接口簡化通信過程),重寫里面的handle方法,獲取請求數據,返回數據給客戶端; 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('總共耗時:', 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))

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

客戶端測試:

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()

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

總結

關于本篇介紹Python Socket編程,大都是皮毛,只是談到了Python實際處理socket的幾個模塊,關于socket底層方面的知識并未提及,先了解個大概,從實際使用方面出發,在實際使用過程中結合計算機網絡知識,能夠對socket在整個TCP/IP協議棧中的作用。

socket和socketserver模塊都可以用來編寫網絡程序,不同的是socketserver省事很多,你可以專注業務邏輯,不用去理會socket的各種細節,包括不限于多線程/多進程,接收數據,發送數據,通信過程。

以上就是Python Socket編程詳解的詳細內容,更多關于Python Socket編程的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
黄色精品视频| 日本成人在线视频网站| 国产日韩亚洲| 日产欧产美韩系列久久99| 伊人www22综合色| 免费视频亚洲| 欧美日韩在线二区| 一区二区三区视频免费观看| 久久久久久久久久久妇女| 日韩成人精品一区| xxxxx性欧美特大| 亚洲福利专区| 久热re这里精品视频在线6| 亚洲精品福利| 国产精品一国产精品k频道56| 国产亚洲一区二区三区不卡| 国产精品久久久久久久久久妞妞| 国产劲爆久久| 国产aⅴ精品一区二区三区久久| 都市激情国产精品| 另类专区亚洲| 成人av二区| 在线国产日韩| 国产丝袜一区| 国产一区二区三区91| 久久久精品午夜少妇| 夜夜嗨一区二区三区| 日韩精品一区二区三区av| 欧美激情日韩| 91精品韩国| 免费国产亚洲视频| 国产精品久久久久久妇女| 六月婷婷综合| 男人天堂欧美日韩| 欧美影院精品| 卡一卡二国产精品| 午夜av不卡| 丝袜亚洲另类欧美| 国产精品久久久久久久久久白浆| 国产精品亚洲一区二区三区在线观看| 99成人在线| 国产精品久久久久久模特| 久久三级视频| 日韩一区免费| 97精品视频在线看| 手机精品视频在线观看| 欧美黑人做爰爽爽爽| 99成人超碰| 91麻豆精品| 欧洲av一区二区| 美国三级日本三级久久99| 国产精品自拍区| 亚洲a在线视频| 欧美在线黄色| 亚洲夜间福利| 久久99偷拍| 视频在线观看一区二区三区| 久久精品一本| 亚洲天堂免费| 日韩在线观看一区| 91成人在线网站| 欧美搞黄网站| 国产精品久久777777毛茸茸| 99热精品久久| 国产精品一二| 五月精品视频| 国产高清亚洲| 亚洲欧美日本视频在线观看| 欧美私人啪啪vps| 久久高清免费| 国产精品一区二区精品视频观看 | 国产一区二区三区亚洲综合| 国产精品婷婷| 伊人久久视频| 日韩精品中文字幕一区二区| 久久婷婷av| 九九99久久精品在免费线bt| 亚洲有吗中文字幕| 欧美~级网站不卡| 国产一区二区三区四区| 亚洲精品麻豆| 亚洲国产日韩欧美在线| 国产成人免费精品| 91p九色成人| 久久国产精品亚洲77777| 日韩一区自拍| 精品视频高潮| 国产麻豆精品| 日韩超碰人人爽人人做人人添| 欧美一区二区三区高清视频| 精品视频97| 国产精品视频一区二区三区 | 国产一区清纯| 久久久久久自在自线| 国产欧美精品| 日韩欧美中文字幕在线视频| 99国产精品久久久久久久| 日韩不卡免费高清视频| 国产欧美自拍| 日韩va欧美va亚洲va久久| 老色鬼久久亚洲一区二区| 欧美一区三区| 亚洲成人国产| 视频福利一区| 91偷拍一区二区三区精品| 国产精品成人3p一区二区三区| 婷婷亚洲成人| 亚洲精品在线二区| 日韩有吗在线观看| 视频一区日韩精品| 日本中文字幕不卡| 亚洲人成毛片在线播放女女| 亚洲综合日本| 久久亚洲视频| 鲁大师影院一区二区三区| 亚洲激情精品| 99在线精品免费视频九九视| 亚洲精品一区二区妖精| 136国产福利精品导航网址| 亚洲播播91| 青青久久av| 99视频精品全国免费| 婷婷成人在线| 一区在线免费观看| 久久都是精品| 日韩一区二区三区在线看| 日韩国产成人精品| 国产亚洲欧美日韩在线观看一区二区| 日韩精品久久理论片| 日韩三级久久| 国产精品日韩精品在线播放| 久久的色偷偷| аⅴ资源天堂资源库在线| 伊伊综合在线| 成人久久久久| 亚洲成人精品| 欧美国产美女| 久久伦理在线| 首页亚洲欧美制服丝腿| 亚洲欧美网站在线观看| 亚洲91在线| 国产欧美一区| 精品女同一区二区三区在线观看| 不卡福利视频| 国产精品av久久久久久麻豆网| 国产偷自视频区视频一区二区| 久久国产高清| 国产欧美午夜| 亚洲最新无码中文字幕久久 | 9国产精品视频| 一区二区高清| 国产精品66| 久久国产中文字幕| 亚洲欧美日韩专区| 日韩精品1区2区3区| 精品视频高潮| 1024精品久久久久久久久| 麻豆亚洲精品| 久久精品凹凸全集| 国产va在线视频| 亚洲免费观看| 欧美日本二区| 视频小说一区二区| 亚洲日产国产精品| 国产专区精品| 久久亚洲精品伦理| 久久精品三级| 六月婷婷一区| 久久中文在线| 久久国产高清| 国产成人精品一区二区免费看京 | 爽好久久久欧美精品| 国产精品扒开腿做爽爽爽软件| 综合日韩av| 亚洲欧洲日韩| 亚洲天堂av影院| 四虎精品永久免费| 日韩欧美不卡| 日韩精品一区二区三区免费视频 | 日本亚洲最大的色成网站www| 国产一区二区三区不卡av| 欧美另类综合| 欧美日韩伊人| 亚洲二区免费| 国产精品观看| 丝袜国产日韩另类美女| 水蜜桃久久夜色精品一区| 中文一区一区三区免费在线观| 久久99国产精品视频| 好吊日精品视频| 麻豆精品国产91久久久久久| 性色一区二区| 日韩伦理在线一区| 欧美欧美黄在线二区| 欧美a级片一区| 精品视频一区二区三区在线观看 | 日韩精品一区二区三区免费视频 | 欧美13videosex性极品| 日韩高清一级| 欧美日韩精品免费观看视频完整|