亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

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

Python Socket編程詳解

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

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

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

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

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

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

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

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

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

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

TCP Socket服務器的通信過程?

Server端:

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

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

Client端:

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

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

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

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

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

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

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

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

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

主流Web框架:Django、Flask

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

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

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

代碼設計

Python提供了基本的socket模塊:

socket模塊;提供了標準的BSD Sockets API; socketserver模塊:提供了服務器中心類,簡化服務器的開發(fā); 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))

代碼詳解:

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

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

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

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

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方法,獲取請求數(shù)據(jù),返回數(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('總共耗時:', 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é)議就完事了

客戶端測試:

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

總結

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

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

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

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 91好色视频 | 东京道区二区三区 | 亚洲美女视频一区 | 一级黄色绿像片 | 草草影院地址ccyycom浮力影院37 草草影院欧美 | 日本视频中文字幕一区二区 | 亚洲欧美另类日本久久影院 | 欧美黄成人免费网站大全 | 男女又黄又刺激黄a大片桃色 | 久久本道久久综合伊人 | 黄 在线 | 国产人妖性视频在线 | 欧美成人tv | 一级毛片免费观看视频 | 青青草国产精品久久久久 | 国产欧美日韩精品综合 | 免费看片子 | 深夜做爰性大片中文 | 欧美一级二级毛片视频 | 韩国精品一区二区三区四区五区 | 婷婷久久综合九色综合98 | 亚洲欧美中文日韩综合 | 国产亚洲精品国产第一 | 成年美女黄网站色大免费视频 | 91成人免费观看网站 | 中文字幕亚洲综合久久 | 欧美干色| 加勒比一本大道香蕉在线视频 | 亚洲美洲国产日产 | 亚洲国产日韩欧美在线a乱码 | 性视频亚洲| 网友自拍视频 | 国产11一12周岁女毛片 | 在线日本妇人成熟免费观看 | 国产福利一区二区三区视频在线 | 亚洲国产午夜看片 | 手机看片福利日韩国产 | 日韩黄色小视频 | 韩国主播vip福利视频在线播放 | 黄网站在线观看高清免费 | 清草在线视频精品 |