文件服务器

python 复制代码
#ftpserver.py
from socket import *
from threading import Thread

import os,time

#全局变量
HOST = '0.0.0.0'
PORT=8080
ADDR = (HOST,PORT)
FTP  = "FTP/" #文件库位置
#创建类实现服务器文件处理功能

class FTPServer(Thread):
    """
    查看列表,下载,上传,退出
    """
    def __init__(self,connfd):
        self.connfd = connfd
        super().__init__()
    def do_list(self):
        files = os.listdir(FTP)
        if not files:
            self.connfd.send('文件库为空'.encode())
            return
        else:

            self.connfd.send(b'OK')
            time.sleep(0.1)

        #拼接文件
        filelist=''
        for file in files:
            if file[0] != '.' and \
                os.path.isfile(FTP+file):
                filelist +=file+'\n'
        self.connfd.send(filelist.encode())
    def do_get(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'##')
                    return
                self.connfd.send(data)

    def do_put(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 == 'Q':
                return #线程结束
            elif data == 'L':
                self.do_list()
            elif data[0] == 'G':
                filename = data.split(' ')[-1]
                self.do_get(filename)
            elif data[0] == 'P':
                filename = data.split(' ')[-1]
                self.do_put(filename)

#搭建网络服务端模型
def main():
    s = socket()
    s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    s.bind(ADDR)
    s.listen(5)

    # 处理僵尸进程


    while True:
        try:
            c, addr = s.accept()
            print('Connect from ', addr)
        except KeyboardInterrupt:
            os._exit(0)
        except Exception as e:
            print(e)
            continue
        # 创建子进程处理客户端请求
        client = FTPServer(c)



        client.start()





if __name__  == "__main__":
    main()

ftp_client

python 复制代码
"""
ftp 文件服务,客户端
"""
import sys
from socket import *
#服务器地址
ADDR = ('192.168.87.128',8080)
#客户端文件处理类
class FTPClient:
    def __init__(self,sockfd):
        self.sockfd = sockfd
    def do_list(self):
        self.sockfd.send(b'L')#发送请求
        #等待回复
        data = self.sockfd.recv(128).decode()
        if data  == 'OK':
            data=self.sockfd.recv(4028).decode()
            print(data)
            return
    #退出
    def do_quit(self):

        self.sockfd.send(b'Q')#请求退出
        self.sockfd.close()
        sys.exit('谢谢使用')
    #下载文件
    def do_get(self,filename):
        self.sockfd.send(('G '+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()
    def do_put(self,filename):
        self.sockfd.send(('P '+filename).encode())
        #等待回复
        try:
           f= open(filename,'rb')
        except:
            print('文件不存在')
            return




        data = self.sockfd.recv(128).decode()
        if data == 'OK':

            while True:
            #循环发送文件
                data=f.read(1024)
                self.sockfd.send(data)
                if not data:
                    self.sockfd.send(b'##')
                    print(f'{filename}传输完成')

                    break
        f.close()






#发送请求





def main():
    sockfd = socket()
    try:
        sockfd.connect(ADDR)
    except Exception as e:
        print(e)
        return
    ftp = FTPClient(sockfd)

    while True:
        print('\n=======命令选项========')
        print('          list                ')
        print('          get file                ')
        print('          put file               ')
        print('          quit                ')
        cmd = input('输入命令:')
        if cmd.strip() == 'list':
            print(1)
            ftp.do_list()
        elif cmd.strip() == 'quit':
            ftp.do_quit()
        elif cmd[:3] == 'get':
            filename = cmd.strip().split(' ')[-1]
            ftp.do_get(filename)
        elif cmd[:3] == 'put':
            filename = cmd.strip().split(' ')[-1]
            ftp.do_put(filename)




if __name__ == "__main__":
    main()
相关推荐
阡之尘埃2 分钟前
Python数据分析案例73——基于多种异常值监测算法探查内幕交易信息
人工智能·python·机器学习·数据分析·异常检测·无监督学习
BranH22 分钟前
Linux系统中命令设定临时IP
linux·运维·服务器
极小狐33 分钟前
极狐GitLab 项目功能和权限解读
运维·git·安全·gitlab·极狐gitlab
宁酱醇34 分钟前
GitLab_密钥生成(SSH-key)
运维·ssh·gitlab
秋风起,再归来~39 分钟前
【Linux庖丁解牛】—进程优先级!
linux·运维·服务器
蓝莓味柯基1 小时前
Python3:文件操作
python
Lalolander1 小时前
设备制造行业如何避免项目管理混乱?
运维·制造·工程项目管理·四算一控·epc·环保设备工程·设备制造
xiaoh_71 小时前
解决视频处理中的 HEVC 解码错误:Could not find ref with POC xxx【已解决】
python·ffmpeg·音视频
LucianaiB1 小时前
【金仓数据库征文】_AI 赋能数据库运维:金仓KES的智能化未来
运维·数据库·人工智能·金仓数据库 2025 征文·数据库平替用金仓
prinrf('千寻)2 小时前
nacos设置权重进行负载均衡不生效
运维·负载均衡