公司的一个项目功能,需要通过ftp实现一系列功能,主要功能有三个,

1,获取服务器上的某个路径下的内容;

2,将本地的图片上传至服务器;

3,将服务器上的文件下载到本地。

最开始做的时候,定的方向是,网上找ftp的sdk,或者demo,然后集成到项目中来,在Github上找了很多也下下来,试了,最后决定用的是LxFTPRequest

使用起来也比较简单,只需要将对应的参数传入,然后block回调那里做相应的处理即可,但是,做到后面快完工的时候,测试发现,内网所有操作都ok,一切到外网,直接报错,错误信息,还是unknow,然后就去换了其他的demo,还试了苹果官方的ftp demo,https://developer.apple.com/library/content/samplecode/SimpleFTPSample/Introduction/Intro.html,错误信息都一样,没办法解决,后面通过Wireshark抓包分析,得到一个错误信息,500,oops啥的,最后还是没办法解决,可是安卓那边是ok的。(问题应该是在于客户端与服务端,在外网交互时,端口转发的问题,内网时,不存在端口转发和IP映射的问题,所以内网ok)

后面得知,我这边的访问方式和安卓那边不一样,我这边是通过,将IP/域名,加端口号,加上目标路径,拼接成一个url链接,然后进行访问,请求,而安卓,和windows那边的c++都不是这种形式,他们都是,通过一步一步访问服务器实现的,整个流程流大概有,建立连接,发送用户名,发送密码,设置被动模式,指定工作目录,建立第二个链接,连接数据端口,进行数据传送,等等一系列操作,这些操作的前提,就是通过自己写socket的形式实现的,所以,后面觉得自己换成这种方式,因为我自己之前的tcp的那些操作,都是用GCDAsyncSocket这个第三方,实现的,所以,在这之前就在这个sdk的基础上封装好了,用的工具类,所以写起来比较方便,但是途中还是有遇到一些问题,ftp的其实就是tcp的另一种形式,所以通过GCDAsyncSocket这个去实现ftp也是完全可以的,但是,首先得清楚ftp的一些标准协议,比如说,发什么数据给到服务端,然后应该接收到什么数据,等等,通过一番谷歌找到了一个靠谱的链接,https://www.ibm.com/developerworks/cn/linux/l-cn-socketftp/,这里详细讲解了,使用socket通信,实现ftp的客户端程序,整个流程讲的很详细,自己仔细看下就会了,接下来说一下,我写程序过程中遇到的几个问题和需要注意的地方。

1,一共需要2个 socket,一个负责命令操作,一个负责数据操作,命令操作的socket断开之后,需要重新登录(有些是匿名登陆有些是不需要登录,我这边是需要登录的,然后用户名和密码是需要去获取的,随机生成的,所以命令socket断开之后,需要重新去请求用户名和密码,然后重新登录);此外数据socket只能用一次,意思就是,你进行一个下载操作,数据传输完了之后,不管服务端有没有将数据连接断开(已经建立socket的链接,如果链接断开,会收到断开的信息,已经断开原因),我们都需要手动将数据socket断开(这里只是断开连接,不是销毁),然后进行第二次操作的时候,如果命令socket没有断开的话, 只需要从设置被动模式开始,进行操作,(针对被动模式,主动模式的话,去上面那个链接查看),如果断开了,则需要从建立命令socket链接开始。

2,被动模式的话,每次建立的数据socket都需要重新发送pasv,然后根据收到的数据,计算端口号,重新建立数据socket链接,进行数据传输。(socket可不用重新创建)

3,下载文件时,需要设置一个缓存区,即不能一次性读取需下载的数据,我设置的是2048字节,就是每次读2048,读完之后,将读到的数据保存到本地沙盒创建的文件中,这也是实现断点续传的前提,将取到的数据写入到文件时,不是一次性写入,需要用到NSFileHandle,需要注意的一点是,对同一文件重复写入数据时,需要注意写入顺序,即设置从文件末尾写入,[outFileseekToEndOfFile]。

4,上传文件时,上面的那个链接没有上传的代码示例,所以这个很烦,遇到的问题是,我收到了150,然后通过数据socket上传本地数据到服务端,跟下载一样,传完了之后,使用命令socket去接收返回结果,死活收不到数据,可是数据已经传上去了。后台那边说,需要传一个文件大小到服务器,但是后面找了很多,没发现有说要传大小,后面才知道,原来是服务端不知道文件大小,所以传完之后,不会像下载那边,会自动关掉数据socket,所以,在上传完数据之后,需要客户端手动的去关掉数据socket,然后再调用命令socket去读数据,就能接收到226,传输成功的数据信息了。(上传和下载一样需要设置缓存区,不能一次性上传)。

5,暂停时,如果传输过程中,手动暂停了,因为上述下载文件时,已经做好了的下载方式,所以,如果暂停了,本地还是会有这个文件,只不过不完整而已,下次继续下载时,需要告诉服务端一个偏移量,即,断点续传。(偏移量通过获取本地改文件的大小即可得知),还有如果暂停了,只需要断开数据链接即可,继续时,依据上述,重新请求数据端口,建立链接。

6,取消操作时,需先将数据socket断开,然后发送quit命令,收到221(用户名和密码的,还需另外发送注销用户的操作),断开命令链接即可。

