日韩 亚洲一区二_久久vs国产综合色大全_国产精品福利在线_欧美在线一级A片免费观看欧美在线_女同性毛片60分钟

您現(xiàn)在所在的位置:首頁(yè) >學(xué)習(xí)資源 > Python全棧+人工智慧入門(mén)教材 > Python基礎(chǔ)入門(mén)教程30.4:企業(yè)級(jí)開(kāi)發(fā)進(jìn)階 服務(wù)端快捷開(kāi)發(fā)

Python基礎(chǔ)入門(mén)教程30.4:企業(yè)級(jí)開(kāi)發(fā)進(jìn)階 服務(wù)端快捷開(kāi)發(fā)

來(lái)源:奇酷教育 發(fā)表於:

前面的內(nèi)容中已經(jīng)介紹了TCP編程和UDP編程實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)的通信和共享我們可以看到客戶(hù)端程序的編寫(xiě)相對(duì)容易,主需要連接服務(wù)端然後跟服務(wù)端進(jìn)

前面的內(nèi)容中已經(jīng)介紹了TCP編程和UDP編程實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)的通信和共享

我們可以看到客戶(hù)端程序的編寫(xiě)相對(duì)容易,主需要連接服務(wù)端然後跟服務(wù)端進(jìn)行數(shù)據(jù)交互就OK了。但是服務(wù)端的程序編寫(xiě)較為複雜,如果考慮到數(shù)據(jù)的並發(fā)處理等各種問(wèn)題,就更加複雜難以操作了。

python提供了一個(gè)socketserver模塊,可以用於更加快捷的構(gòu )建我們需要的服務(wù)端環(huán)境

本節(jié)內(nèi)容

  1. socketserver模塊簡(jiǎn)介
  2. 常規(guī)模式服務(wù)端編程
  3. 併發(fā)模式服務(wù)端編程

1. socketserver模塊簡(jiǎn)介

  • socketserver是什麼?
    socketserver模塊時(shí)python提供的內(nèi)置的用於快捷開(kāi)發(fā)服務(wù)端程序的一個(gè)伺服器框架,通過(guò)封裝大量實(shí)現(xiàn)的方式減少開(kāi)發(fā)人員工作量的同時(shí)能快捷開(kāi)發(fā)出具有較高質(zhì)量的服務(wù)端程序。

  • socketserver中提供了什麼?
    socketserver模塊主要包含的伺服器類(lèi):TCPserver、UCPserver、ThreadingTCPserver、ThreadingUDPserver、ForkingTCPserver、ForkingUDPserver
    注意:上述TCP表示TCP服務(wù)端編程需要的服務(wù)類(lèi),UDP表示UDP編程需要的服務(wù)類(lèi),包含Threading的表示多線(xiàn )程並發(fā)需要的服務(wù)類(lèi);包含Forking的表示多進(jìn)程並發(fā)需要的服務(wù)類(lèi)
    關(guān)於多線(xiàn )程和多進(jìn)程,後面的章節(jié)中會(huì)詳細(xì)介紹

  • socketserver核心操作?
    socketserver框架中,服務(wù)端的處理類(lèi)主要有StreamRequestHandler(基於TCP協(xié)議的)、DatagramRequestHandler(基於UDP協(xié)議的),處理類(lèi)中非常重要的一個(gè)方法headler()用來(lái)執(zhí)行服務(wù)端程序中的核心操作

    
    class mytcpserver(socketserver.StreamRequestHandler):
    
      def handle(self):
    
          # 伺服器中的核心操作代碼
  • socketserver中的結(jié)構(gòu )?
    socketserver中主要包含兩(liǎng)部分:伺服器和處理類(lèi)
    服務(wù)類(lèi)就是socketserver提供了內(nèi)置服務(wù)類(lèi),如TCPserver、UDPserver等等
    處理類(lèi)就是我們自定義的處理類(lèi),處理類(lèi)中會(huì)包含handle()方法用於業(yè)務(wù)處理

2. 服務(wù)端編程

2.1. TCP服務(wù)端編程

使用socketserver編寫(xiě)服務(wù)端程序如下:


import socketserver





# 自定義處理類(lèi)

class myTcp(socketserver.StreamRequestHandler):

    # 定義處理方法

    def handle(self):

        # 通過(guò)client_address屬性查看連接進(jìn)來(lái)的伺服器

        print("連接上的伺服器:%s" % str(self.client_address))

        while True:

            # 接收客戶(hù)端發(fā)送的數(shù)據(jù)

            msg = self.request.recv(1024)

            if not msg:

                break;

            print("客戶(hù)端發(fā)過(guò)來(lái)消息:%s" % msg.decode("UTF-8"))

            # 給客戶(hù)端返回接收信息

            self.request.sendall("已經(jīng)成功接收您發(fā)送的消息".encode("UTF-8"))





