图3 客户端随机逻辑
客户端下载配置文件流程
客户端配置文件下载,并非直接的文件传输,而是服务器读取服务器存储的txt文件后传输文件内的数据,客户端将接收到的数据写入本地文件,以此来还原文件。
(1)建立Socket连接之前需要导入socket库:
import socket
(2)建立Socket连接:
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(HOST, PORT)
(3)通过向服务器发送特定的命令获取文件:
client_command = 'get ecplist_in_server.txt'
s.send(client_command.encode())
(4)从服务器接收数据并校验保存
data = s.recv(4096).decode()
为防止频繁读写硬盘,校验本地文件和服务器文件的版本号,若不同,则写文件
if data[3].strip('\n') != IPname:
f.write(data)
(5)数据校验并转移存储
本地的ecplist_in_server.txt和ecplist.txt对比,数据传输校验标识相同则表示数据完整可靠并且版本号不一致的情况下才更新本地ecplist.txt,满足如下条件:
IPnamefromserver.strip('\n')=="18661801660" and IPnamefromserver != IPname
服务器端功能简述
SocketServer是Python3标准库中一个高级别的模块,用于简化网络客户与服务器的实现。服务器端的实现主要使用Python3的SocketServer模块实现网络服务器功能,并利用其多线程技术解决服务器并发请求。
网络服务器的实现
首先要定义一个继承自基类BaseRequestHandler的处理程序类,然后BaseRequestHandler的实例MyRequestHandler可以实现以下方法。
(1)MyRequestHandler. setup()
在handle()之前进调用此方法进行初始化操作,提示进入处理线程。
(2)MyRequestHandler. handle()
收到客户端发出的get请求,读取文件并发送数据。
while True:
try:
data = self.request.recv(4096).decode()
print("get data:", data)
if not data:
print("break the connection!")
break
else:
action, filename = data.split()
if action == 'get':
self.sendfile(filename)
else:
print("get error!")
continue
except socket.timeout:
print ("caught socket.timeout exception")
(3)MyRequestHandler. finish()
完后handle()方法后调用此方法执行清除操作。
并发服务器的实现
host,port = '192.168.108.39’,8080
(2)实现了多线程的socket通话
server=socketserver.ThreadingTCPServer((host,port),Server)
(3)当一个客户端结束后继续运行,与其他的客户端继续进行通话
server.serve_forever()
客户端和服务器端的运行效果分别如下: