• day10博客


    服务端:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # import socketserver
    # bufsize = 1024
    # host = '127.0.0.1'
    # port = 8100
    # address = (host,port)
    #
    # class MYtcphandler(socketserver.BaseRequestHandler):
    #     def handle(self):
    #         while True:
    #             data=self.request.recv(bufsize)
    #             if not data:break
    #             self.request.sendall(data.upper())
    # if __name__ == '__main__':
    #     sever=socketserver.ThreadingTCPServer((address),MYtcphandler)
    #     sever.serve_forever()
    
    import socketserver,os,socket
    
    class MYtcphandler(socketserver.BaseRequestHandler):
        def handle(self):
            while True:
                 client_data=self.request.recv(bufsize).strip()
                 if not client_data: break
                 client_data=client_data.split('|')
                 if hasattr(self,client_data[0]):
                     func=getattr(self,client_data[0])
                     func(client_data)
        def filetrans(self,msg):
            print('filetrans',msg)
            if msg[1] == 'get':
                print('client wants to download file',msg[2])
                if os.path.isfile(msg[2]):
                    file_size=os.path.getsize(msg[2])
                    res="ready|%s" %file_size
                else:
                    res="file not exit"
                sen_conirmation="filetrans|get|%s" %res
                self.request.send(sen_conirmation)
                feedback=self.request.recv(100)
                if feedback == 'filetrans|get|recv_ready':
                    f=open(msg[2],'rb')
                    send_size=0
                    while not file_size==file_size:
                        if file_size-send_size > 1024:
                            data=f.read(1024)
                            send_size+=1024
                        else:
                            data=f.read(file_size-send_size)
                            send_size+=(file_size-send_size)
                        self.request.send(data)
                        print(file_size,send_size)
                    else:
                        print('##############send file:%s done'%msg[2])
            elif msg[1] == 'put':
                print('client wants to download file',msg[2])
                #sendmessage
                feedback = self.request.recv(100)
                if feedback == 'filetrans|put|recv_ready':
                    file_size = int(feedback.split()[-1])
                    self.request.send("recv_ready")
                    recv_size = 0
                    put_file_name = msg[2]
                    f = open(os.path.basename(put_file_name), 'wb')
                    print('#########',put_file_name)
                    while not file_size == recv_size:
                        if file_size - recv_size > bufsize:
                            data = self.request.recv(bufsize)
                            recv_size += len(data)
                        else:
                            data = self.request.recv(file_size - recv_size)
                            recv_size += (file_size - recv_size)
                        # 接收就写入
                        f.write(data)
                        print(file_size,recv_size)
                    print('put %sdone',put_file_name)
    
    
    
                # put_file_name=msg[2]
                # if os.path.isfile(msg[2]):
                #     print('pass')
                #     put_size = os.path.getsize(msg[2])
                #     put_conirmation = "filetrans|put|%s" % put_size
                # else:
                #     print('faile')
    
                #put_size=os.path.getsize(msg[2])
    
                #put_conirmation="filetrans|put|%s" %put_size
    
    
    if __name__ == '__main__':
        bufsize = 1024
        host = '127.0.0.1'
        port = 8090
        address = (host,port)
        server=socketserver.ThreadingTCPServer((address),MYtcphandler)
        server.serve_forever()
    
    
    客户端:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import socketserver,os,socket
    class ftpclient(object):
        def __init__(self,address):
            self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            self.sock.connect((address))
        def start(self):
            self.useractive()
        def useractive(self):
            while True:
                user_input=input('>>:').strip()
                if len(user_input)==0:continue
                user_input=user_input.split()
                if hasattr(self,user_input[0]):
                    func=getattr(self,user_input[0])
                    func(user_input)
                else:
                    print('wrong cmd usage')
    
        def get(self,msg):
            print('##get func###',msg)
            if len(msg)==2:
                file_name=msg[1]
                client_data='filetrans|get|%s' % file_name
                self.sock.send(client_data)
                feedback=self.sock.recv(100)
                print('server confirm msg',feedback)
                if feedback.startswith('filetrans|get|ready'):
                    file_size=int(feedback.split('|')[-1])
                    self.sock.send('filetrans|get|recv_ready')
                    recv_size=0
                    f=open('client_recv/%s' %os.path.basename(file_name),'wb')
                    print('new file_name',file_name)
                    while not file_size==recv_size:
                        if file_size-recv_size>bufsize:
                            data=self.sock.recv(bufsize)
                            recv_size+=len(data)
                        else:
                            data=self.sock.recv(file_size-recv_size)
                            recv_size+=(file_size-recv_size)
                        f.write(data)
                        print(file_size,recv_size)
                    else:
                        print('###########recv file:%s#################'%file_name)
                        f.close()
                print(feedback)
            else:
                print('wrong cmd usage')
        def put(self,msg):
            print('##put func###', msg)
            if len(msg) == 2:
                file_name = msg[1]
                client_data = 'filetrans|put|%s' %file_name
                self.sock.send(client_data.encode('utf-8'))
                feedback = self.sock.recv(100)
                if os.path.isfile(file_name):
                    print('pass')
                    file_size=os.path.getsize(file_name)
                    res = "ready %s" %file_size
                    print('########',res)
                    self.sock.send(res)
                    if feedback == 'recv_ready':
                        f=open(file_name,'wb')
                        send_size = 0
                        while not file_size == send_size:
                            if file_size - send_size > 1024:
                                data = f.read(1024)
                                send_size += 1024
                            else:
                                data = f.read(file_size - send_size)
                                send_size += (file_size - send_size)
                                print(file_size,send_size)
                            self.sock.send(data)
                        else:
                            print('##########send file:%s done############' %file_name)
                            f.close()
                else:
                    print('faile')
                    res="file doesn's exist"
                    print('##########',res)
                    self.sock.send(res)
    
    
    
    
    
    
        def ls(self):
            pass
        def cd(self):
            pass
        def delete(self):
            pass
    
    if __name__ == '__main__':
        bufsize = 1024
        host = '127.0.0.1'
        port = 8090
        address = (host,port)
        p=ftpclient(address)
        p.start()
  • 相关阅读:
    程序格式
    java数据类型
    java-helloworld
    原生字符串
    字符串常见操作19个操作
    字符串函数操作
    【字符串切片操作和range函数用法】
    【字符串拼接之两种方法】
    C#中ref和out的区别使用
    c语言内部函数、外部函数多文件编译总结(vs2015编译环境)
  • 原文地址:https://www.cnblogs.com/Bruce-yin/p/7136305.html
Copyright © 2020-2023  润新知