(p ython +tcp+tcp)文件传输

Posted yongqi-wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(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(bFAIL)  # 列表为空
            return
        else:
            self.connfd.send(bOK)
            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(bOK)
            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(bFAIL)
    #上传
    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(bFAIL)
        else:
            self.connfd.send(bOK)
            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()

 

以上是关于(p ython +tcp+tcp)文件传输的主要内容,如果未能解决你的问题,请参考以下文章

C语言编写TCP的文件传输

Delphi 文件传输

TCP 传输文件

在 Qt 中通过 TCP 传输大文件

如何通过udp获取直播源代码

TCP编程实现LINUX平台文件传输工程