`
cakin24
  • 浏览: 1397500 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

python实现FTP通信软件

阅读更多

一 代码

1、服务端代码
import socket
import threading
import os
import struct
#用户账号、密码、主目录
#也可以把这些信息存放到数据库中
users = {'zhangsan':{'pwd':'zhangsan1234', 'home':r'c:\python 3.5'},
         'lisi':{'pwd':'lisi567', 'home':'c:\\'}}
def server(conn,addr, home):
    print('新客户端:'+str(addr))
    #进入当前用户主目录
    os.chdir(home)
    while True:
        data = conn.recv(100).decode().lower()
        #显示客户端输入的每一条命令
        print(data)
        #客户端退出
        if data in ('quit', 'q'):
            break
        #查看当前文件夹的文件列表
        elif data in ('list', 'ls', 'dir'):
            files = str(os.listdir(os.getcwd()))
            files = files.encode()
            conn.send(struct.pack('I', len(files)))
            conn.send(files)
        #切换至上一级目录
        elif ''.join(data.split()) == 'cd..':
            cwd = os.getcwd()
            newCwd = cwd[:cwd.rindex('\\')]
            #考虑根目录的情况
            if newCwd[-1] == ':':
                newCwd += '\\'
            #限定用户主目录
            if newCwd.lower().startswith(home):
                os.chdir(newCwd)
                conn.send(b'ok')
            else:
                conn.send(b'error')
        #查看当前目录
        elif data in ('cwd', 'cd'):
            conn.send(str(os.getcwd()).encode())
        elif data.startswith('cd '):
            #指定最大分隔次数,考虑目标文件夹带有空格的情况
            #只允许使用相对路径进行跳转
            data = data.split(maxsplit=1)
            if len(data) == 2 and  os.path.isdir(data[1]) \
               and data[1]!=os.path.abspath(data[1]):
                os.chdir(data[1])
                conn.send(b'ok')
            else:
                conn.send(b'error')
        #下载文件
        elif data.startswith('get '):
            data = data.split(maxsplit=1)
            #检查文件是否存在
            if len(data) == 2 and os.path.isfile(data[1]):
                conn.send(b'ok')
                fp = open(data[1], 'rb')
                while True:
                    content = fp.read(4096)
                    #发送文件结束
                    if not content:
                        conn.send(b'overxxxx')
                        break
                    #发送文件内容
                    conn.send(content)
                    if conn.recv(10) == b'ok':
                        continue
                fp.close()
            else:
                conn.send(b'no')
        #无效命令
        else:
            pass
            
    conn.close()
    print(str(addr)+'关闭连接')
#创建Socket,监听本地端口,等待客户端连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 10600))
sock.listen(5)
while True:
    conn, addr = sock.accept()
    #验证客户端输入的用户名和密码是否正确
    userId, userPwd = conn.recv(1024).decode().split(',')
    if userId in users and users[userId]['pwd'] == userPwd:
        conn.send(b'ok')
        #为每个客户端连接创建并启动一个线程,参数为连接、客户端地址、客户主目录
        home = users[userId]['home']
        t = threading.Thread(target=server, args=(conn,addr,home))
        t.daemon = True
        t.start()
    else:
        conn.send(b'error')
 
 
2、客户端代码
import socket
import sys
import re
import struct
import getpass
def main(serverIP):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((serverIP, 10600))
    userId = input('请输入用户名:')
    #使用getpass模块的getpass()方法获取密码,不回显
    userPwd = getpass.getpass('请输入密码:')
    message = userId+','+userPwd
    sock.send(message.encode())
    login = sock.recv(100)
    #验证是否登录成功
    if login == b'error':
        print('用户名或密码错误')
        return
    #整数编码大小
    intSize = struct.calcsize('I')
    while True:
        #接收客户端命令,其中##>是提示符
        command = input('##> ').lower().strip()
        #没有输入任何有效字符,提前进入下一次循环,等待用户继续输入
        if not command:
            continue
        #向服务端发送命令
        command = ' '.join(command.split())
        sock.send(command.encode())
        #退出
        if command in ('quit', 'q'):
            break
        #查看文件列表
        elif command in ('list', 'ls', 'dir'):
            loc_size = struct.unpack('I', sock.recv(intSize))[0]
            files = eval(sock.recv(loc_size).decode())
            for item in files:
                print(item)
        #切换至上一级目录
        elif ''.join(command.split()) == 'cd..':
            print(sock.recv(100).decode())
        #查看当前工作目录
        elif command in ('cwd', 'cd'):
            print(sock.recv(1024).decode())
        #切换至子文件夹
        elif command.startswith('cd '):
            print(sock.recv(100).decode())
        #从服务器下载文件
        elif command.startswith('get '):
            isFileExist = sock.recv(20)
            #文件不存在
            if isFileExist != b'ok':
                print('error')
            #文件存在,开始下载
            else:
                print('downloading.', end='')
                fp = open(command.split()[1], 'wb')
                while True:
                    print('.', end='')
                    data = sock.recv(4096)
                    if data == b'overxxxx':
                        break
                    fp.write(data)
                    sock.send(b'ok')
                fp.close()
                print('ok')
                
        #无效命令
        else:
            print('无效命令')
    sock.close()
if __name__ == '__main__':
    if len(sys.argv) != 2:
        print('Usage:{0} serverIPAddress'.format(sys.argv[0]))
        exit()
    serverIP = sys.argv[1]
    if re.match(r'^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$', serverIP):
        main(serverIP)
    else:
        print('服务器地址不合法')
        exit()
 
二 运行结果
客户端运行结果


 
  • 大小: 15.8 KB
分享到:
评论

相关推荐

    client_python实现ftp客户端_FTP服务器python_

    python实现ftp客户端,可以和ftp服务器进行通信。

    python 实现简单的FTP程序

    Python实现简单的FTP程序涉及到网络编程和文件操作,主要利用了Python的socketserver模块来构建一个基本的FTP服务器,以及socket库来处理网络通信。FTP协议是基于TCP/IP协议的,通常由命令通道和数据通道组成,用于...

    python实现ftp文件传输

    文件传输系统,基于ftp协议,使用python语言开发,虽然python里面已经有ftplib模块,可以很容易的实现ftp服务器。这次我使用的是socket实现client与ftp server之间的通讯和文件传输,client另起一个flask服务器,...

    基于python实现的ftp客户端工具GUI编程源码

    1. **导入必要的库**:`ftplib`用于处理FTP通信,`tkinter`或`PyQt`用于构建GUI。 2. **定义FTP类**:封装FTP操作,如连接、断开、上传、下载等,以便在GUI中调用。 3. **GUI设计**:创建窗口、按钮、输入框等元素,...

    python编的FTP下载器

    在FTP下载器中,Python被用来实现FTP客户端和服务端的功能,因为它提供了丰富的网络编程接口,如`ftplib`模块,使得开发这样的应用变得相对简单。 3. **server.py**:这是FTP下载器的服务端文件。它通常包含一个...

    Python如何实现FTP功能

    在Python编程中,FTP(File Transfer Protocol)功能的实现主要依赖于`ftplib`模块,这是一个内置的标准库,用于处理FTP协议。以下是如何使用Python实现一个简易FTP服务器的实例。 首先,我们需要导入必要的模块,...

    ftp.zip_FTP python_Python脚本_ftp上传python_python ftp_shell脚本

    在Python中,我们可以使用内置的`ftplib`库来处理FTP通信。`ftplib`提供了一系列的方法和类,使我们能够连接到FTP服务器、登录、切换目录、上传和下载文件等。下面我们将深入探讨`ftplib`库的一些关键知识点: 1. *...

    02.6.利用Python SOCKET多线程开发FTP软件(全6集)

    根据提供的文件信息,我们可以推断出本教程系列主要讲解如何使用Python中的Socket编程结合多线程技术来开发一个FTP(文件传输协议)软件。接下来,我们将深入探讨这一主题中的几个关键知识点。 ### 一、Python ...

    python网络编程入门-FTP服务开发实战课件源码

    Python网络编程是初学者深入理解计算机网络和...通过学习和实践Python网络编程及FTP服务开发,你不仅可以掌握网络通信的基本原理,还能提升解决问题的能力,为后续的Web开发、网络爬虫、自动化运维等领域打下坚实基础。

    Python语言实现FTP服务器的方法共2页.pdf.zi

    本文将详细介绍如何利用Python来实现FTP服务器,并分享一些相关知识点。 FTP服务器的主要功能是允许用户通过网络上传、下载文件。在Python中,我们可以使用`ftplib`模块来实现这个功能。`ftplib`是Python标准库的一...

    python实现ftp文件传输系统(案例分析)

    ### Python 实现 FTP 文件传输系统案例分析 #### 一、项目背景及介绍 在现代互联网应用中,文件传输是一项基本且重要的功能。Python作为一种高级编程语言,提供了多种工具和技术来实现这种需求。本文将深入探讨...

    客户端FTP软件的实现

    客户端FTP软件的实现是计算机网络领域的一个重要话题,它涉及到文件传输协议(FTP)的细节以及如何编写能够与FTP服务器进行交互的程序。FTP是一种应用层协议,主要用于在Internet上可靠地传输文件。在此,我们将深入...

    Python FTP两个文件夹间的同步实例代码

    总之,Python的`ftplib`模块提供了丰富的功能来处理FTP通信,结合文件系统操作,可以轻松实现文件夹的同步,无论是本地还是远程FTP服务器。在开发这样的工具时,确保代码的健壮性和效率是非常重要的,以适应不同的...

    基于Python实现简化版 FTP 协议【100011289】

    在这个项目中,我们关注的是基于Python实现的简化版FTP协议——"simFTP"。这个项目旨在为初学者提供一个理解FTP工作原理的实践平台,同时涵盖了基础的客户端和服务端编程。 首先,让我们深入了解FTP的基本概念。FTP...

    python,Pyqt5 实现FTP服务器与客户端文件上传,下载

    本文将深入探讨如何使用Python的ftplib模块创建FTP服务器,并结合PyQt5设计一个用户友好的客户端,实现文件的上传和下载功能。 FTP(File Transfer Protocol)是一种网络协议,用于在互联网上进行文件传输。Python...

    利用Python SOCKET多线程开发FTP软件

    ### 利用Python SOCKET多线程开发FTP软件 在当今高度数字化的世界中,文件传输协议(FTP)作为互联网上的一项标准服务,被广泛用于在网络上进行文件传输。利用Python的socket库和多线程技术开发一个FTP软件,不仅...

    python实现下载整个ftp目录的方法

    ### Python 实现下载整个FTP目录的方法 #### 一、引言 在许多业务场景中,我们经常需要从FTP服务器上批量下载文件或整个目录。尽管FTP客户端提供了诸如`get`和`mget`等命令来下载单个文件或多个文件,但当需要下载...

Global site tag (gtag.js) - Google Analytics