您的位置:首页 > 编程语言 > Python开发

Python3 socketserver 实现局域网通信

2017-07-03 14:42 471 查看
在本文中,将介绍如何利用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)


测试结果为:

服务端



客户端

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: