---引入
成都創新互聯公司成立于2013年,先為凌海等服務建站,凌海等地企業,進行企業商務咨詢服務。為凌海企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。Socket的英文原義是“孔”或“插座”,在Unix的進程通信機制中又稱為‘套接字’。套接字實際上并不復雜,它是由一個ip地址以及一個端口號組成。Socket正如其英文原意那樣,像一個多孔插座。一臺主機猶如布滿各種插座(ip地址)的房間,每個插座有很多插口(端口),通過這些插口接入電線(進程)我們可以燒水,看電視,玩電腦……
應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。
套接字的作用之一就是用來區分不同應用進程,當某個進程綁定了本機ip的某個端口,那么所有傳送至這個ip地址上的這個端口的所有數據都會被內核送至該進程進行處理。
---python中的socket
Python 提供了兩個基本的 socket 模塊。
第一個是 Socket,它提供了標準的 BSD Sockets API。
第二個是 SocketServer, 它提供了服務器中心類,可以簡化網絡服務器的開發。
----socket
先來說第一個。
我們知道,現在的應用程序大多為C/S架構,也就是分為客戶端/服務器端。
服務器端:服務器端進程需要申請套接字,然后自己綁定在這個套接字上,并對這個套接字進行監聽。當有客戶端發送數據了,則接受數據進行處理,處理完成后對客戶端進行響應。
客戶端:客戶端則相對簡單些,客戶端只需要申請一個套接字,然后通過這個套接字連接服務器端的套接字,連接建立后就可以進行后續操作了。
python編寫服務器端的步驟:
1 創建套接字
=
2 綁定套接字
s1.bind( address ) #由AF_INET所創建的套接字,address地址必須是一個雙元素元組,格式是(host,port)。host代表主機,port代表端口號。
#如果端口號正在使用、主機名不正確或端口已被保留,bind方法將引發socket.error異常。#例: ('192.168.1.1',9999)
3 監聽套接字
s1.listen( backlog ) #backlog指定最多允許多少個客戶連接到服務器。它的值至少為1。收到連接請求后,這些請求需要排隊,如果隊列滿,就拒絕請求。
4 等待接受連接
connection, address = s1.accept()#調用accept方法時,socket會時入“waiting”狀態,也就是處于阻塞狀態。客戶請求連接時,方法建立連接并返回服務器。#accept方法返回一個含有兩個元素的元組(connection,address)。 #第一個元素connection是所連接的客戶端的socket對象(實際上是該對象的內存地址),服務器必須通過它與客戶端通信; #第二個元素 address是客戶的Internet地址。
5 處理階段
connection.recv(bufsize[,flag])
#注意此處為connection#接受套接字的數據。數據以字符串形式返回,bufsize指定最多可以接收的數量。flag提供有關消息的其他信息,通常可以忽略connection.send(string[,flag])#將string中的數據發送到連接的套接字。返回值是要發送的字節數量,該數量可能小于string的字節大小。即:可能未將指定內容全部發送。
6 傳輸結束,關閉連接
s1.close()#關閉套接字
python編寫客戶端
1 創建socket對象
import socket s2=socket.socket()
2 連接至服務器端
s2.connect(address)#連接到address處的套接字。一般,address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤。
3 處理階段
s2.recv(bufsize[,flag])#接受套接字的數據。數據以字符串形式返回,bufsize指定最多可以接收的數量。flag提供有關消息的其他信息,通常可以忽略s2.send(string[,flag])#將string中的數據發送到連接的套接字。返回值是要發送的字節數量,該數量可能小于string的字節大小。即:可能未將指定內容全部發送。
4 連接結束,關閉套接字
s2.close()
socket中還有許多方法 :
socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) 10061=0, count=
好了,介紹完socket現在該介紹socketserver了。
----socketserver
雖說用Python編寫簡單的網絡程序很方便,但復雜一點的網絡程序還是用現成的框架比較 好。這樣就可以專心事務邏輯,而不是套接字的各種細節。SocketServer模塊簡化了編寫網絡服務程序的任務。同時SocketServer模塊也 是Python標準庫中很多服務器框架的基礎。
socketserver在python2中為SocketServer,在python3種取消了首字母大寫,改名為socketserver。
socketserver中包含了兩種類,一種為服務類(server class),一種為請求處理類(request handle class)。前者提供了許多方法:像綁定,監聽,運行…… (也就是建立連接的過程) 后者則專注于如何處理用戶所發送的數據(也就是事務邏輯)。
一般情況下,所有的服務,都是先建立連接,也就是建立一個服務類的實例,然后開始處理用戶請求,也就是建立一個請求處理類的實例。
我們分析一下源碼,來看一看服務類是如何與請求處理類建立聯系的。
== = = ===
我們接下來介紹一下這兩個類
先來看服務類:
5種類型:BaseServer,TCPServer,UnixStreamServer,UDPServer,UnixDatagramServer。
BaseServer不直接對外服務。
TCPServer針對TCP套接字流
UDPServer針對UDP數據報套接字
UnixStreamServer和UnixDatagramServer針對UNIX域套接字,不常用。
他們之間的繼承關系:
服務類的方法:
View Code
這個幾個服務類都是同步處理請求的:一個請求沒處理完不能處理下一個請求。要想支持異步模型,可以利用多繼承讓server類繼承ForkingMixIn 或 ThreadingMixIn mix-in classes。
ForkingMixIn利用多進程(分叉)實現異步。
ThreadingMixIn利用多線程實現異步。
請求處理器類:
要實現一項服務,還必須派生一個handler class請求處理類,并重寫父類的handle()方法。handle方法就是用來專門是處理請求的。該模塊是通過服務類和請求處理類組合來處理請求的。
SocketServer模塊提供的請求處理類有BaseRequestHandler,以及它的派生類StreamRequestHandler和DatagramRequestHandler。從名字看出可以一個處理流式套接字,一個處理數據報套接字。
請求處理類有三種方法:
setup
()
Called before the handle()
method to perform any initialization actions required. The default implementation does nothing.
也就是在handle()之前被調用,主要的作用就是執行處理請求之前的初始化相關的各種工作。默認不會做任何事。(如果想要讓其做一些事的話,就要程序員在自己的請求處理器中覆蓋這個方法(因為一般自定義的請求處理器都要繼承python中提供的BaseRequestHandler,ps:下文會提到的),然后往里面添加東西即可)
handle
()
This function must do all the work required to service a request. The default implementation does nothing. Several instance attributes are available to it; the request is available as self.request
; the client address as self.client_address
; and the server instance as self.server
, in case it needs access to per-server information.
The type of self.request
is different for datagram or stream services. For stream services,self.request
is a socket object; for datagram services, self.request
is a pair of string and socket.
handle()的工作就是做那些所有與處理請求相關的工作。默認也不會做任何事。他有數個實例參數:self.request self.client_address self.server
finish
()
Called after the handle()
method to perform any clean-up actions required. The default implementation does nothing. If setup()
raises an exception, this function will not be called.
在handle()方法之后會被調用,他的作用就是執行當處理完請求后的清理工作,默認不會做任何事
Handler源碼
從源碼中可以看出,BaseRequestHandler中的setup()/handle()/finish()什么內容都沒有定義,而他的兩個派生類StreamRequestHandler和DatagramRequestHandler則都重寫了setup()/finish()。
因此當我們需要自己編寫socketserver程序時,只需要合理選擇StreamRequestHandler和DatagramRequestHandler之中的一個作為父類,然后自定義一個請求處理類,并在其中重寫handle()方法即可。
用socketserver創建一個服務的步驟:
1 創建一個request handler class(請求處理類),合理選擇StreamRequestHandler和DatagramRequestHandler之中的一個作為父類(當然,使用BaseRequestHandler作為父類也可),并重寫它的handle()方法。
2 實例化一個server class對象,并將服務的地址和之前創建的request handler class傳遞給它。
3 調用server class對象的handle_request() 或 serve_forever()方法來開始處理請求。
另外有需要云服務器可以了解下創新互聯cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
新聞名稱:python基礎之socket與socketserver-創新互聯
文章起源:http://vcdvsql.cn/article38/cdjosp.html
成都網站建設公司_創新互聯,為您提供服務器托管、定制網站、標簽優化、電子商務、全網營銷推廣、小程序開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