7,最后附上一个ftp服务端回复数据的状态码解析:http://justcoding.iteye.com/blog/835002。

以上就是我通过socket实现ftp客户端的整个经历过程,以及遇到的问题和需要注意的地方,有不懂的地方,或者需要交流的在下方留言即可。

有关下载和上传的整个操作截图,在我下面的文章中,有需要的可以去查看了解。

iOS FTP客户端的见解相关推荐

  1. 使用FTP(IOS FTP客户端开发教程)

    本文翻译自新近Wrox出版社出版的,由Peter van de Put所著的<Professional.iOS.Programming>.该书题材比较新颖,结构合理,是一本不错的IOS开发 ...

  2. 跨平台SSH客户端/Linux VNC客户端/Windows RDP客户端/FTP客户端 推荐 Royal TSX

    跨平台SSH客户端推荐 Royal TSX 使用界面 SSH客户端 RDP客户端 FTP客户端 Windows下载地址:https://www.royalapps.com/ts/win/downloa ...

  3. ftp客户端android版,Primitive FTPd(FTP客户端)

    Primitive FTPd开源并且没有广告,这款来自于fdroid商店当中的软件让用户能够用完全自定义的方式俩进行文件上面的传输,使用起来简单方便不用担心隐私和权限等多种方面的问题,是安卓上面进行F ...

  4. 网络编程--ftp客户端的实现(c#版)

    .net2.0对ftp有了一个很好的封装,但是确容易让人忽略ftp的真正内部实现,下面是我实现的ftp客户端的功能,其主要步骤是这样的: 1.创建一个FtpWebRequest对象,指向ftp服务器的 ...

  5. 基于XMPP的IOS聊天客户端程序(XMPP服务器架构)

    最近看了关于XMPP的框架,以文本聊天为例,需要发送的消息为: <message type="chat" from="kang@server.com" t ...

  6. 安装ftp连接linux服务器配置,Linux下FTP安装及配置(VSFTPD服务器安装配置、FTP客户端安装配置)...

    安装说明 安装环境:CentOS-6.3 安装方式:yum安装.rpm源码安装 软件:ftp-0.17-51.1.el6.x86_64.rpm 下载地址:http://pan.baidu.com/s/ ...

  7. ftp 客户端 上传

    ps: 1.使用netkit-ftp-0.17交叉编译出来的ftp客户端, 2.然后写上传代码,调用ftp传服务器: 3.最好使用bin二进制文件形式传输: 4.ftp客户端和Ubuntu自带的ftp ...

  8. 18. 编写FTP客户端程序

    在实际应用中可能经常访问FTP服务器来上传或下载文件,Python也可以替我们做这些. [示例 1]下面请看一个例子(ftpclient). 运行的结果如下: FTP客户端程序的编写还可以参照官方文档 ...

  9. windows ftp服务器_ftp客户端软件,推荐6个流行的FTP客户端软件

    无论你是做网站工作,还是运行一个家庭FTP服务器,或者你只是喜欢高速下载,一个稳定且功能齐全的FTP客户端工具都可以节省你大量时间和生命,现在有大量的免费或者收费的FTP客户端软件供大家选择,这里总结 ...

最新文章

  1. Vue $createElement
  2. 使用Apache来构建URL缩短服务
  3. Linux命令集合(更新中。。。)
  4. maven报错解决: -source 1.5 中不支持 diamond 运算符
  5. [转]25个增强iOS应用程序性能的提示和技巧
  6. Spring MVC 入门笔记
  7. 线段 LibreOJ - 10007(贪心)
  8. Qt使用qss文件管理stylesheet
  9. gin redis 链接不上_Redis 高并发问题,及解决方案!
  10. JavaScript:windows关机效果
  11. wpf的listview编辑指定列_将项目添加到WPF ListView中的列
  12. 零基础学Python可以学会吗?
  13. js获取内网ip_WebRTC安全问题:私有IP与mDNS
  14. websocket 如何知道对方断开_在爱情里你知道该如何和对方相处吗?
  15. 关于Albedo贴图、颜色贴图、Metallic 贴图、Specular贴图、法线贴图、视差贴图、凹凸贴图、Height Map高度贴图、AO 贴图Occlusion 贴图、Emission 贴图等
  16. Android 安卓腾讯云互动直播开发新手入坑几点建议
  17. 如何运用eclipse的编写Java程序
  18. 【IDEA】idea取消英语拼音提示绿色波浪线
  19. python 获取前几天的日期
  20. Win11-GTX3060-配置Pytorch GPU

热门文章

  1. ABP学习一(.Net6 API 整合 ABP)
  2. 钢七连实战C3-P2:项目源码结构 面向对象基础 堆分配
  3. 5G NR室分共享覆盖解决方案
  4. 使用python实现正态分布检验
  5. 想要制定平面图?Visual Paradigm教你这么做!
  6. [足式机器人]Part1 序言+简介Ch01——【Legged Robots that Balance 读书笔记】
  7. Android 口令实现(自己复制,返回首页设置不显示)
  8. 【SWAT水文模型】SWAT水文模型建立及应用第三期:基于中国土壤数据库建立土壤库(待更新)
  9. html禁止自动播放音乐代码,HTML Audio autoplay用法及代码示例
  10. Extjs grid只能显示一条数据的问题