socker_server.py:
实现功能:获取yaml中的文件信息,用soket进行文件传输(TCP+三次握手)
socker_client.py:
实现功能:利用server端传过来的文件信息做校验,并继续文件接收
properties:
为yaml文件,储存文件信息
#file:socker_server.py
#_*_coding:utf-8_*_
#by Linhut
#time:/4/8
import SocketServer,yaml,json
class socketHandler(SocketServer.BaseRequestHandler):
def setup(self):
print '\033[32mServer starting successful ....\033[0m'
with open('F:/cgi-bin/p2/config/properties', 'r') as f:
content = f.read() #读出来内容
self.cfg = yaml.load(content) #通过yaml变成字典
def handle(self):
conn = self.request #把客户端的soket对象收到
first_mgs = conn.recv(1024) #判断第一次握手成功,发生文件头部
if first_mgs == 'successful':
with open(self.cfg['file_matadata']['filepath'],'rb') as f: #rb打开文件
self.content = f.read()
filesize = len(self.content)
self.cfg['file_matadata']['filesize'] = filesize # raml文件赋值文件大小
ack_msg = json.dumps(self.cfg).encode()
conn.send(ack_msg) #给客户端发送信息
else:
print 'client failed...'
if conn.recv(1024) == 'start':
conn.send(self.content)
finish_msg = conn.recv(1024)
print finish_msg
def finish(self):
pass
class socketserever(SocketServer.TCPServer):
pass
class MyServer(SocketServer.TCPServer,SocketServer.ThreadingMixIn):
pass
if __name__=='__main__':
server = socketserever(('127.0.0.1',),socketHandler)
server.serve_forever()
#file:socker_client.py
#_*_coding:utf-8_*_
#by Linhut
#time:/4/8
import socket,json,sys,time
recv_file = b''
recv_size = 0
server_address = ('127.0.0.1',)
sock =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
for i in range(5):
try:
sock.connect(server_address)
break
except Exception as e:
print 'client connection server \033[31mfailad\033[0m,please 3s retry..'
time.sleep(3)
else:
print 'client exit..'
sys.exit(10)
sock.send('successful')
ack_msg = json.loads(sock.recv(1024).decode()) #拿ack信息
print ack_msg
if ack_msg['file_matadata']:
filename = ack_msg['file_matadata']['filename']
filesize = ack_msg['file_matadata']['filesize']
name = raw_input('raw_input you locla filename:')
save_file_path = 'C:/Users/T530_I7QM/Desktop/%s.pdf'%name
sock.send('start') #告诉服务器端可以发送数据了
while recv_size < filesize:
content = sock.recv(2048)
recv_file += content
recv_size += 2048
print '[%s] recv_size:%s'%(filename,recv_size)
else:
with open(save_file_path,'ab+') as f:
f.write(recv_file)
sock.send('\033[32m client recv finished\033[0m') #完成并发生一个消息
print '\033[32m recv finished.. \033[0m'
#file:properties
ack_msg:
filename: qqq.pdf
filepath: C:/Users/T530_I7QM/Desktop/qqq.pdf
filesize: