zoukankan      html  css  js  c++  java
  • (p ython +tcp+tcp)文件传输

    #情景:向服务器上传文件,发送文件,获取目录,和退出

    服务器端:

    """
    /etc/python3
    @File     : miker_server.py
    @Time     : 2020/7/15 下午3:29
    @Author   : wangyongqi
    @Email    : 92644827@qq.com
    @SOftware : PyCharm 
    """
    
    
    import os
    import time
    from socket import *
    from threading import Thread
    
    HOST = "0.0.0.0"
    PORT = 8888
    ADDR = (HOST, PORT)
    
    FTP = "/home/tarena/img/"
    
    
    class FTP_Server(Thread):
        def __init__(self, connfd):
            super().__init__()
            self.connfd = connfd
        #目录处理
        def list_on(self):
            file_list = os.listdir(FTP)
            if not file_list:
                self.connfd.send(b'FAIL')  # 列表为空
                return
            else:
                self.connfd.send(b'OK')
                time.sleep(0.1)
                data = "
    ".join(file_list)
                self.connfd.send(data.encode())
        #下载
        def list_get(self):
            data = self.connfd.recv(1024).decode()
            print(data)
            file_list = os.listdir(FTP)
            print(file_list)
            if data in file_list:
                self.connfd.send(b'OK')
                data = "/home/tarena/img/" + data
                with open(data, 'rb') as list_get_wb:
                    stay = list_get_wb.read()
                    print(stay)
                    self.connfd.send(stay)
            else:
                self.connfd.send(b'FAIL')
        #上传
        def list_up(self):
            data = self.connfd.recv(1024).decode()
            print(data)
            file_list = os.listdir(FTP)
    
            if data in file_list:
                self.connfd.send(b'FAIL')
            else:
                self.connfd.send(b'OK')
                with open("/home/tarena/img/" + data, 'wb') as list_get_wb:
                    while True:
                        file = self.connfd.recv(1024)
                        print(file)
                        if not file:
                            break
                        list_get_wb.write(file)
    
    
    
        def run(self):
            # 总分模式
            while True:
                # 某个客户端所有的请求
                data = self.connfd.recv(1024).decode()
                print(data)
                # 更具不同的请求做不同处理
                if data == 'LIST':
                    self.list_on()
                elif data == 'get':
                    self.list_get()
                elif data == 'up':
                    self.list_up()
                elif data=='exit':
                    break
            self.connfd.close()
    
    
    def main():
        sock = socket()
        # 绑定
        sock.bind(ADDR)
        # 监听队列
        sock.listen(5)
        print("Listen the prot %s" % PORT)
    
    
        while True:
            try:
                connfd, addr = sock.accept()
                print("Connect from", addr)
            except KeyboardInterrupt:
                sock.close()
                return
            t = FTP_Server(connfd)
            t.setDaemon(True)
            t.start()
    
    
    if __name__ == '__main__':
        main()

    客户端:

    """
    /etc/python3
    @File     : miker_connect.py
    @Time     : 2020/7/15 下午3:29
    @Author   : wangyongqi
    @Email    : 92644827@qq.com
    @SOftware : PyCharm 
    """
    
    from socket import *
    from time import *
    
    # 服务器地址
    ADDR = ('127.0.0.1', 8888)
    mains = "  ========== 
    ||1.查看目录内的内容  ||
    ||2.下载文件         ||
    ||3.上传文件         ||
    ||4.退出          ||
      ==========  "
    
    
    class FTPClient:
        def __init__(self, sock):
            self.sock = sock
    
        def list(self):
            self.sock.send(b"LIST")  # 发送请求
            result = self.sock.recv(128).decode()  # 回复 字符串
            # 根据回复分情况讨论
            if result == 'OK':
                file = self.sock.recv(1024 * 1024).decode()
                print(file)
            else:
                print("文件库空")
    
        def list_get(self):
            self.sock.send(b"get")
            sleep(1)
            mains_input = input("请输入文件名")
            print(mains_input)
            self.sock.send(mains_input.encode())  # 发送请求
            result = self.sock.recv(1024)  # 回复 字符串
            result = result.decode()
            print(result)
            if result == 'OK':
                with open(mains_input, 'wb') as list_get_wb:
                    while True:
                        file = self.sock.recv(1024 * 1024)
                        print(file)
                        if not file:
                            break
                        else:
                            list_get_wb.write(file)
                        break
            else:
                print("无这文件")
    
        def list_up(self):
            self.sock.send("up".encode())
            mains_input = input("请输入文件名")
            self.sock.send(mains_input.encode())  # 发送请求
            result = self.sock.recv(1024)  # 回复 字符串
            result = result.decode()
            print(result)
            if result == 'OK':
                with open(mains_input, 'rb') as list_up_rb:
                    file=list_up_rb.read()
                    print(file)
                    self.sock.send(file)
            else:
                print("已有这个文件")
    
        def exit(self):
            self.sock.send("exit".encode())
    
    
    
    def main():
        sock = socket()
    
        sock.connect(ADDR)
    
        ftp = FTPClient(sock)
        while True:
            mains_input = input(f"{mains}
    >>")
            if mains_input == "1":
                ftp.list()
            elif mains_input == "2":
                ftp.list_get()
            elif mains_input == "3":
                ftp.list_up()
            elif mains_input=='4':
                ftp.exit()
                break
    
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    【前端开发】关于闭包最通俗易懂的解释 for循环,定时器,闭包混合一块的那点事。
    【前端node开发】你需要的Express开发教程
    【前端vue开发】vue开发输入姓名,电话,公司表单提交组件
    【前端vue开发】vue知识点超链接学习笔记
    【前端vue开发】vue子调父 $emit (把子组件的数据传给父组件)
    【前端vue开发】vue项目使用sass less扩展语言所要安装的依赖
    【轨迹动画css】不规则轨迹动画css教程,弹球,客服广告悬浮层都可以用
    【前端vue开发架构】vue开发单页项目架构总结
    3D全景漫游
    一些好的网站
  • 原文地址:https://www.cnblogs.com/yongqi-wang/p/13332553.html
Copyright © 2011-2022 走看看