2025-05-08 Unity 网络基础9——FTP通信

1 FTP

​ FTP(File Transfer Protocol)文件传输协议,是支持 Internet 文件传输的各种规则所组成的集合。

​ FTP 文件传输协议使 Internet 用户可以把文件从一台主机拷贝到另一台主机上;除此之外,FTP 还提供登录、目录查询以及其他会话控制等功能。

1.1 工作原理

​ FTP 的本质是 TCP 通信。通过 FTP 传输文件,双发至少需要建立两个 TCP 连接。

  • 一个称为控制连接,用于传输 FTP命令。
  • 一个称为数据连接,用于传输文件数据。
image-20250508100430100

​ 数据连接和控制连接方向一般是相反的。

​ 用户使用 FTP 客户端连接 FTP 服务区,请求下载文件。

  • 控制连接方向:客户端主动连接服务器告知其下载命令。
  • 数据连接方向:服务端主动连接客户端下发数据。

​ 一般情况下,使用 FTP 传输文件时,客户端必须先登录服务器,获得相应权限后,才能上传或下载文件。

​ 服务器也可以允许用户匿名登录 FTP,不需要都拥有一个合法账号。

1.2 传输模式

​ 当客户端和 FTP 服务器建立控制连接后,需要告诉服务器采用那种传输模式。

  1. 主动模式 (Port模式)

    服务器主动连接客户端,然后传输文件 。

  2. 被动模式 (Passive模式)

    客户端主动连接服务器 即控制连接和数据连接都由客户端发起。

​ 在使用 FTP 进行数据传输时,有两种数据传输方式。

  1. ASCII 传输方式

    以 ASCII 编码方式传输数据,适用于传输仅包含英文的命令和参数或者英文文本文件 。

  2. 二进制传输方式(建议使用该方式)

    可以指定采用哪种编码传输命令和文件数据。如果传输的文件不是英文文件则应该采用该方式。

2 搭建 FTP 服务器

配置环境

  • windows 11

2.1 启用服务

  1. 点击 windows 菜单,在搜索框内输入“控制面板”并打开。
image-20250508101926782
  1. 点击“程序”->“启用或关闭 Windows 功能”。
image-20250508102434566 image-20250508102456050
  1. 安装 FTP,web 管理工具,internet 可承载的 web 核心。
image-20250508102718205

2.2 配置站点

  1. 通过在 “开始” 菜单中搜索 “IIS” 来找到 “Internet Information Services (IIS) 管理器” 并打开。

    image-20250508102913144
  2. 鼠标右键左侧的“网站”,点击“添加 FTP 站点”。

    image-20250508103113457
  3. 填入自己的站点名称,并选择物理路径。

    image-20250508103333704
  4. 继续配置自己电脑的 IP 地址。

    image-20250508103501173

    IP 地址在这里查看。

    image-20250508103718242
  5. 选择身份验证方式和授权规则。身份验证可以选择

    • “匿名”(允许任何人访问)。
    • “基本”(需要用户名和密码)。

    授权规则可以设置允许哪些用户或用户组访问,以及访问权限(读取、写入等)。

image-20250508104007308

2.3 设置防火墙

  1. 配置完成后,需要进入防火墙设置允许应用通过。

    image-20250508104447474

​ 到此,所有用户均可直接通过“ftp://你的 IP”访问服务器。

image-20250508140032796

2.4 指定用户登录

  1. 在 windows 菜单中搜索“计算机管理”并进入。
image-20250508140452181
  1. 展开窗口左侧的“本地用户和组”,点击“用户”,窗口右侧即为用户列表。

    右键单击空白处,点击新用户,此时将弹出新用户创建窗口。

image-20250508140608153
  1. 创建你的用户。
image-20250508140728187
  1. 回到 “Internet Information Services (IIS) 管理器”,进入“FTP 授权规则”。
image-20250508140822667
  1. 点击右侧“添加允许规则”,填写刚创建的用户。

    本文创建了用户名:FTPUser,密码:123456。

image-20250508141050162

