简单的支持并发服务端(上传功能)
** 需要了解socketserver模块**
-
服务端
import socketserver import struct import os from conf import settings #自己定义一个类,必须继承BaseRequestHandler class MyTcp(socketserver.BaseRequestHandler): #必须重写handle方法 def handle(self): try: while True : #通信循环 # 获取头的内容 dic_len_byte = self.request.recv(4) if len(dic_len_byte)==0: return print('有客户端连接进来了,地址如下', self.client_address) print(self) print(dic_len_byte) #获取dic长度 dic_len = struct.unpack('i', dic_len_byte)[0] print(dic_len) dic_head = eval(self.request.recv(dic_len)) # 获取文件字节数和文件名 data = self.request.recv(dic_head['size']) data_name = dic_head['name'] # print(data.decode('utf8')) cloud_file_path = os.path.join(settings.cloud_db_path, data_name) with open(cloud_file_path, 'wb') as fw: fw.write(data) except Exception: pass if __name__ == '__main__': #实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据 #第一个参数是绑定的地址,第二个参数传一个类 server=socketserver.ThreadingTCPServer(('127.0.0.1',8081),MyTcp) #一直在监听 #这么理解:只要来一个请求,就起一个线程(造一个人,做交互) server.serve_forever()
-
客户端
while True: file_path=input('请输入文件路径按q退出>>>') if file_path=='q': break # print(os.path.getsize(file_path)) file_name=file_path.split('\')[-1] data_head={'size':os.path.getsize(file_path),'name':file_name} data_head_s=json.dumps(data_head) data_head_bytes=data_head_s.encode('utf8') # print(data_head_bytes) #把头的长度以长度为4的字节发送过去 head_len_bytes=struct.pack('i',len(data_head_bytes)) client.send(head_len_bytes) client.send(data_head_bytes) print('正在上传',file_name) with open(file_path,'rb') as fr: data=fr.read() client.send(data) print('上传成功',file_name)