在本文中,將介紹如何利用python中的socketserver模塊來實現局域網通信,本文只介紹相應的方法而不介紹詳細的設計。
SocketServer簡化了網絡服務器的編寫。在進行socket創建時,使用SocketServer會大大減少創建的步驟,並且SocketServer使用了select它有4個類:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。這4個類是同步進行處理的,另外通過ForkingMixIn和ThreadingMixIn類來支持異步。
使用SocketServer的步驟簡介
- 首先,你必須創建一個請求處理類,它是BaseRequestHandler的子類並重載其handle()方法。也可以繼承自socketserver.StreamRequestHandler 或者socketserver.DatagramRequestHandler ;
- 實例化一個服務器類,傳入服務器的地址和請求處理程序類。
- 最後,調用handle_request()(一般是調用其他事件循環或者使用select())或serve_forever()。
代碼實現
服務端
# encoding: utf-8
'''
Created on 2017-7-3
@author: lzmwhu
'''
import socketserver
#繼承StreamRequestHandler類,並重寫其中的handle方法,該方法是在每個請求到來之後都會調用
class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler):
def handle(self):
#這裏是將傳進的數據加上Hello 之後再返回,繼承自StreamRequestHandler可以使用wfile這個類文件(file-like)對象
data = str(self.request.recv(1024), 'utf-8')
print(data)
data = bytes("Hello " + data, "utf-8")
self.wfile.write(data) #write()方法只能寫入bytes類型
#該類是實現多請求併發處理,只需要繼承socketserver.ThreadingMixIn即可,內部無需多加處理,採用默認方法。
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
if __name__ == "__main__":
#如果是在局域網內實現通信,則必須將地址綁定在該PC在局域網中的地址
#如果只是本機通信則爲"localhost"或者"127.0.0.1"即可
HOST, PORT = "192.128.26.129", 8081
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
with server:
server.serve_forever()
客戶端測試
# encoding: utf-8
'''
Created on 2017-5-7
@author: lmzwhu
'''
import socket
def client(ip, port, message):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((ip, port))
sock.sendall(bytes(message, 'utf-8'))
response = str(sock.recv(1024), 'utf-8')
print("Received: {}".format(response))
HOST, PORT = "192.168.26.129", 8081
for i in range(3):
message = input(">")
client(HOST, PORT, message)
測試結果爲:
服務端
客戶端