1. 程式人生 > >Python之路 - Socketserver實現多並發

Python之路 - Socketserver實現多並發

one other while 進程 sockets ket 開發 port ==

  • Python之路 - Socketserver實現多並發
    • 閱讀指引 ??
    • socketserver ??
    • 實現多並發 ??

閱讀指引 ??

在上面的整理篇章中 , 簡單的網絡編程基本已經會了 , 一個TCP , 一個UDP , 然後就是粘包問題

但是在上述中有一個問題 , 在現實生活中 , 一個服務端肯定常常需要同時服務好幾個客戶端 , 而上述篇章中並沒有實現一對多同時進行的情況 , TCP中只能等前一個鏈接斷開後續的才能連上 , 沒連上就一直等 ; UDP則是接一次發一次 , 並不能同時接兩次發兩次 . 為了處理這個問題 , 即實現並發 (後續文章詳細講解) , Python中有一個socketserver模塊可以滿足我們的要求

socketserver ??

Python提供了兩個級別訪問的網絡服務:

  1. 低級別的網絡服務支持基本的socket , 它提供了標準的BSD Socket API , 可以訪問底層操作系統Socket接口的全部方法
  2. 高級別的網絡服務模塊socketserver , 它提供了服務器中心類 , 可以簡化網絡服務器的開發

socket就不用說了 , now socketserver

我們知道基於TCP的套接字 , 關鍵就是兩個循環 , 一個鏈接循環(多人) , 一個通信循環(多消息)

在socketserver模塊中分為兩大類 : server類 (解決鏈接問題) 和request類 (解決通信問題)

如果想進一步了解 , 可以看看官方文檔 , < socketserver官方文檔 >

實現多並發 ??

multi_socketserver_server.py

import socketserver
class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        # 創建一個鏈接,繼承於socketserver中的BaseRequestHandler類
        conn = self.request
        # 發送登錄提示
        conn.sendall(b"Welcome to login...")
        print("Client connect...")
        while True:
            print("Waitting for recving message...")
            # 接收消息
            message = conn.recv(1024)
            print(message.decode(‘utf-8‘))
            # 收到exit就退出
            if message == "exit":
                break
            # 回復消息
            data = input("Reply message:")
            # 發送消息
            conn.sendall(data.encode(‘utf-8‘))
if __name__ == "__main__":
   # 實例化
    server = socketserver.ThreadingTCPServer((‘127.0.0.1‘, 999, ), MyServer)
    # 調用serve_forever方法
    server.serve_forever()
‘‘‘
def serve_forever(self, poll_interval=0.5):
    """
    Handle one request at a time until shutdown.
    Polls for shutdown every poll_interval seconds. Ignores
    self.timeout. If you need to do periodic tasks, do them in
    another thread.
    """
‘‘‘

multi_socketserver_client.py

# 就是一個簡單的TCP客戶端
import socket
sock = socket.socket()
# 連接服務端
sock.connect((‘127.0.0.1‘, 999, ))
login = sock.recv(1024)
print(login.decode(‘utf-8‘))
while True:
    message = input("Please input the message:").strip()
    if message == "exit":
        sock.sendall(b‘exit‘)
        break
    else:
        sock.sendall(message.encode(‘utf-8‘))
        print("Waitting for recving message...")
        data = sock.recv(1024)
        print(data.decode(‘utf-8‘))
sock.close()

到這裏 , 我們成功實現了多並發 , 多並發是什麽? 這就關系到操作系統中的進程和線程了 , 網絡編程既然是實現兩個進程間的通信 , 那麽就逃不過進程 , 線程等了

Python之路 - Socketserver實現多並發