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

---引入

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

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

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

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

---python中的socket

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

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

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

----socket

  先來說第一個。

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

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

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

python編寫服務器端的步驟:

  1 創(chuàng)建套接字

python基礎之socket與socketserver

=

python基礎之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指定最多允許多少個客戶連接到服務器。它的值至少為1。收到連接請求后,這些請求需要排隊,如果隊列滿,就拒絕請求。

  4 等待接受連接

python基礎之socket與socketserver

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

python基礎之socket與socketserver

  5 處理階段

python基礎之socket與socketserver

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

python基礎之socket與socketserver

  6 傳輸結束,關閉連接

s1.close()#關閉套接字

python編寫客戶端

  1 創(chuàng)建socket對象

import socket
s2=socket.socket()

  2 連接至服務器端

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

  3 處理階段

python基礎之socket與socketserver

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

python基礎之socket與socketserver

  4 連接結束,關閉套接字

s2.close()

socket中還有許多方法 :

python基礎之socket與socketserver

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

python基礎之socket與socketserver

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

----socketserver

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

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

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

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

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

python基礎之socket與socketserver

 == = =

     ===

python基礎之socket與socketserver

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

先來看服務類:

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

BaseServer不直接對外服務。

TCPServer針對TCP套接字流

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

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

他們之間的繼承關系:

python基礎之socket與socketserver

服務類的方法:

python基礎之socket與socketserver View Code

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

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

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

請求處理器類:

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

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

請求處理類有三種方法:

  • setup()

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

    也就是在handle()之前被調用,主要的作用就是執(zhí)行處理請求之前的初始化相關的各種工作。默認不會做任何事。(如果想要讓其做一些事的話,就要程序員在自己的請求處理器中覆蓋這個方法(因為一般自定義的請求處理器都要繼承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()的工作就是做那些所有與處理請求相關的工作。默認也不會做任何事。他有數(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()方法之后會被調用,他的作用就是執(zhí)行當處理完請求后的清理工作,默認不會做任何事

python基礎之socket與socketserver Handler源碼

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

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

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

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

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

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

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

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

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

廣告

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

綿陽服務器托管