##服务端
import socket,struct,json,os
class MYTCPServer:
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):
self.server_address=server_address
self.socket=socket.socket(self.address_family,self.socket_type)
if bind_and_activate:
try:
self.server_bind()
self.server_activate()
except:
self.server_close()
def server_bind(self):
if self.allow_reuse_address:
self.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.socket.bind(self.server_address)
self.server_address=self.socket.getsockname() # 返回的就是元组('127.0.0.1', 8080)
def server_activate(self):
self.socket.listen(self.request_queue_size)
def server_close(self):
self.socket.close()
def get_request(self):
return self.socket.accept()
def close_request(self,request):
request.close()
def run(self):
while True:
self.conn,self.client_addr=self.get_request()
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('utf-8')
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
self.close_request(self.conn)
def put(self,args):
file_path=os.path.normpath(os.path.join(self.server_dir,args['filename']))
#os.path.normpath返回该文件的完整路径.文件名
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))
tcpserver1.run()
#os.path.normpath 返回某个文件的完整路径及文件名
#os.path.baaename 返回上述完整路径的文件名
print(os.path.isfile('F:\wangkc\day08\s4.py')) #True
print(os.path.getsize('F:\wangkc\day08\s4.py')) #2264
#客户端
import socket,struct,json,os
class MYTCPClient:
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_len_struct=struct.pack('i',len(head_json_bytes))
self.socket.send(head_len_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()