​ 到此,用户通过“ftp://你的 IP”访问服务器时,需要密码验证。

image-20250508141242250

3 常用 API

3.1 NetworkCredential

  • 命名空间System.Net
  • 用途:用于在 FTP 文件传输时设置账号密码。
NetworkCredential n = new NetworkCredential("用户名", "密码");

3.2 FtpWebRequest

  • 命名空间System.Net

  • 用途:FTP 文件传输协议客户端操作类,主要用于上传、下载、删除服务器上的文件。

重要方法

  1. Create() - 创建新的WebRequest,用于进行FTP相关操作
FtpWebRequest req = FtpWebRequest.Create(new Uri("ftp://127.0.0.1/Test.txt")) as FtpWebRequest;
  1. req.Abort() - 终止正在进行的文件传输。
  2. req.GetRequestStream() - 获取用于上传的流。
  3. req.GetResponse() - 返回 FTP 服务器响应。

重要成员

  1. req.Credentials - 通信凭证,设置为 NetworkCredential 对象。
req.Credentials = n;
  1. req.KeepAlive - 控制完成请求后是否关闭到 FTP 服务器的连接(默认为 true 不关闭)。
  2. req.Method - 操作命令设置(来自WebRequestMethods.Ftp类):
    • DeleteFile - 删除文件。
    • DownloadFile - 下载文件。
    • ListDirectory - 获取文件简短列表。
    • ListDirectoryDetails - 获取文件详细列表。
    • MakeDirectory - 创建目录。
    • RemoveDirectory - 删除目录。
    • UploadFile - 上传文件。
  3. req.UseBinary - 是否使用二进制传输(推荐设置为 true)。

3.3 FtpWebResponse

  • 命名空间System.Net
  • 用途:封装 FTP 服务器对请求的响应,提供操作状态和下载数据。
FtpWebResponse res = req.GetResponse() as FtpWebResponse;

重要方法

  1. res.Close() - 释放所有资源。
  2. res.GetResponseStream() - 返回从 FTP 服务器下载数据的流。

重要成员

  1. res.ContentLength - 接收数据的长度。
  2. res.ContentType - 接收数据的类型。
  3. res.StatusCode - FTP 服务器下发的最新状态码。
  4. res.StatusDescription - 状态代码的文本描述。
  5. res.BannerMessage - 登录前服务器发送的消息。
  6. res.ExitMessage - FTP 会话结束时服务器发送的消息。
  7. res.LastModified - 服务器上文件的上次修改日期和时间。

4 实战操作

4.1 上传文件

  1. 在 Unity 项目中创建 StreamingAssets 文件夹,并放入一张图片“test.png”。
image-20250508215734761
  1. 创建以下脚本,并挂载到场景上。

    using UnityEngine;
    
    namespace Lesson
    {
        using System;
        using System.IO;
        using System.Net;
    
        public class Lesson20 : MonoBehaviour
        {
            private void Start()
            {
                try
                {
                    // 创建一个FTP请求
                    var req = WebRequest.Create($"ftp://你的IP地址/pic_{DateTime.Now:yyyy-M-d-HH-mm-ss}.png") as FtpWebRequest;
    
                    // 设置FTP请求的用户名和密码
                    req.Credentials = new NetworkCredential("FTPUser", "123456");
    
                    // 设置代理为空
                    req.Proxy = null;
    
                    // 设置保持连接为true
                    req.KeepAlive = true;
    
                    // 设置请求方法为上传文件
                    req.Method = WebRequestMethods.Ftp.UploadFile;
    
                    // 设置使用二进制上传
                    req.UseBinary = true;
    
                    // 获取请求流
                    var upLoadStream = req.GetRequestStream();
    
                    // 打开要上传的文件
                    using (var file = File.OpenRead(Application.streamingAssetsPath + "/test.png"))
                    {
                        // 创建一个字节数组
                        var bytes = new byte[1024];
    
                        // 读取文件内容到字节数组
                        var contentLength = file.Read(bytes, 0, bytes.Length);
    
                        // 循环读取文件内容,直到文件内容读取完毕
                        while (contentLength > 0)
                        {
                            // 将字节数组写入请求流
                            upLoadStream.Write(bytes, 0, contentLength);
    
                            // 继续读取文件内容
                            contentLength = file.Read(bytes, 0, bytes.Length);
                        }
    
                        // 关闭文件流
                        file.Close();
    
                        // 关闭请求流
                        upLoadStream.Close();
    
                        // 打印上传成功信息
                        print("upload success");
                    }
                }
                catch (Exception e)
                {
                    // 打印异常信息
                    Console.WriteLine(e);
    
                    // 抛出异常
                    throw;
                }
            }
        }
    }
    
  2. 运行 Unity,即可传输 test.png 到 FTP 服务器上。

    image-20250508220136340 image-20250508220125617

4.2 下载文件

  1. 在 FTP 服务器上准备一个文件,这里以 Test.txt 为例。

    image-20250508220303259
  2. 创建以下脚本,并挂载到场景上。

    using UnityEngine;
    
    namespace Lesson
    {
        using System;
        using System.IO;
        using System.Net;
    
        public class Lesson21 : MonoBehaviour
        {
            private void Start()
            {
                try
                {
                    // 创建一个WebRequest对象,指定FTP地址
                    var req = WebRequest.Create("ftp://你的IP地址/Test.txt") as FtpWebRequest;
    
                    // 设置FTP登录凭证
                    req.Credentials = new NetworkCredential("FTPUser", "123456");
    
                    // 设置代理为空
                    req.Proxy = null;
    
                    // 设置保持连接为true
                    req.KeepAlive = true;
    
                    // 设置请求方法为下载文件
                    req.Method = WebRequestMethods.Ftp.DownloadFile;
    
                    // 设置使用二进制传输
                    req.UseBinary = true;
    
                    // 获取响应
                    var res = req.GetResponse() as FtpWebResponse;
    
                    // 获取响应流
                    var downLoadStream = res.GetResponseStream();
    
                    // 创建文件
                    using (var file = File.Create(Application.streamingAssetsPath + $"/test_{DateTime.Now:yyyy-M-d-HH-mm-ss}.txt"))
                    {
                        // 创建一个字节数组
                        var bytes = new byte[1024];
    
                        // 读取响应流中的数据
                        var contentLength = downLoadStream.Read(bytes, 0, bytes.Length);
    
                        // 循环读取数据,直到读取完毕
                        while (contentLength > 0)
                        {
                            // 将数据写入文件
                            file.Write(bytes, 0, contentLength);
    
                            // 继续读取数据
                            contentLength = downLoadStream.Read(bytes, 0, bytes.Length);
                        }
    
                        // 关闭响应流
                        downLoadStream.Close();
    
                        // 关闭文件
                        file.Close();
    
                        // 打印下载成功
                        print("download success");
                    }
                }
                catch (Exception e)
                {
                    // 打印异常信息
                    Console.WriteLine(e.Message);
    
                    // 抛出异常
                    throw;
                }
            }
        }
    }
    
  3. 运行 Unity,即可从 FTP 服务器上下载 Test.txt 到 StreamingAssets 文件夹中。

    image-20250508220636160

4.3 删除文件

​ 和上述操作类似,直接上代码。

using UnityEngine;

namespace Lesson
{
    using System;
    using System.IO;
    using System.Net;

    public class Lesson22 : MonoBehaviour
    {
        private void Start()
        {
            try
            {
                // 创建一个WebRequest对象,指定FTP地址
                var req = WebRequest.Create("ftp://你的IP地址/Test.txt") as FtpWebRequest;

                // 设置FTP登录凭证
                req.Credentials = new NetworkCredential("FTPUser", "123456");

                // 设置代理为空
                req.Proxy = null;

                // 设置保持连接为true
                req.KeepAlive = true;

                // 设置请求方法为删除文件
                req.Method = WebRequestMethods.Ftp.DeleteFile;

                // 获取响应
                var res = req.GetResponse() as FtpWebResponse;
                
                // 关闭响应流
                res.Close();

                // 打印下载成功
                print("delete success");
            }
            catch (Exception e)
            {
                // 打印异常信息
                Console.WriteLine(e.Message);

                // 抛出异常
                throw;
            }
        }
    }
}

