我是靠谱客的博主 优秀蛋挞,最近开发中收集的这篇文章主要介绍python基于tcp/ip和多线程的网络文件传输服务器代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

ftp 文件服务器

  1. 功能
    【1】 分为服务端和客户端,要求可以有多个客户端同时操作。
    【2】 客户端可以查看服务器文件库中有什么文件。
    【3】 客户端可以从文件库中下载文件到本地。
    【4】 客户端可以上传一个本地文件到文件库。
    【5】 使用print在客户端打印命令输入提示,引导操作
"""
ftp 文件服务 客户端
"""
from socket import *
import sys,time

# 服务器地址
ADDR = ('127.0.0.1',8080)

# 客户端处理类
class FTPClient:
    def __init__(self,sockfd):
        self.sockfd = sockfd

    # 获取文件列表
    def do_list(self):
        self.sockfd.send(b'LIST') # 发送请求 29
        # 等待回复
        data = self.sockfd.recv(128).decode()
        if data == 'OK':
            # 一次接收所有文件名称字符串(解决沾包)
            data = self.sockfd.recv(1024 * 1024 * 10)
            print(data.decode())
        else:
            print(data)

    def do_retr(self,filename):
        # 发送请求
        self.sockfd.send(('RETR '+filename).encode())
        # 等待回复
        data = self.sockfd.recv(128).decode()
        if data == 'OK':
            f = open(filename,'wb')
            # 循环接收
            while True:
                data = self.sockfd.recv(1024)
                if data == b'##':
                    # 文件发送完
                    break
                f.write(data)
            f.close()
        else:
            print(data)

    def do_stor(self,filename):
        try:
            f = open(filename,'rb')
        except Exception:
            print("文件不存在")
            return
        # 提取文件名称
        filename = filename.split('/')[-1]
        # 发送请求
        self.sockfd.send(('STOR ' + filename).encode())
        # 等待回复
        data = self.sockfd.recv(128).decode()
        if data == 'OK':
            while True:
                data = f.read(1024)
                if not data:
                    time.sleep(0.1)
                    self.sockfd.send(b'##')
                    break
                self.sockfd.send(data)
            f.close()
        else:
            print(data)

    def do_quit(self):
        self.sockfd.send(b'QUIT')
        self.sockfd.close()
        sys.exit('谢谢使用')

# 网络链接
def main():
    sockfd = socket()
    try:
        sockfd.connect(ADDR)
    except Exception as e:
        print(e)
        return

    ftp = FTPClient(sockfd) # 调用请求功能

    # 循环的发送请求
    while True:
        print("==========命令选项============")
        print("*****      LIST       *****")
        print("*****  STOR filename  *****")
        print("*****  RETR filename  *****")
        print("*****      QUIT       *****")
        print("=============================")
        cmd = input("命令:")
        if cmd == 'LIST':
            ftp.do_list()
        elif cmd[:4] == 'RETR':
            filename = cmd.split(' ')[-1]
            ftp.do_retr(filename)
        elif cmd[:4] == 'STOR':
            filename = cmd.split(' ')[-1]
            ftp.do_stor(filename)
        elif cmd == 'QUIT':
            ftp.do_quit()
        else:
            print("请输入正确命令!")

if __name__ == '__main__':
    main()

"""
ftp文件处理
env: python3.6
多线程并发 & socket
"""
from socket import *
from threading import Thread
import sys,os
import time

# 全局变量
HOST = '0.0.0.0'
PORT = 8080
ADDR = (HOST,PORT)
FTP = "/home/tarena/FTP/" # 文件库位置

# 实现文件传输的具体功能
class FTPServer(Thread):
    def __init__(self,connfd):
        super().__init__()
        self.connfd = connfd

    # 处理文件列表发送
    def do_list(self):
        # 获取文件列表
        file_list = os.listdir(FTP)
        if not file_list:
            self.connfd.send('文件库为空'.encode()) #19
            return
        else:
            self.connfd.send(b'OK') #19
            time.sleep(0.1)
        # 发送文件列表
        files = 'n'.join(file_list)
        self.connfd.send(files.encode())

    # 文件下载
    def do_retr(self,filename):
        try:
            f = open(FTP+filename,'rb')
        except Exception:
            self.connfd.send('文件不存在'.encode())
            return
        else:
            self.connfd.send(b'OK')
            time.sleep(0.1)

        # 发送文件
        while True:
            data = f.read(1024)
            if not data:
                time.sleep(0.1)
                self.connfd.send(b'##')
                break
            self.connfd.send(data)
        f.close()

    # 处理上传文件
    def do_stor(self,filename):
        if os.path.exists(FTP + filename):
            self.connfd.send("文件已存在".encode())
            return
        else:
            self.connfd.send(b'OK')
        # 接收文件
        f = open(FTP+filename,'wb')
        while True:
            data = self.connfd.recv(1024)
            if data == b'##':
                # 文件发送完
                break
            f.write(data)
        f.close()

    def run(self):
        while True:
            # 接收客户端请求
            data = self.connfd.recv(1024).decode()
            if not data or data == 'QUIT':
                return # 线程结束
            elif data == 'LIST':
                self.do_list()
            elif data[:4] == 'RETR':
                filename = data.split(' ')[-1]
                self.do_retr(filename)
            elif data[:4] == 'STOR':
                filename = data.split(' ')[-1]
                self.do_stor(filename)


# 搭建网络模型
def main():
    # 创建tcp套接字
    s = socket()
    s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    s.bind(ADDR)
    s.listen(3)

    print("Listen the port 8080...")
    # 循环接收客户端链接
    while True:
        try:
            c, addr = s.accept()
            print("Connect from", addr)
        except KeyboardInterrupt:
            sys.exit('服务器退出')
        except Exception as e:
            print(e)
            continue

        #  创建线程处理
        t = FTPServer(c)
        t.setDaemon(True)  # 主线程退出其他线程也退出
        t.start()

if __name__ == '__main__':
    main()






最后

以上就是优秀蛋挞为你收集整理的python基于tcp/ip和多线程的网络文件传输服务器代码的全部内容,希望文章能够帮你解决python基于tcp/ip和多线程的网络文件传输服务器代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部