2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Python--网络编程-----通过socket收发文件软件开发--面向对象开发

Python--网络编程-----通过socket收发文件软件开发--面向对象开发

时间:2022-11-20 11:26:53

相关推荐

Python--网络编程-----通过socket收发文件软件开发--面向对象开发

服务端实现

1 import socket 2 import struct 3 import json 4 import os 5 6 7 class MYTCPServer: 8address_family = socket.AF_INET 9socket_type = socket.SOCK_STREAM10allow_reuse_address = False11max_packet_size = 819212coding = 'utf-8'13request_queue_size = 514server_dir = r'C:\Users\xudachen\PycharmProjects\Python全栈开发\第三模块\网络编程\通过socket发送文件\服务端\file_upload'15 16def __init__(self, server_address, bind_and_active=True):17 """Constructor. May be extended, do not override"""18 self.server_address = server_address19 self.socket = socket.socket(self.address_family, self.socket_type)20 21 if bind_and_active:22 try:23 self.server_bind()24 self.server_activate()25 except:26 self.server_close()27 raise28 29def server_bind(self):30 """Called by constructor to bind the socket"""31 if self.allow_reuse_address:32 self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)33 self.socket.bind(self.server_address)34 self.server_address = self.socket.getsockname()35 36def server_activate(self):37 """Called by constructor to activate the server"""38 self.socket.listen(self.request_queue_size)39 40def server_close(self):41 """Called to clean-up the server"""42 self.socket.close()43 44def get_request(self):45 """Get the request and client address from the socket"""46 return self.socket.accept()47 48def close_request(self, request):49 """Called to clean-up an individual request"""50 request.close()51 52def run(self):53 while True:54 self.conn, self.client_addr = self.get_request()55 print('from client', self.client_addr)56 while True:57 try:58 head_struct = self.conn.recv(4)59 if not head_struct:60break61 62 head_len = struct.unpack('i', head_struct)[0]63 head_json = self.conn.recv(head_len).decode(self.coding)64 head_dic = json.loads(head_json)65 66 print(head_dic)67 cmd = head_dic['cmd']68 if hasattr(self, cmd):69func = getattr(self, cmd)70func(head_dic)71 except Exception:72 break73 74def put(self, args):75 file_path = os.path.normpath(os.path.join(self.server_dir, args['filename']))76 77 filesize = args['filesize']78 recv_size = 079 print('---->', file_path)80 with open(file_path, 'wb') as f:81 while recv_size < filesize:82 recv_data = self.conn.recv(self.max_packet_size)83 f.write(recv_data)84 recv_size += len(recv_data)85 print('recvsize:%s filesize:%s' % (recv_size, filesize))86 87 88 tcpserver1 = MYTCPServer(('127.0.0.1', 8080))89 tcpserver1.run()

客户端实现

1 import socket 2 import struct 3 import json 4 import os 5 6 7 class MYTCPClient: 8address_family = socket.AF_INET 9socket_type = socket.SOCK_STREAM10allow_reuse_address = False11max_packet_size = 819212coding = 'utf-8'13request_queue_size = 514 15def __init__(self, server_address, connect=True):16 self.server_address = server_address17 self.socket = socket.socket(self.address_family, self.socket_type)18 19 if connect:20 try:21 self.client_connect()22 except:23 self.client_close()24 raise25 26def client_connect(self):27 self.socket.connect(self.server_address)28 29def client_close(self):30 self.socket.close()31 32def run(self):33 while True:34 inp = input(">>:").strip() # put test.py35 if not inp:36 continue37 l = inp.split() # ['put','test.py']38 cmd = l[0] # put39 if hasattr(self, cmd):40 func = getattr(self, cmd)41 func(l)42 43def put(self, args): # ['put','test.py']44 cmd = args[0] # put45 filename = args[1] # test.py46 if not os.path.isfile(filename):47 print('file:%s is not exists' % filename)48 return49 else:50 filesize = os.path.getsize(filename)51 52 head_dic = {'cmd': cmd,53 'filename': os.path.basename(filename),54 'filesize': filesize}55 print(head_dic)56 head_json = json.dumps(head_dic)57 head_json_bytes = bytes(head_json, encoding=self.coding)58 59 head_struct = struct.pack('i', len(head_json_bytes))60 self.socket.send(head_struct)61 self.socket.send(head_json_bytes)62 send_size = 063 with open(filename, 'rb') as f:64 for line in f:65 self.socket.send(line)66 send_size += len(line)67 print(send_size)68 else:69 print('upload successful')70 71 72 client = MYTCPClient(('127.0.0.1', 8080))73 client.run()

先启动服务端,再启动客户端,在客户端输入put test.py

客户端运行结果为;

1 >>:put test.py 2 {'cmd': 'put', 'filename': 'test.py', 'filesize': 1014} 3 17 4 20 5 61 6 83 7 86 8 128 9 14010 14211 18712 3 24114 25315 25516 26817 29418 31319 32820 35421 38622 39823 40024 41325 41626 44027 44328 47729 48930 50431 50732 53633 59334 63235 65136 68737 72338 77939 80540 80741 82242 85643 87744 87945 89446 89647 95548 98849 101450 upload successful51 >>:

服务端运行结果:

1 from client ('127.0.0.1', 55771)2 {'cmd': 'put', 'filename': 'test.py', 'filesize': 1014}3 ----> C:\Users\xudachen\PycharmProjects\Python全栈开发\第三模块\网络编程\通过socket发送文件\服务端\file_upload\test.py4 recvsize:1014 filesize:1014

实际效果:

注意,在windows系统中使用pycharm,上传成功后,并不会立即在上传文件夹中显示,需要找到文件夹路径,点进去,然后才会在pycharm中看到,

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。