python网络编程内容_Python网络编程
本文要寫的內容也稱為Python套接字編程,并簡單介紹socketserver類。參考教程主要是《Python核心編程》。
首先,客戶端/服務器模型,客戶端向服務器發送請求,在請求合理的情況下,服務器返回客戶端需要的資源,這是此架構下的通信方式。
套接字:套接字是計算機網絡的數據結構,體現了通信端點的概念。在開始任何類型的通信之前,網絡應用必須創建套接字。可以將套接字比作電話插口,沒有它將無法進行通信。AF_INET 網絡套接字 是目前使用最廣泛的套接字。
套接字地址:一個網絡地址由主機-端口 對來組成;可以將套接字比作電話插口,那么主機名和 端口號就像是區號與電話號碼的組合。
PS:有效端口號范圍為0~65535,小于1024的端口號預留給了系統。
套接字分為面向連接的套接字和無連接的套接字
面向連接的通信提供序列化的,可靠的和不重復的數據交付,而沒有邊界記錄,這基本上意味著每條消息可以拆分成很多片段,并且每一條消息片段都確保能夠達到目的地,然后將它們按順序組合在一起,最后加將完整消息傳遞給正在等待的應用程序。
實現這種連接類型的主要協議是傳輸控制協議 TCP。創建TCP套接字,必須使用SOCK_STREAM作為套接字類型。
實例:
創建TCP服務器偽代碼如下:
sock = socket() #創建套接字
sock.bind() #將套接字與地址綁定
sock.listen() #監聽連接
loop: #服務器無限循環
csock = sock.accept() #接受客戶端連接
loop: #通信循環
cs.recv()/cs.send() #接收發送數據
cs.close() #關閉客戶端套接字
ss.close() #關閉服務器套接字
服務器示例代碼如下:
客戶端代碼示例如下:
無連接套接字是數據報類型的套接字,這意味著,在通信開始之前不需要建立連接。所以,在數據傳輸過程中并無法保證它的順序性,可靠性或重復性,而且還可能丟失信息。但它的優勢也是明顯的,比如開銷小,“成本低廉”。實現這種無連接類型的主要協議是用戶數據報協議UDP。必須使用SOCK_DGRAM作為套接字類型
創建UDP服務器的偽代碼如下:
sock.socket() #創建通信套接字
sock.bind() #將套接字與地址綁定
loop: #服務器無限循環
csock = sock.recvfrom()/sock.sendto() #接收發送數據
sock.close() #關閉服務器套接字
示例代碼如下:
socketserver模塊簡單介紹
這個模塊的不同之處在于,我們使用類來編寫應用程序。因為以面向對象的方式處理事物有助于組織數據,以及邏輯性地將功能放在正確的地方。應用程序是事件驅動的,這意味著只有在系統中的事件發生時,它們才會工作。
socketserver模塊有4個具體的類
class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True):使用TCP協議
class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True):使用UDP協議
class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True):只使用在UNIX平臺上
class socketserver.UnixDatagramServer(server_address, RequestHandlerClass, bind_and_activate=True):只使用在UNIX平臺上
這4個類的繼承關系如下:
這四個類是同步處理請求的,每一個請求必須在前一個請求完成后再開始。所以如果每個請求都花費大量的時間的話,因為需要進行大量計算,那么它們是不合適的。解決方案就是創建一個分開的進程或者線程去處理每個請求,ForkingMixIn和ThreadingMixIn混入類可以用作支持異步行為。
創建一個服務器需要以下幾步,首先,必須創建一個請求處理request handler類通過繼承BaseRequestHandler類并且重寫handler()方法。該方法將會處理進來的請求,第二步,必須繼承server類中的一個,并且將它和request handler類一起傳遞到服務器地址。然后調用服務器的handle_request()或者serve_forever()方法去處理一個或多個請求。最后調用server_close()關掉套接字
socketserver.BaseServer類是此模塊中服務器對象的超類,本身并不直接生成實例,而是通過派生關系,讓子類生產實例,它的子類,比如TCPServer,UDPServer。
請求處理對象
socketserver.BaseQequestHandler是超類,每個子類都必須定義一個新的handle()方法,它的兩個子類,StreamQequestHandler和DatagramQequestHandler.
示例代碼也就是python docs上的代碼:
需要注意的是,此片文章中,tcp的代碼調試通過了,udp和socketserver的代碼調試未通過,后續再努力
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python网络编程内容_Python网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一建机电实务教材电子版_2020一建教材
- 下一篇: onenetsim定位功能吗_经常玩手机