4.4 获取文件大小

using UnityEngine;

namespace Lesson
{
    using System;
    using System.IO;
    using System.Net;

    public class Lesson22 : MonoBehaviour
    {
        private void Start()
        {
            try
            {
                // 创建一个WebRequest对象,指定FTP地址
                var req = WebRequest.Create("ftp://你的IP地址/Test.txt") as FtpWebRequest;

                // 设置FTP登录凭证
                req.Credentials = new NetworkCredential("FTPUser", "123456");

                // 设置代理为空
                req.Proxy = null;

                // 设置保持连接为true
                req.KeepAlive = true;

                // 设置请求方法为获取文件大小
                req.Method = WebRequestMethods.Ftp.GetFileSize;

                // 获取响应
                var res = req.GetResponse() as FtpWebResponse;
                
                // 打印文件大小
                print(res.ContentLength);
                
                // 关闭响应流
                res.Close();

                // 打印下载成功
                print("delete success");
            }
            catch (Exception e)
            {
                // 打印异常信息
                Console.WriteLine(e.Message);

                // 抛出异常
                throw;
            }
        }
    }
}

4.5 创建文件夹

using UnityEngine;

namespace Lesson
{
    using System;
    using System.IO;
    using System.Net;

    public class Lesson22 : MonoBehaviour
    {
        private void Start()
        {
            try
            {
                // 创建一个WebRequest对象,指定FTP地址
                var req = WebRequest.Create("ftp://你的IP地址/TestDir") as FtpWebRequest;

                // 设置FTP登录凭证
                req.Credentials = new NetworkCredential("FTPUser", "123456");

                // 设置代理为空
                req.Proxy = null;

                // 设置保持连接为true
                req.KeepAlive = true;

                // 设置请求方法为创建文件夹
                req.Method = WebRequestMethods.Ftp.MakeDirectory;

                // 获取响应,创建文件夹
                var res = req.GetResponse() as FtpWebResponse;
                
                // 关闭响应流
                res.Close();

                // 打印下载成功
                print("delete success");
            }
            catch (Exception e)
            {
                // 打印异常信息
                Console.WriteLine(e.Message);

                // 抛出异常
                throw;
            }
        }
    }
}

4.6 获取文件与文件夹名

using UnityEngine;

namespace Lesson
{
    using System;
    using System.IO;
    using System.Net;

    public class Lesson22 : MonoBehaviour
    {
        private void Start()
        {
            try
            {
                // 创建一个WebRequest对象,指定FTP地址
                var req = WebRequest.Create("ftp://你的IP地址/TestDir") as FtpWebRequest;

                // 设置FTP登录凭证
                req.Credentials = new NetworkCredential("FTPUser", "123456");

                // 设置代理为空
                req.Proxy = null;

                // 设置保持连接为true
                req.KeepAlive = true;

                // 设置请求方法为读取文件夹信息
                req.Method = WebRequestMethods.Ftp.ListDirectory;

                // 获取响应
                var res = req.GetResponse() as FtpWebResponse;
                
                // 创建一个StreamReader对象,用于读取从res对象中获取的响应流
                var streamReader = new StreamReader(res.GetResponseStream());
                
                // 读取所有响应内容,包括文件名和文件夹名
                // var dir = streamReader.ReadToEnd();
                // print(dir);
                
                // 逐行读取响应内容
                string line = streamReader.ReadLine();
                while (line != null)
                {
                    print(line);
                    line = streamReader.ReadLine();
                }

                // 关闭响应流
                res.Close();

                // 打印下载成功
                print("delete success");
            }
            catch (Exception e)
            {
                // 打印异常信息
                Console.WriteLine(e.Message);

                // 抛出异常
                throw;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔗理苦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值