Unity C# 网络学习(六)——FTP(一)

Unity C# 网络学习(六)——FTP(一)

一.FTP关键类

1.NetworkCredential类

        //用于FTP传输时设置账号和秘密的通信凭证
        NetworkCredential networkCredential = new NetworkCredential("zzs", "zzzsss123");

2.FtpWebRequest类

        //创建新的WebRequest 用于ftp通信
        FtpWebRequest ftpWebReq = (FtpWebRequest) WebRequest.Create(new Uri("ftp://127.0.0.1/1.jpg"));
        //如果正在进行ftp文件传输,使用Abort可以停止
        ftpWebReq.Abort();
        //获取用于上传的流GetRequestStream
        Stream s = ftpWebReq.GetRequestStream();
        //获取ftp服务器响应
        FtpWebResponse ftpWebRep = ftpWebReq.GetResponse() as FtpWebResponse;

        //=======重要成员=======
        //设置通信凭证
        ftpWebReq.Credentials = networkCredential;
        //当请求完成时是否关闭ftp服务器的控制连接(默认为true,不关闭)
        ftpWebReq.KeepAlive = false;
        //操作命令设置(WebRequestMethods.Ftp静态类中有对应的静态变量来设置该值)
        ftpWebReq.Method = WebRequestMethods.Ftp.DownloadFile;
        //是否使用二进制来传输
        ftpWebReq.UseBinary = true;
        //重命名文件
        ftpWebReq.RenameTo = "111.jpg";

3.FtpWebResponse类

        FtpWebResponse response = ftpWebReq.GetResponse() as FtpWebResponse;
        //关闭ftpResponse
        if (response == null)
            return;
        response.Close();
        //返回从服务器返回流
        Stream sm = response.GetResponseStream();
        
        
        //=====重要成员=====
        //1.获取接收到数据的长度
        Debug.Log(response.ContentLength);
        //2.接收数据的类型
        Debug.Log(response.ContentType);
        //3.服务器下发的最新状态码
        Debug.Log(response.StatusCode);
        //4.服务器下发的最新状态码的文本
        Debug.Log(response.StatusDescription);
        //5.登录前建立连接时FTP服务器发送的消息
        Debug.Log(response.BannerMessage);
        //6.FTP会话结束时服务器发送的消息
        Debug.Log(response.ExitMessage);
        //7.FTP服务器上的文件的上传修改的日期和时间
        Debug.Log(response.LastModified);

二.FTP上传

public class Lesson12 : MonoBehaviour
{
    
    
    private void Start()
    {
    
    
        try
        {
    
    
            NetworkCredential networkCredential = new NetworkCredential("zzs", "zzzsss123");
            FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri("ftp://127.0.0.1/pic.jpg")) as FtpWebRequest;
            if (ftpWebRequest == null)
                return;
            //必须设置为空,不然报错    
            ftpWebRequest.Proxy = null;
            ftpWebRequest.Credentials = networkCredential;
            ftpWebRequest.KeepAlive = false;
            ftpWebRequest.UseBinary = true;
            ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;
            Stream upLoadStream = ftpWebRequest.GetRequestStream();
            string path = Application.streamingAssetsPath + "/test.jpg";
            using (FileStream fs = new FileStream(path, FileMode.Open))
            {
    
    
                byte[] buffer = new byte[1024];
                int readLength = fs.Read(buffer, 0, buffer.Length);
                while (readLength > 0)
                {
    
    
                    upLoadStream.Write(buffer,0,readLength);
                    readLength = fs.Read(buffer, 0, buffer.Length);
                }
                fs.Close();
            }
            upLoadStream.Close();
            Debug.Log("完成!");
        }
        catch (Exception e)
        {
    
    
            Debug.Log(e);
            return;
        }
    }
}

三.FTP上传封装

1.协程实现

    private IEnumerator UpLoadFile(string fileName, string path, Action action = null)
    {
    
    
        NetworkCredential networkCredential = new NetworkCredential(UserName, Password);
        FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri(FtpURL) + fileName) as FtpWebRequest;
        if (ftpWebRequest == null)
            yield break;
        ftpWebRequest.Credentials = networkCredential;
        ftpWebRequest.Proxy = null;
        ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;
        ftpWebRequest.KeepAlive = false;
        ftpWebRequest.UseBinary = true;

        Stream ftpRequestStream = ftpWebRequest.GetRequestStream();

        using (FileStream fs = new FileStream(path,FileMode.Open,FileAccess.Read,FileShare.Read))
        {
    
    
            byte[] buffer = new byte[10240];
            int length = fs.Read(buffer,0,buffer.Length);
            while (length>0)
            {
    
    
                ftpRequestStream.Write(buffer,0,length);
                length = fs.Read(buffer,0,buffer.Length);
                yield return null;
            }
        }
        ftpRequestStream.Close();  
        action?.Invoke();
    }

2.Task多线程实现

    public async void UpLoadFileAsync(string fileName, string path, Action action = null)
    {
    
    
        await Task.Run(() =>
        {
    
    
            NetworkCredential networkCredential = new NetworkCredential(UserName, Password);
            FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri(FtpURL) + fileName) as FtpWebRequest;
            if (ftpWebRequest == null)
                return;
            ftpWebRequest.Credentials = networkCredential;
            ftpWebRequest.Proxy = null;
            ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;
            ftpWebRequest.KeepAlive = false;
            ftpWebRequest.UseBinary = true;

            Stream ftpRequestStream = ftpWebRequest.GetRequestStream();

            using (FileStream fs = new FileStream(path,FileMode.Open,FileAccess.Read,FileShare.Read))
            {
    
    
                byte[] buffer = new byte[10240];
                int length = fs.Read(buffer,0,buffer.Length);
                while (length>0)
                {
    
    
                    ftpRequestStream.Write(buffer,0,length);
                    length = fs.Read(buffer,0,buffer.Length);
                }
            }
            ftpRequestStream.Close();  
            action?.Invoke();
        });
    }

Guess you like

Origin blog.csdn.net/zzzsss123333/article/details/125432999