2020-07-26:如何用 socket 编程实现 ftp 协议?
【摘要】 福哥答案2020-07-26:功能用户输入user username、pass password注册,注册后输入dir查看服务器文件列表,输入get filename path下载文件到指定路径。思路①客户端建立连接,打开输入输出流,开循环支持多次数据交换,直到用户输入退出命令,再关闭流和连接。循环内读取用户输入,作初步检测,看是否为上面几个命令之一,否则提示“输入错误”,要求用户再次输入。...
福哥答案2020-07-26:
功能
用户输入user username、pass password注册,注册后输入dir查看服务器文件列表,输入get filename path下载文件到指定路径。
思路
①客户端建立连接,打开输入输出流,开循环支持多次数据交换,直到用户输入退出命令,再关闭流和连接。
循环内读取用户输入,作初步检测,看是否为上面几个命令之一,否则提示“输入错误”,要求用户再次输入。
若是上面几大命令之一,则将命令写到输出流,发送给服务器。
②服务器监听21端口,开无限循环支持多线程,每个循环内获取当前到达的连接,并传入一个新线程内处理该连接(其实把获取连接的工作交给线程也行)。
线程内先获取输入流与输出流,然后开循环支持多次数据交换,直到客户端发来的命令为退出命令,才退出循环,关闭流和连接。
循环内读取用户发来的命令,分类,分别执行相应方法,生成响应码,反馈给客户端。
③客户端接收服务端的反馈,根据响应码打印相应信息。
④进入下一次循环,接着读取用户命令。
主要用到的 FTP 命令
FTP 每个命令都有 3 到 4 个字母组成,命令后面跟参数,用空格分开。每个命令都以 "\r\n"结束。
要下载或上传一个文件,首先要登入 FTP 服务器,然后发送命令,最后退出。这个过程中,主要用到的命令有 USER、PASS、SIZE、REST、CWD、RETR、PASV、PORT、QUIT。
USER: 指定用户名。通常是控制连接后第一个发出的命令。“USER gaoleyi\r\n”: 用户名为gaoleyi 登录。
PASS: 指定用户密码。该命令紧跟 USER 命令后。“PASS gaoleyi\r\n”:密码为 gaoleyi。
SIZE: 从服务器上返回指定文件的大小。“SIZE file.txt\r\n”:如果 file.txt 文件存在,则返回该文件的大小。
CWD: 改变工作目录。如:“CWD dirname\r\n”。
PASV: 让服务器在数据端口监听,进入被动模式。如:“PASV\r\n”。
PORT: 告诉 FTP 服务器客户端监听的端口号,让 FTP 服务器采用主动模式连接客户端。如:“PORT h1,h2,h3,h4,p1,p2”。
RETR: 下载文件。“RETR file.txt \r\n”:下载文件 file.txt。
STOR: 上传文件。“STOR file.txt\r\n”:上传文件 file.txt。
REST: 该命令并不传送文件,而是略过指定点后的数据。此命令后应该跟其它要求文件传输的 FTP 命令。“REST 100\r\n”:重新指定文件传送的偏移量为 100 字节。
QUIT: 关闭与服务器的连接。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
- 2025-03-07:网格图操作后的最大分数。给定一个 n x n 的二维矩阵 grid,初始时所有格子均为白色。你可以进行操作
- 2025-03-06:给定一个长度为 n 的整数组 nums,其中 n 是偶数,同时还有一个整数 k。 你可以进行一些操作,每次
- 绝了!k3s (k8s) 安装 ollama 运行 deepseek 全流程揭秘,yaml全公开
- 2025-03-04:求出硬币游戏的赢家。用go语言,给定两个正整数 x 和 y,分别代表75元和10元硬币的数量。 Alice
- 2025-03-03:切蛋糕的最小总开销Ⅱ。用go语言,你有一个大小为 m x n 的矩形蛋糕,需要将其切割成 1 x 1 的小
评论(0)