Python之路 - Socketserver實現多並發
阿新 • • 發佈:2018-08-28
one other while 進程 sockets ket 開發 port ==
- Python之路 - Socketserver實現多並發
閱讀指引 ??
在上面的整理篇章中 , 簡單的網絡編程基本已經會了 , 一個TCP , 一個UDP , 然後就是粘包問題
但是在上述中有一個問題 , 在現實生活中 , 一個服務端肯定常常需要同時服務好幾個客戶端 , 而上述篇章中並沒有實現一對多同時進行的情況 , TCP中只能等前一個鏈接斷開後續的才能連上 , 沒連上就一直等 ; UDP則是接一次發一次 , 並不能同時接兩次發兩次 . 為了處理這個問題 , 即實現並發 (後續文章詳細講解) , Python中有一個socketserver模塊可以滿足我們的要求
socketserver ??
Python提供了兩個級別訪問的網絡服務:
- 低級別的網絡服務支持基本的socket , 它提供了標準的BSD Socket API , 可以訪問底層操作系統Socket接口的全部方法
- 高級別的網絡服務模塊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實現多並發