socker_server.py:
  • 组件调用:SocketServer,yaml,json
  • 实现功能:获取yaml中的文件信息,用soket进行文件传输(TCP+三次握手)
socker_client.py:
  • 组件调用:socket,json,sys,time
  • 实现功能:利用server端传过来的文件信息做校验,并继续文件接收
properties:
  • 为yaml文件,储存文件信息

#file:socker_server.py
#_*_coding:utf-8_*_
#by Linhut
#time:2017/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',2010),socketHandler)
    server.serve_forever()

#file:socker_client.py
#_*_coding:utf-8_*_
#by Linhut
#time:2017/4/8
import socket,json,sys,time
recv_file = b''
recv_size = 0

server_address = ('127.0.0.1',2010)
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: