检验客户端的合法性
server.py
client.py
socketserver的使用:实现并发多用户连接ftp服务器,上传文件
import socketserver import hashlib import subprocess import socket import struct import json # 实现并发,实现多人可连接使用 class Myserver(socketserver.BaseRequestHandler):#必须继承这个类 def handle(self):##这里是业务逻辑,这里的方法名必须是handle,只要用用户连接server,handle方法就执行了 print('有客户端连接进来了...') while True: try: file_info_json_pack_length = self.request.recv(4)# 之前的conn换做self.request file_info_json_unpack_length = struct.unpack('i', file_info_json_pack_length)[0] recv_file_info = self.request.recv(file_info_json_unpack_length) file_info = json.loads(recv_file_info.decode('utf-8')) file_name = file_info.get('file_name') file_size = file_info.get('file_size') action = file_info.get('action') all_recv_length = 0 print(all_recv_length) print(file_size) md5 = hashlib.md5() while all_recv_length < file_size: data = self.request.recv(1024) md5.update(data) with open(file_name, 'ab') as f: f.write(data) all_recv_length += len(data) print('文件总长为%s已经接收长度%s' % (file_size, all_recv_length)) self.request.send(md5.hexdigest().encode('utf-8')) except Exception as e: print('客户端断开连接:%s'%e) break #这步是初始化方法,bind绑定ip和端口,和listen(),TCP协议 # 1. 创建socket对象 2. self.socket.bind() 3. self.socket.listen(5) server=socketserver.ThreadingTCPServer(('192.168.0.105',9000),Myserver) # 多线程UDP协议用server=socketserver.ThreadingUDPServer(('192.168.0.105',9000),Myserver) # 多进程tcp并发并发用server=socketserver.ForkingTCPServer(('192.168.0.105',9000),Myserver) # 多进程udp并发并发用server=socketserver.ForkingUDPServer(('192.168.0.105',9000),Myserver) #调用accept() 接收连接 server.serve_forever()
# client.py import json import os import socket import struct import hashlib client=socket.socket() client.connect(('192.168.0.105',9000)) while True: cmd=input('>>>') action,file_name=cmd.strip().split(' ')# 执行的命令,和文件名 print(action,file_name) if not os.path.exists(file_name): print('你输入的文件不存在,请重新输入') continue file_size=os.path.getsize(file_name)# 文件大小 print('file_size',file_size) if action == 'put': print('文件%s正在传送...'%(file_name)) file_info={'action':action, 'file_name':file_name, 'file_size':file_size } file_info_json=json.dumps(file_info,ensure_ascii=False) # file_info_json字符串形式 file_info_json_length= len(file_info_json.encode('utf-8'))# file_info_json字符串形式的长度的bytes类型 file_info_json_pack = struct.pack('i',file_info_json_length) # 4位 client.send(file_info_json_pack) # 传送4位 client.send(file_info_json.encode('utf-8'))# 传送file_info的字节长度 client_md5 = hashlib.md5() with open('photo.jpg','rb') as f:# 传送文件 for i in f: client_md5.update(i) client.send(i) server_md5=client.recv(1024) if server_md5.decode('utf-8')==client_md5.hexdigest(): print('文件上传成功') else: print('文件上传失败')