/rsh_socket

用socket python实现的一个远程终端

Primary LanguagePython

socket文件传输

本项目是《计算机网络》课程项目,要求用socket实现一个简单的文件服务器,在不同机器之间进行文件的上传和下载。 本人使用python3在ubuntu16.04上进行开发,并尽量保证在windows平台上的兼容性。

预期功能

服务器端运行server.py,持续监听客户端的连接请求。客户端首先需要知道服务器端的IP地址,这可以通过命令行参数传入,或者在程序文件中指定。开发期间服务器IP指定为127.0.0.1,即localhost默认IP地址。客户端运行client.py,请求与服务器连接。连接成功后,客户端打印命令提示符,等待用户输入命令。可选命令包括:

  1. 列出客户端或服务器端当前路径下文件(夹)名 --- ls
  2. 切换客户端或服务器端当前路径 --- cd
  3. 切换ls、cd指令作用的机器 --- local/remote
  4. 从服务器端下载文件到客户端当前路径 --- get
  5. 递归地将服务器端文件夹下载到客户端当前路径 --- getdir
  6. 将客户端文件上传到服务器端当前路径 --- put
  7. 递归地将客户端文件夹上传到服务器端当前路径 --- putdir

程序说明

在client.py文件所在路径下由客户端维护一个文件夹CLIENT_ROOT_DIR作为客户端根目录,客户端只允许上传该文件夹内的内容,从服务器下载的文件也只允许存放到该文件夹内。 同样,在server.py文件所在路径下由服务器端维护一个文件夹SERVER_ROOT_DIR作为服务器端根目录,客户端只允许请求下载该文件夹内的内容,由客户端上传的文件也只允许存放在该目录内。 如果这两个文件夹不存在,会在客户端或服务器端程序开始运行时自动创建。
客户端类中还维护两个成员变量,current_local_path和current_remote_path作为当前路径,在进行文件上传和下载时,缺省当前路径名。若需要操作当前路径的子目录内的内容,只许指定子目录名即可。只有cd(change directory)指令可以修改这两个成员变量。
客户端类中维护一个pos成员变量表示当前位置是客户端还是服务器端,取值为"local"或"remote"。实际上只是影响ls指令和cd指令是作用于current_local_path还是current_remote_path。该变量取值会在命令提示符内显示。
在进行文件传输时,若目的路径下已有同名文件或文件夹,会在客户端询问用户是覆盖原文件、重命名(添加后缀),还是取消操作。(这一功能还没完全实现)
在本项目下有一个TEST文件夹,其中包括若干文件和文件夹,用于测试。测试时可以将该文件夹内的内容复制到CLIENT_ROOT_DIR或SERVER_ROOT_DIR。在我本地计算机内还有一个bigfile.txt,文件大小有数百兆,用于测试大文件传输的效果。为了不浪费github空间,我将其添加到了.gitignore列表,在commit和push时将被忽略。

依赖库

tqdm

用于实现进度条效果,在windows的cmd中可能有些bug,在windows的VS code中可以使用PowerShell,整体显示效果堪比Ubuntu下的bash terminal

# 安装tqdm
python3 -m pip install tqdm

操作示例

#运行服务器
python3 server.py 127.0.0.1 65432
#ip未指定时默认为通过程序自动获取当前ip
#port未指定时默认为65432
#如果服务器端通过命令行手动指定了ip和port,会在终端打印

#运行客户端
python3 client.py 127.0.0.1 65432
#ip未指定时默认为通过程序自动获取当前ip
#port未指定时默认为65432
#客户端ip和port需要和服务器端一致

server.png
client.png
更多测试截图可以查看img文件夹

参考资料