# 程序從主線(xiàn )程直接運(yùn)行

if __name__ == "__main__":

    # 創(chuàng)建服務(wù)端對(duì)象,指定處理類(lèi),並監(jiān)聽8888埠

    server = socketserver.TCPServer(('', 8888), myTcp)

    # 啟動(dòng)服務(wù)端程序

    server.serve_forever()

此時(shí),我們使用常規(guī)模式開(kāi)發(fā)客戶(hù)端程序如下:


import socket



sc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)



sc.connect(("192.168.10.108", 8888))



while True:

    msg = input("請輸(shū)入要發(fā)送的內(nèi)容:")

    if not msg or msg == "exit":

        break

    sc.sendall(msg.encode("UTF-8"))

    msg = sc.recv(1024)

    print("伺服器回應(yīng):" + msg.decode("UTF-8"))



sc.close()

運(yùn)行上述程序,就可以和之前一樣,實(shí)現(xiàn)客戶(hù)端和服務(wù)端之間的數(shù)據(jù)通信了;
和以前不一樣的時(shí),此時(shí)我們如果關(guān)閉了客戶(hù)端,服務(wù)端程序還是在運(yùn)行的,如果重新啟動(dòng)客戶(hù)端,客戶(hù)端又會(huì)接入服務(wù)端,重新建立連接並通信。

2.2. UDP服務(wù)端編程

使用socketserver的UDPServer服務(wù)類(lèi)和DatagramRequestHandler處理類(lèi)進(jìn)行服務(wù)端的編程處理如下:


import socketserver



# 創(chuàng)建自定義處理類(lèi)

class myUdp(socketserver.DatagramRequestHandler):

    # 創(chuàng)建自定義處理方法

    def handle(self):

        # 列印連接進(jìn)來(lái)的客戶(hù)端信息

        print("連接到伺服器的主機(jī):" + str(self.client_address))



        # 收發(fā)消息

        while True:

            # 接收客戶(hù)端發(fā)送的消息

            # msg = self.request.recv()

            msg = self.rfile.readline()

            if not msg:

                break

            print("接受到客戶(hù)端發(fā)送的消息:%s" % msg.decode("UTF-8"))

            # 發(fā)送消息

            self.wfile.write("接收到您發(fā)送的消息".encode("UTF-8"))

# 主模塊線(xiàn )程中運(yùn)行程序

if __name__ == "__main__":

    # 創(chuàng)建UDP伺服器對(duì)象

    server = socketserver.UDPServer(("", 8989), myUdp)

    # 啟動(dòng)UDP伺服器

    server.serve_forever()

使用常規(guī)的方式開(kāi)發(fā)UDP客戶(hù)端代碼如下:


import socket



sc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)



while True:

    data = input("請輸(shū)入要發(fā)送的消息:")

    if not data or data == "exit":

        break



    sc.sendto(data.encode("UTF-8"), ("192.168.10.108", 8989))



    data,recv = sc.recvfrom(1024)

    if not data:

        break

    print("伺服器返回消息:" + data.decode("UTF-8"))



sc.close()

此時(shí)啟動(dòng)服務(wù)端程序,啟動(dòng)客戶(hù)端程序,就可以實(shí)現(xiàn)服務(wù)端和客戶(hù)端時(shí)間的數(shù)據(jù)通信了。
另外:你可以試試啟動(dòng)多個(gè)客戶(hù)端程序看看,有彩蛋哦。

3. 服務(wù)端並發(fā)

關(guān)於使用多線(xiàn )程或者多進(jìn)程並發(fā)的方式也是比較簡(jiǎn)單的,參考代碼如下,如果有興趣的話(huà),等學(xué)習(xí)完並發(fā)編程之後,可以再回過(guò)頭看看ThreadingTCPServer和ForkingTCPServer這樣多線(xiàn )程和多進(jìn)程並發(fā)的操作哦
服務(wù)端參考代碼:


import socketserver



class myTcp(socketserver.StreamRequestHandler):

    def handle(self):

        while True:

            data = self.request.recv(1024)

            print("接收到數(shù)據(jù):" + data.decode("UTF-8"))

            self.request.sendall("數(shù)據(jù)已經(jīng)接收成功".encode("UTF-8"))



if __name__ == "__main__":

    server = socketserver.ThreadingTCPServer(("", 9000), myTcp)

    server.serve_forever()

客戶(hù)端還是常規(guī)的客戶(hù)端


import socket



sc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)



sc.connect(("192.168.10.108", 9000))



while True:

    msg = input("請輸(shū)入要發(fā)送的內(nèi)容:")

    if not msg or msg == "exit":

        break

    sc.sendall(msg.encode("UTF-8"))

    msg = sc.recv(1024)

    print("伺服器回應(yīng):" + msg.decode("UTF-8"))



sc.close()



>>>更多VR/AR入門(mén)教程:VR入門(mén)