python基礎(chǔ)之socket與socketserver-創(chuàng)新互聯(lián)

---引入

成都創(chuàng)新互聯(lián)公司成立于2013年,先為凌海等服務(wù)建站,凌海等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為凌海企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

Socket的英文原義是“孔”或“插座”,在Unix的進程通信機制中又稱為‘套接字’。套接字實際上并不復(fù)雜,它是由一個ip地址以及一個端口號組成。Socket正如其英文原意那樣,像一個多孔插座。一臺主機猶如布滿各種插座(ip地址)的房間,每個插座有很多插口(端口),通過這些插口接入電線(進程)我們可以燒水,看電視,玩電腦……

應(yīng)用程序通常通過"套接字"向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。

套接字的作用之一就是用來區(qū)分不同應(yīng)用進程,當(dāng)某個進程綁定了本機ip的某個端口,那么所有傳送至這個ip地址上的這個端口的所有數(shù)據(jù)都會被內(nèi)核送至該進程進行處理。

---python中的socket

Python 提供了兩個基本的 socket 模塊。

  第一個是 Socket,它提供了標準的 BSD Sockets API。

  第二個是 SocketServer, 它提供了服務(wù)器中心類,可以簡化網(wǎng)絡(luò)服務(wù)器的開發(fā)。

----socket

  先來說第一個。

我們知道,現(xiàn)在的應(yīng)用程序大多為C/S架構(gòu),也就是分為客戶端/服務(wù)器端。

服務(wù)器端:服務(wù)器端進程需要申請?zhí)捉幼郑缓笞约航壎ㄔ谶@個套接字上,并對這個套接字進行監(jiān)聽。當(dāng)有客戶端發(fā)送數(shù)據(jù)了,則接受數(shù)據(jù)進行處理,處理完成后對客戶端進行響應(yīng)。

客戶端:客戶端則相對簡單些,客戶端只需要申請一個套接字,然后通過這個套接字連接服務(wù)器端的套接字,連接建立后就可以進行后續(xù)操作了。

python編寫服務(wù)器端的步驟:

  1 創(chuàng)建套接字

python基礎(chǔ)之socket與socketserver

=

python基礎(chǔ)之socket與socketserver

  2 綁定套接字

s1.bind( address ) 
#由AF_INET所創(chuàng)建的套接字,address地址必須是一個雙元素元組,格式是(host,port)。host代表主機,port代表端口號。
#如果端口號正在使用、主機名不正確或端口已被保留,bind方法將引發(fā)socket.error異常。#例: ('192.168.1.1',9999)

  3 監(jiān)聽套接字

s1.listen( backlog ) 
#backlog指定最多允許多少個客戶連接到服務(wù)器。它的值至少為1。收到連接請求后,這些請求需要排隊,如果隊列滿,就拒絕請求。

  4 等待接受連接

python基礎(chǔ)之socket與socketserver

connection, address = s1.accept()#調(diào)用accept方法時,socket會時入“waiting”狀態(tài),也就是處于阻塞狀態(tài)??蛻粽埱筮B接時,方法建立連接并返回服務(wù)器。#accept方法返回一個含有兩個元素的元組(connection,address)。
#第一個元素connection是所連接的客戶端的socket對象(實際上是該對象的內(nèi)存地址),服務(wù)器必須通過它與客戶端通信;
#第二個元素 address是客戶的Internet地址。

python基礎(chǔ)之socket與socketserver

  5 處理階段

python基礎(chǔ)之socket與socketserver

connection.recv(bufsize[,flag])
#注意此處為connection#接受套接字的數(shù)據(jù)。數(shù)據(jù)以字符串形式返回,bufsize指定最多可以接收的數(shù)量。flag提供有關(guān)消息的其他信息,通??梢院雎詂onnection.send(string[,flag])#將string中的數(shù)據(jù)發(fā)送到連接的套接字。返回值是要發(fā)送的字節(jié)數(shù)量,該數(shù)量可能小于string的字節(jié)大小。即:可能未將指定內(nèi)容全部發(fā)送。

python基礎(chǔ)之socket與socketserver

  6 傳輸結(jié)束,關(guān)閉連接

s1.close()#關(guān)閉套接字

python編寫客戶端

  1 創(chuàng)建socket對象

import socket
s2=socket.socket()

  2 連接至服務(wù)器端

s2.connect(address)#連接到address處的套接字。一般,address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤。

  3 處理階段

python基礎(chǔ)之socket與socketserver

s2.recv(bufsize[,flag])#接受套接字的數(shù)據(jù)。數(shù)據(jù)以字符串形式返回,bufsize指定最多可以接收的數(shù)量。flag提供有關(guān)消息的其他信息,通??梢院雎詓2.send(string[,flag])#將string中的數(shù)據(jù)發(fā)送到連接的套接字。返回值是要發(fā)送的字節(jié)數(shù)量,該數(shù)量可能小于string的字節(jié)大小。即:可能未將指定內(nèi)容全部發(fā)送。

python基礎(chǔ)之socket與socketserver

  4 連接結(jié)束,關(guān)閉套接字

s2.close()

socket中還有許多方法 :

