面向对象的上传

服务端

import socket
import struct
import json
import subprocess
import os

class MYTCPServer:#server类
address_family = socket.AF_INET

socket_type = socket.SOCK_STREAM

allow_reuse_address = False

max_packet_size = 8192

coding='utf-8'

request_queue_size = 5

server_dir='file_upload'

def __init__(self, server_address, bind_and_activate=True):
"""Constructor. May be extended, do not override."""
self.server_address=server_address
self.socket = socket.socket(self.address_family,
self.socket_type)
if bind_and_activate:
try:
#绑定ip端口号
self.server_bind()
self.server_activate()
except:
self.server_close()
raise

def server_bind(self):
"""Called by constructor to bind the socket.
"""
if self.allow_reuse_address:
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind(self.server_address)
#服务端获得客户端的ip和端口
self.server_address = self.socket.getsockname()

def server_activate(self):
"""Called by constructor to activate the server.
"""
self.socket.listen(self.request_queue_size)

def server_close(self):
"""Called to clean-up the server.
"""
self.socket.close()

def get_request(self):
"""Get the request and client address from the socket.
"""
return self.socket.accept()

def close_request(self, request):
"""Called to clean up an individual request."""
request.close()

def run(self):
while True:
self.conn,self.client_addr=self.get_request()#得到对象的conn和ip
print('from client ',self.client_addr)
while True:
try:
head_struct = self.conn.recv(4)#先接字典
if not head_struct:break
#字典有多少字节
head_len = struct.unpack('i', head_struct)[0]
head_json = self.conn.recv(head_len).decode(self.coding)
head_dic = json.loads(head_json)
print(head_dic)
#head_dic={'cmd':'put','filename':'a.txt','filesize':123123}
cmd=head_dic['cmd']
if hasattr(self,cmd):
func=getattr(self,cmd)
func(head_dic)
except Exception:
break

def put(self,args):
#设置规范化下载路径
file_path=os.path.normpath(os.path.join(
self.server_dir,
args['filename']
))

filesize=args['filesize']
recv_size=0
print('----->',file_path)
with open(file_path,'wb') as f:
while recv_size < filesize:
recv_data=self.conn.recv(self.max_packet_size)
f.write(recv_data)
recv_size+=len(recv_data)
print('recvsize:%s filesize:%s' %(recv_size,filesize))


tcpserver1=MYTCPServer(('127.0.0.1',8080))#生成server对象

tcpserver1.run()#运行run方法




客户端
import socket
import struct
import json
import os


class MYTCPClient:#client类
address_family = socket.AF_INET

socket_type = socket.SOCK_STREAM

allow_reuse_address = False

max_packet_size = 8192

coding='utf-8'

request_queue_size = 5

def __init__(self, server_address, connect=True):
self.server_address=server_address
self.socket = socket.socket(self.address_family,
self.socket_type)
if connect:
try:
self.client_connect()
except:
self.client_close()
raise

def client_connect(self):
self.socket.connect(self.server_address)

def client_close(self):
self.socket.close()

def run(self):
while True:
inp=input(">>: ").strip()
if not inp:continue
l=inp.split()#方法|文件名
cmd=l[0]
if hasattr(self,cmd):
func=getattr(self,cmd)
func(l)#执行操作上传下载


def put(self,args):
cmd=args[0]
filename=args[1]
if not os.path.isfile(filename):
print('file:%s is not exists' %filename)
return
else:
filesize=os.path.getsize(filename)
#方法名文件名文件大小
head_dic={'cmd':cmd,'filename':os.path.basename(filename),'filesize':filesize}
print(head_dic)
head_json=json.dumps(head_dic)
#把字典变成字节
head_json_bytes=bytes(head_json,encoding=self.coding)
#先发送字典的字节数
head_struct=struct.pack('i',len(head_json_bytes))
self.socket.send(head_struct)
self.socket.send(head_json_bytes)
send_size=0
with open(filename,'rb') as f:
for line in f:
self.socket.send(line)
send_size+=len(line)
print(send_size)
else:
print('upload successful')

client=MYTCPClient(('127.0.0.1',8080))

client.run()


原文地址:https://www.cnblogs.com/huhuxixi/p/10418678.html