Python3 socketserver 實現局域網通信

在本文中,將介紹如何利用python中的socketserver模塊來實現局域網通信,本文只介紹相應的方法而不介紹詳細的設計。

SocketServer簡化了網絡服務器的編寫。在進行socket創建時,使用SocketServer會大大減少創建的步驟,並且SocketServer使用了select它有4個類:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。這4個類是同步進行處理的,另外通過ForkingMixIn和ThreadingMixIn類來支持異步。

使用SocketServer的步驟簡介

  1. 首先,你必須創建一個請求處理類,它是BaseRequestHandler的子類並重載其handle()方法。也可以繼承自socketserver.StreamRequestHandler 或者socketserver.DatagramRequestHandler ;
  2. 實例化一個服務器類,傳入服務器的地址和請求處理程序類。
  3. 最後,調用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)

測試結果爲:
服務端
這裏寫圖片描述
客戶端
客服端結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章