python基礎(chǔ)之socket與socketserver

socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) 10061=0, count=

python基礎(chǔ)之socket與socketserver

好了,介紹完socket現(xiàn)在該介紹socketserver了。

----socketserver

雖說用Python編寫簡單的網(wǎng)絡(luò)程序很方便,但復(fù)雜一點的網(wǎng)絡(luò)程序還是用現(xiàn)成的框架比較 好。這樣就可以專心事務(wù)邏輯,而不是套接字的各種細節(jié)。SocketServer模塊簡化了編寫網(wǎng)絡(luò)服務(wù)程序的任務(wù)。同時SocketServer模塊也 是Python標準庫中很多服務(wù)器框架的基礎(chǔ)。

socketserver在python2中為SocketServer,在python3種取消了首字母大寫,改名為socketserver。

socketserver中包含了兩種類,一種為服務(wù)類(server class),一種為請求處理類(request handle class)。前者提供了許多方法:像綁定,監(jiān)聽,運行…… (也就是建立連接的過程) 后者則專注于如何處理用戶所發(fā)送的數(shù)據(jù)(也就是事務(wù)邏輯)。

一般情況下,所有的服務(wù),都是先建立連接,也就是建立一個服務(wù)類的實例,然后開始處理用戶請求,也就是建立一個請求處理類的實例。

我們分析一下源碼,來看一看服務(wù)類是如何與請求處理類建立聯(lián)系的。

python基礎(chǔ)之socket與socketserver

 == = =

     ===

python基礎(chǔ)之socket與socketserver

我們接下來介紹一下這兩個類

先來看服務(wù)類:

5種類型:BaseServer,TCPServer,UnixStreamServer,UDPServer,UnixDatagramServer。

BaseServer不直接對外服務(wù)。

TCPServer針對TCP套接字流

UDPServer針對UDP數(shù)據(jù)報套接字

UnixStreamServer和UnixDatagramServer針對UNIX域套接字,不常用。

他們之間的繼承關(guān)系:

python基礎(chǔ)之socket與socketserver

服務(wù)類的方法:

python基礎(chǔ)之socket與socketserver View Code

這個幾個服務(wù)類都是同步處理請求的:一個請求沒處理完不能處理下一個請求。要想支持異步模型,可以利用多繼承讓server類繼承ForkingMixIn 或 ThreadingMixIn mix-in classes。

ForkingMixIn利用多進程(分叉)實現(xiàn)異步。

ThreadingMixIn利用多線程實現(xiàn)異步。

請求處理器類:

要實現(xiàn)一項服務(wù),還必須派生一個handler class請求處理類,并重寫父類的handle()方法。handle方法就是用來專門是處理請求的。該模塊是通過服務(wù)類和請求處理類組合來處理請求的。

SocketServer模塊提供的請求處理類有BaseRequestHandler,以及它的派生類StreamRequestHandler和DatagramRequestHandler。從名字看出可以一個處理流式套接字,一個處理數(shù)據(jù)報套接字。

請求處理類有三種方法:

  • setup()

  • Called before the handle() method to perform any initialization actions required. The default implementation does nothing.

    也就是在handle()之前被調(diào)用,主要的作用就是執(zhí)行處理請求之前的初始化相關(guān)的各種工作。默認不會做任何事。(如果想要讓其做一些事的話,就要程序員在自己的請求處理器中覆蓋這個方法(因為一般自定義的請求處理器都要繼承python中提供的BaseRequestHandler,ps:下文會提到的),然后往里面添加?xùn)|西即可)

  • 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()的工作就是做那些所有與處理請求相關(guān)的工作。默認也不會做任何事。他有數(shù)個實例參數(shù):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()方法之后會被調(diào)用,他的作用就是執(zhí)行當(dāng)處理完請求后的清理工作,默認不會做任何事

python基礎(chǔ)之socket與socketserver Handler源碼

從源碼中可以看出,BaseRequestHandler中的setup()/handle()/finish()什么內(nèi)容都沒有定義,而他的兩個派生類StreamRequestHandler和DatagramRequestHandler則都重寫了setup()/finish()。

因此當(dāng)我們需要自己編寫socketserver程序時,只需要合理選擇StreamRequestHandler和DatagramRequestHandler之中的一個作為父類,然后自定義一個請求處理類,并在其中重寫handle()方法即可。

用socketserver創(chuàng)建一個服務(wù)的步驟:

1 創(chuàng)建一個request handler class(請求處理類),合理選擇StreamRequestHandler和DatagramRequestHandler之中的一個作為父類(當(dāng)然,使用BaseRequestHandler作為父類也可),并重寫它的handle()方法。

2 實例化一個server class對象,并將服務(wù)的地址和之前創(chuàng)建的request handler class傳遞給它。

3 調(diào)用server class對象的handle_request() 或 serve_forever()方法來開始處理請求。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

新聞名稱:python基礎(chǔ)之socket與socketserver-創(chuàng)新互聯(lián)
文章起源:http://bm7419.com/article38/cdjosp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、定制網(wǎng)站、標簽優(yōu)化、電子商務(wù)、全網(wǎng)營銷推廣小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管