Python數據報協議以及sockersever模塊的使用

一.基於UDP協議的套接字

UDP協議網絡

  UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無鏈接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,IETF RFC 768是UDP的正式規範。UDP在IP報文的協議號是17。UDP協議全稱是用戶數據報協議,在網絡中它與TCP協議同樣用於處理數據包,是一種無鏈接的協議。多線程

udp套接字簡單示例併發

udp服務端socket

import socket server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # SOCK_DGRAM基於UDP協議
server.bind(('127.0.0.1', 8765)) while True: data, client_addr = server.recvfrom(1024) print(data.decode('utf-8')) server.sendto(data.upper(), client_addr) server.close()

udp客戶端tcp

import socket client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#SOCK_DGRAM基於UDP協議

while True: msg = input(">>:").strip() client.sendto(msg.encode('utf-8'),('127.0.0.1',8765)) data,server_addr = client.recvfrom(1024) print(data.decode('utf-8'))

二.socketserver模塊的使用

  基於tcp的套接字,關鍵就是兩個循環,一個連接循環,一個通訊循環源碼分析

  socketserver模塊中分爲兩大類:server類(解決連接問題)和request類(解決通訊問題)spa

  server類:線程

  

  request類:code

  

  繼承關係:server

  

  

  

如下述代碼爲例,分析socketserver源碼:

ftpserver=socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)
ftpserver.serve_forever()

查找屬性的順序:ThreadingTCPServer->ThreadingMixIn->TCPServer->BaseServer

    1. 實例化獲得ftpserver,先找類ThreadingTCPServer的__init__,在TCPServer中找到,進而執行server_bind,server_active
    2. 找ftpserver下的serve_forever,在BaseServer中找到,進而執行self._handle_request_noblock(),該方法一樣是在BaseServer中
    3. 執行self._handle_request_noblock()進而執行request, client_address = self.get_request()(就是TCPServer中的self.socket.accept()),而後執行self.process_request(request, client_address)
    4. 在ThreadingMixIn中找到process_request,開啓多線程應對併發,進而執行process_request_thread,執行self.finish_request(request, client_address)
    5. 上述四部分完成了連接循環,本部分開始進入處理通信部分,在BaseServer中找到finish_request,觸發咱們本身定義的類的實例化,去找__init__方法,而咱們本身定義的類沒有該方法,則去它的父類也就是BaseRequestHandler中找....

源碼分析總結:

基於tcp的socketserver咱們本身定義的類中的

    1.   self.server即套接字對象
    2.   self.request即一個連接
    3.   self.client_address即客戶端地址

基於udp的socketserver咱們本身定義的類中的

    1.   self.request是一個元組(第一個元素是客戶端發來的數據,第二部分是服務端的udp套接字對象),如(b'adsf', <socket.socket fd=200, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>)
    2.   self.client_address即客戶端地址
相關文章
相關標籤/搜索