国产成+人+综合+亚洲 欧美-国产成+人+综合+亚洲专-国产成+人欧美+综合在线观看-国产成a人片在线观看视频-国产成a人片在线观看视频99-国产成a人片在线观看视频下载

您現(xiàn)在所在的位置:首頁 >學習資源 > Python全棧+人工智能入門教材 > Python基礎入門教程30.4:企業(yè)級開發(fā)進階 服務端快捷開發(fā)

Python基礎入門教程30.4:企業(yè)級開發(fā)進階 服務端快捷開發(fā)

來源:奇酷教育 發(fā)表于:

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

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

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

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

本節(jié)內容

  1. socketserver模塊簡介
  2. 常規(guī)模式服務端編程
  3. 并發(fā)模式服務端編程

1. socketserver模塊簡介

  • socketserver是什么?
    socketserver模塊時python提供的內置的用于快捷開發(fā)服務端程序的一個服務器框架,通過封裝大量實現(xiàn)的方式減少開發(fā)人員工作量的同時能快捷開發(fā)出具有較高質量的服務端程序。

  • socketserver中提供了什么?
    socketserver模塊主要包含的服務器類:TCPserver、UCPserver、ThreadingTCPserver、ThreadingUDPserver、ForkingTCPserver、ForkingUDPserver
    注意:上述TCP表示TCP服務端編程需要的服務類,UDP表示UDP編程需要的服務類,包含Threading的表示多線程并發(fā)需要的服務類;包含F(xiàn)orking的表示多進程并發(fā)需要的服務類
    關于多線程和多進程,后面的章節(jié)中會詳細介紹

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

    class mytcpserver(socketserver.StreamRequestHandler):
      def handle(self):
          # 服務器中的核心操作代碼
  • socketserver中的結構?
    socketserver中主要包含兩部分:服務器和處理類
    服務類就是socketserver提供了內置服務類,如TCPserver、UDPserver等等
    處理類就是我們自定義的處理類,處理類中會包含handle()方法用于業(yè)務處理

2. 服務端編程

2.1. TCP服務端編程

使用socketserver編寫服務端程序如下:

import socketserver


# 自定義處理類
class myTcp(socketserver.StreamRequestHandler):
    # 定義處理方法
    def handle(self):
        # 通過client_address屬性查看連接進來的服務器
        print("連接上的服務器:%s" % str(self.client_address))
        while True:
            # 接收客戶端發(fā)送的數(shù)據(jù)
            msg = self.request.recv(1024)
            if not msg:
                break;
            print("客戶端發(fā)過來消息:%s" % msg.decode("UTF-8"))
            # 給客戶端返回接收信息
            self.request.sendall("已經(jīng)成功接收您發(fā)送的消息".encode("UTF-8"))


# 程序從主線程直接運行
if __name__ == "__main__":
    # 創(chuàng)建服務端對象,指定處理類,并監(jiān)聽8888端口
    server = socketserver.TCPServer(('', 8888), myTcp)
    # 啟動服務端程序
    server.serve_forever()

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

import socket

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

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

while True:
    msg = input("請輸入要發(fā)送的內容:")
    if not msg or msg == "exit":
        break
    sc.sendall(msg.encode("UTF-8"))
    msg = sc.recv(1024)
    print("服務器回應:" + msg.decode("UTF-8"))

sc.close()

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

2.2. UDP服務端編程

使用socketserver的UDPServer服務類和DatagramRequestHandler處理類進行服務端的編程處理如下:

import socketserver

# 創(chuàng)建自定義處理類
class myUdp(socketserver.DatagramRequestHandler):
    # 創(chuàng)建自定義處理方法
    def handle(self):
        # 打印連接進來的客戶端信息
        print("連接到服務器的主機:" + str(self.client_address))

        # 收發(fā)消息
        while True:
            # 接收客戶端發(fā)送的消息
            # msg = self.request.recv()
            msg = self.rfile.readline()
            if not msg:
                break
            print("接受到客戶端發(fā)送的消息:%s" % msg.decode("UTF-8"))
            # 發(fā)送消息
            self.wfile.write("接收到您發(fā)送的消息".encode("UTF-8"))
# 主模塊線程中運行程序
if __name__ == "__main__":
    # 創(chuàng)建UDP服務器對象
    server = socketserver.UDPServer(("", 8989), myUdp)
    # 啟動UDP服務器
    server.serve_forever()

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

import socket

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

while True:
    data = input("請輸入要發(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()

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

3. 服務端并發(fā)

關于使用多線程或者多進程并發(fā)的方式也是比較簡單的,參考代碼如下,如果有興趣的話,等學習完并發(fā)編程之后,可以再回過頭看看ThreadingTCPServer和ForkingTCPServer這樣多線程和多進程并發(fā)的操作哦
服務端參考代碼:

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()

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

import socket

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

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

while True:
    msg = input("請輸入要發(fā)送的內容:")
    if not msg or msg == "exit":
        break
    sc.sendall(msg.encode("UTF-8"))
    msg = sc.recv(1024)
    print("服務器回應:" + msg.decode("UTF-8"))

sc.close()

>>>更多VR/AR入門教程:VR入門
 
主站蜘蛛池模板: 久草在线观看视频 | 91国内精品久久久久影院优播 | 色综合久久精品中文字幕首页 | 国产女主播喷出白浆视频 | 免费一级a毛片免费观看欧美大片 | 亚洲欧美专区精品久久 | 亚洲qingse | 久久99国产精品 | 久久国产精品永久免费网站 | 午夜亚洲国产理论秋霞 | 日本特级黄色录像 | 午夜影院免费体验区 | 亚洲三级视频在线 | 日韩毛片| 超清中文乱码字幕在线观看 | 国产在线欧美精品中文一区 | 噜噜啪 | 玖玖精品在线观看 | 一级做a爱片久久蜜桃 | a拍拍男女免费看全片 | 第一色区| 伊人精品在线观看 | 人成午夜 | 精品国产一区二区三区免费 | 久久国产热这里只有精品8 久久国产三级 | 欧美性色xo在线 | 在线精品中文字幕福利视频 | 国产亚洲免费观看 | 欧美日韩亚洲国产精品 | 国产精品偷伦视频免费观看的 | 曰本人一级毛片免费完整视频 | 99热成人精品国产免国语的 | 国产激情小视频 | 91在线视频免费91 | 国产成人亚洲精品无广告 | 亚洲狠狠狠一区二区三区 | 欧美亚洲一区二区三区四 | 国产成人18黄网站麻豆 | 国产精品成人一区二区三区 | 中文字幕在线免费看 | 国内精品伊人久久大香线焦 |