我想用双向对等FTP服务来实现小型企业的分布式,弱实时的双向信息交换。我实现了一个FTP的服务器和客户机的软件系统。 已经实际使用了五年,客户很满意,因为我的服务器端可以提供许多信息,给于管理者许多便利。和网络设备供应商提供的 网络软件一起,有效地管理了约五百个用户的信息上传。 网络设备供应商提供的 网络软件可知网络上的可达性,我的系统可知对方软件的可用性。现在的问题是想更进一步,目前的状况是单向的,即客户端向服务器提供数据文件。服务器对客户机的管理无能为力。例如文件没有能传上来,或者需要重发,都只能通知 对应的客户机所在公司,无法发命令给客户机本身。 另外服务器需要提供对客户机的信息传递。该系统保护很严, 用了VLAN和防火墙,基本上只能单向传递,客户机互不相连,服务器也PING不到客户机 服务器所在的公司和客户机所在的不是同一公司,所以控制严格,甚至网站形式的交流都没有,所以既是一个内部网,有类似于一个 封闭的广域网,有了这套软件,就显得比较宝贵,想扩大使用。现在想在服务器端建立一个类似于应用服务器类似概念的服务程序,来完成客户端对服务器端的查询等一系列工作。 因为客户端是专用的,所以可以扩大改造。例如发送sql语句, 让该应用程序来完成, 现在的问题就是,一旦一个FTP连接建立后,都是客户方主动的,客户方交给服务器方一个服务请求后, 返回处理结果为一个文件,要让客户方接受文件,需要客户方定时检查,这就浪费了网络资源和处理器资源。最后的方法是让客户端也成为一个服务器,这样客户端就不必关心服务器一方的状态 ,一旦服务器完成了相应的处理,就立即把结果传回该客户机的服务器,到指定的目录下,客户端只要监控这个目录就可以了,无需任何资源。 因为现在的网络设置,无法在服务器端主动发起FTP连接,所以在客户机上单独 设立FTP服务器也是没有的,只能寄存在客户软件中。所以就是对等的FTP服务。也许单独的socket服务器和客户器可以实现我的要求,但是我比较喜欢 FTP的双通道的策略, 一个通道实现命令交流,一个通道实现数据交流, 所以我就想扩大我的FTP的客户端和 服务器 端的初衷。在google未能查到双向对等FTP, 不知道这里的高手能否提供 思路,先谢了。

解决方案 »

  1.   

    FTP协议太弱,不值得用来实现较复杂的业务逻辑直接用C/S架构,长连接,自定义协议,90%的业务系统都是基于C/S架构的
      

  2.   

    FTP协议就不支持你的这种需求,就是被设计出来客户端向服务端发送/获取文件的。只能自己开发一套软件了。
      

  3.   

    通过c/s方式实现。你如果实现了cs,你会发现,比你现 在的方式要方便 灵活,有效的多。只是你现在还没有习惯而已。
      

  4.   

    C/S结构,ftp也属于这种架构,只是ftp不支持断点续传,恐怕楼主要改造下ftp程序。
      

  5.   

    修改后重贴
    我想用双向对等FTP服务来实现小型企业的分布式,弱实时的双向信息交换。我实现了一个FTP的服务器和客户机的软件系统。 已经实际使用了五年,客户很满意,软件的实用性也得到了检验,因为我的服务器端可以提供许多信息,给于管理者许多便利。和网络设备供应商提供的网络软件一起,有效地管理了约五百个用户的信息上传。 网络设备供应商提供的 网络软件可知网络上的物理可达性,我的系统可知对方软件的可用性。现在的问题是想更进一步,目前的状况是单向的,即客户端向服务器提供数据文件。服务器对客户机的管理无能为力。例如文件没有能传上来,或者需要重发,都只能通知对应的客户机所在公司,无法发命令给客户机本身。 另外服务器需要提供对客户机的更多的信息服务。该系统保护很严,用了VLAN和防火墙,基本上只能单向传递,客户机互不相连,服务器也PING不到客户机 服务器所在的公司和客户机所在的不是同一公司,所以控制严格,甚至网站形式的交流都没有,所以既是一个内部网,有类似于一个封闭的广域网,有了这套软件,就显得比较宝贵,想扩大使用。现在想在服务器端建立一个类似于应用服务器类似概念的服务程序,来完成客户端对服务器端的查询等一系列工作。 因为客户端是专用的,所以可以扩大改造。例如发送sql语句,让该应用程序来完成,现在的问题就是,一旦一个FTP连接建立后,都是客户方主动的,客户方交给服务器方一个服务请求后,返回处理结果为一个文件,要让客户方接受文件,需要客户方定时检查该结果文件是否存在,一旦存在了就下载,这就浪费了网络资源和处理器资源。最好的方法是让客户端也成为一个服务器,这样客户端就不必关心服务器一方的状态 ,一旦服务器完成了相应的处理,就立即把结果传回该客户机的服务器,到指定的目录下,客户端只要监控这个目录上的事件就可以了,而我们知道事件监控无需什么资源。 因为现在的网络设置,无法在服务器端主动发起FTP连接,所以在客户机上单独 设立FTP服务器也是没有可能性的,所以只能寄存在客户软件中。这就是我要的对等的双方互为服务器的FTP服务。另外的一个原因是我做过实验,在这种多线程的环境中每个线程的数据库操作时不可用的。所以只能用一个应用服务器类似的程序来对上传的查询来检验。我不太知道现在在新软件技术中,数据库操作在线程中是否可用。我的程序是在最早的visual studio上做的。但是服务器在windows 2000和2003上都可以用, 客户端在windows 98 到最新的Windows 7都可以用。 也许单独的socket服务器和客户器可以实现我的要求,但是我比较喜欢FTP的双通道的策略, 一个通道实现命令交流,一个通道实现数据交流, 所以我就想扩大我的FTP的客户端和 服务器 端的初衷。综上所叙,就是由外部客户端发起连接的,一旦连接后,双方各为客户端和服务器端的双向对等FTP。在google未能查到双向对等FTP, 不知道这里的高手能否提供思路,先谢了。
      

  6.   


    如果FTP服务器端和客户端都是配套自己写的话,可以直接扩展FTP,加入自己定义的命令的。例如定义一个"Check"命令,客户端发送这命令到服务器端,检查有没有什么更新,服务器如果有更新的话,返回可更新的文件的文件名和目录,客户端可以根据这个去更新文件;也可以返回没更新或其它信息。FTP只是一个应答式协议,你可以在以之上扩展,只能你想不到的,没有做不到的,当然前提是FTP客户端和服务器端程序都是自己写的。
      

  7.   

    在FTP协议上扩展,那还不如直接使用C/S长连接,自定义协议FTP和HTTP都是短连接应用,客户端永远是主动方,服务器永远是被动方
    这种框架就决定了,服务器端无法主动发起业务逻辑FTP协议太弱,根本不值得花精力去基于FTP来设计复杂的业务逻辑 
      

  8.   

    你好,FTP服务器端和客户端都是自己的。我就是想直接扩展FTP,Check命令本身都有的,只要检查某个制定文件的大小size()是否大于零就可以知道我要的文件是否存在。我想要的是在服务器端有“推”的功能。即服务器端主动推出某个文件,让客户端去接受,而不是要客户端去轮寻。现在就是我已经想到了,但是有点做不到的,或者说不知道怎么才能做到。 谢谢你的回应。
      

  9.   


    谢谢你的回复, FTP协议确实是客户端永远是主动方, 所以我要的是对等FTP, 双向FTP, 昨天我看了你的回复, 去查了长连接, 发现有篇文章对我有点启发, 即如何在服务器端推出自己的文件.我现在基本上准备就是用等待的轮寻方法,每隔两秒钟区检查一次是否存在回答文件, 基本上这时间是不算长的等待时间.许多人都推荐用cs, 我不太知道,在这样严格的网络限制下, 数据库是否能够穿透防火墙,另外500个用户的数据库版权费也是很大的费用. 如果这样的话,我还是用CORBA. 我主要是看看有些什么启发性的建议.
      

  10.   

    写错了,不是CORBA, 只是简单的应用服务器。客户端和应用服务器相连,应用服务器和数据库相连。
    本系统对实时性要求不是很高。几秒几分钟都没有问题,所以我称为弱实时。FTP是最便宜的也是有效的。现在只是想扩充功能。
      

  11.   

    假如FTP客户端是你自己写的,那就很容易了你只需要将客户端逻辑由短连接改成长连接就行了标准FTP客户端是典型短连接同步模式,其业务流程为:
    1、建立连接
    2、发送请求
    3、接收应答
    4、关闭连接你只需要将客户端改造为异步长连接模式,其业务流程为:
    1、建立连接
    2.1、if(用户发起需求)加入任务队列
    2.2、if(服务器发起需求)加入任务队列
    2.3、if(任务队列不空)执行一条任务
    3、关闭连接其中2.1、2.2、2.3是3个线程并发
      

  12.   

    啊,为什么搞那么复杂呢?既然网络结构已经设计为不能从server到client。
    那就很简单的,在client每次传输文件之前,链接ftpserver之后,先从ftp server得到一个上次结果的传输结果文件。经过check,如果上次没有传输成功,那么在这次传输一并处理。这样就避免了轮训server的操作,不会影响server性能。server所需要做的事情就是在每次客户端链接的时候。把上次的结果文件告诉给ftpclient。并且把每次传输的结果导出成一个文件而已
      

  13.   

    .你好,我觉得你对FTP不是很了解。我想你一定用过,但是如果没有用过的话, 你可以下载一个FTP图形界面的客户端程序来试验一下。FTP本身就是长连接的,只要客户端不断开联系,并且服务器端不赶你走, 就一直保持联机。首先客户端发送连接请求,一旦服务器程序的LISTEN SOCKCT接收到了Accept事件,就产生一通讯线程Connect Thread, 并且把这个已经连上的Socket用detach()的方法脱手给该通讯线程, 后续事情就让该通讯线程去处理了。该通讯线程接手后,第一件事情就是向客户端发送一个欢迎回答信号,FTP通讯的回答信号都是字符串,前面用三位数号码表示.欢迎回答信号的号码就是'220 Welcome to FTP Server'.一旦客户端接收到这个回答,就回复一条FTP命令, FTP客户端的命令也是字符串,一般都是四个字母.例如此时客户端的FTP命令就是'USER ABCD', 告诉服务器的通讯线程我要用ABCD登陆,服务器的通讯线程就检查此用户的合法性,一旦可以就发回'331',提示给出密码, 客户端就发出'PASS mypassword', 收到此命令,通讯线程就检查密码, 一旦通过,就发回'230', 此过程我用我的服务器上的log来给你演示, [59C]是线程号, 其左侧是事件发生的时间, 右侧是来回的通信: 2 21/09 09:35:24.786FTP Server started on port 1234.
     2 21/09 09:36:39.817[59C] Client connected from 10.10.10.2 1120. 
     2 21/09 09:36:39.864[59C] 220 Welcome to FTP Server
     2 21/09 09:36:39.879[59C] USER 02-05-08
     2 21/09 09:36:39.926[59C] 331 Password required for 02-05-08
     2 21/09 09:36:39.942[59C] PASS 9BCD4C3240
     2 21/09 09:36:39.989[59C] 230 User successfully logged in.
     2 21/09 09:36:40.004[59C] TYPE A
     2 21/09 09:36:40.051[59C] 200 Type set to A
     2 21/09 09:36:40.067[59C] SYST
     2 21/09 09:36:40.114[59C] 215 UNIX emulated by FTP Server
     2 21/09 09:36:40.129[59C] QUIT
     2 21/09 09:36:40.192[59C] could not send reply, disconnected. --220 Bye
     2 21/09 09:36:40.207[59C] Client disconnected from 10.10.10.2.当客户端发出QUIT, 就断了之间的联系.当要进行文件传送的时候, 客户端就会根据设定发出PASV或者PORT命令,然后就是STOR(上传)或者RETR(下载)命令
     2 24/09 14:50:23.921[AA0] PASV
     2 24/09 14:50:23.968[AA0] 227 Entering Passive Mode (10,10,10,10,194,179)
     2 24/09 14:50:23.984[AA0] STOR upload\20090921
     2 24/09 14:50:24.062[AA0] 150 Connection accepted
     2 24/09 14:50:24.109[AA0] Receive Default nRead = 1417
     2 24/09 14:50:24.125[AA0] OnClose
     2 24/09 14:50:24.187[AA0] 226 Transfer complete 4
     2 24/09 14:50:24.203[AA0] OK3! Upload C:\0600001\upload\20090921
     2 24/09 14:50:24.328[AA0] CWD /
     2 24/09 14:50:24.375[AA0] 250 CWD successful. "/" is current directory.
     2 24/09 14:50:24.390[AA0] SIZE ABCD.PDF
     2 24/09 14:50:24.437[AA0] 213 1417
     2 24/09 14:50:24.453[AA0] PASV
     2 24/09 14:50:24.500[AA0] 227 Entering Passive Mode (10,10,10,10,194,180)
     2 24/09 14:50:24.546[AA0] 150 Connection accepted
     2 24/09 14:50:24.609[AA0] RETR ABCD.PDF
     2 24/09 14:50:24.656[AA0] OK! Download C:\0600001\ABCD.PDF
     2 24/09 14:50:24.703[AA0] 226 Transfer complete 
      

  14.   


    1.ftp的控制连接除非超时断开或客户端主动断开,不然就是一直连着的。
    2.标准的FTP是客户端做主动,但只要做扩展,一样可以服务器端通过控制连接直接发送命令给客户端。只有你想不到的,没有做不到的。不要说是自己写的的,就算是serv-u,因为支持第三方DLL插件,我就给它做了个socks5代理的插件,客户端通过site quote发送个raw命令,就可以让serv-u本身做成个socks5代理.发挥下想象力。
      

  15.   

    转贴:通信中的长连接与短连接 同步与异步操作说明
    长连接与短连接常听到有人说长连接与短连接的 
    现在把它的概念说出来吧 这种只是一个通俗的说法
    这个连接是根据连接时间的长短定义的
    所说的都是TCP 因为只有TCP才有连接短连接就是一次操作完后断开连接长连接就是一次操作完后不断开连接连接一时保留着
    短连接常见于大客户情况 如WEB服务器
    如果每个连接都使用长连接 那么每个客户都保留一个socket 
    系统资源耗费很大 长连接则是多用于操作频繁情况
    每个TCP连接都需要三步握手 这需要时间 如果每个操作都是先连接 再操作的话那么处理速度会降低很多 所以每个操作完后都不断开 下次处理时直接发送数据包就OK了 不用建立TCP连接另外还有同步操作和异步操作
    同步操作指上一个操作返回结果后才能发下一个操作的数据包
    异步操作指先把所有的操作数据包发完后 再等待它们的返回结果
    相比较看 异步操作速度快 特别是在每个包处理方法独立的情况下 上面只是一个参考 最后要使用哪种类型还是决定于你
    如联通的短信协议就是 连接后可以发送多个短信包 但如果一段时间(如60s)没有操作 那么连接就会被关闭异步操作一般提供两个端口,一个负责接收数据,一个负责发送数据, 也有一个的就是全部发送完后再接收联通的SMS好像就是这样移动的SMS也好像是这样异步和同步不同在于:异步完成某个阶段数据处理后,并不等待处理返回结果集。这个结果集可能不会返回,可能返回但是不是由这个异步进程来处理,也可能是由这个异步进程来处理。几种现象都属正常。同步是进程在数据处理的过程中,如果存在与另外的进程交互,并且需要交互结果时,一种条件阻塞的情况。
    CMPP协议那时没有看多
      

  16.   


    FTP客户端和服务器端有一个控制连接是做命令和结果传输的,你想服务器发命令给客户端,可以直接从这里下手。服务器可以发送“0xaaaa XXX.dat",如果FTP客户端是你自己写的,就可以客户端中处理0xaaaa这个命令,假设这个命令是xxx.dat是要更新的文件,那么客户端接收到这个0xaaaa命令,就可以进行下载操作。其它命令还不是一样吗?
      

  17.   

    如果CLIENT也是你自己写的
    那解决方法还不简单吧
    插入几个新的指令就可以
    再说
    有没有上传成功,完全可以通过传输结束后的返回来获知
    5XX 失败
    2XX 成功
    4XX 临时失败 重新传输
    怎么会出现你这样的问题呢?
      

  18.   

    你的方法有参考价值,客户端使用的是标准的微软的FTP文件, 不知道这样是否能够接受。
      

  19.   

    嗯,FTP确实是长连接,那就很简单了服务器端:加个子线程发起通知,或者在原有处理网络事件的消息循环中加入一个自定义消息来发起通知客户端:修改接收逻辑,接收时判断下收到的是服务器的应答还是服务器发起的通知
      

  20.   


    我现在用了两个客户端,一个是VC的,一个是DELPHI的,vc的已经 很久了,我要重新看一下, 在DELPHI上的我还有另外一个专门的INDY的clientsocket控件来检测服务器所在的IP和端口是否可用,在FTP启动前做事前检查,只要我的服务器一停,就会在该控件上发出一个Disccount事件,很灵敏,可以让它来发出信号,或者干脆让服务器对该客户机timeout, 逼使客户机重新连接, 也许就可以起到相同的作用了,但是不够完美,有点粗野,浪费时间。
      

  21.   

    COM+呢,做分布式也很好处理吧
      

  22.   

    对于楼主这样的问题,我开发过政府部门的信息共享系统。我采用的是基于web service的共享机制。客户端通过认证连接到service端后,首先下载相关的检测信息,就如你说的上次是不是真正上传成功等等来解决你碰到的这个问题。具体的做法我想你可以了解一下web service就知道了。我个人的看法:采用ftp有诸多的问题,首先安全性问题;其次穿透防火墙保护的问题等等。而web service是一种基于http的可以绕过防火墙的一种很好的解决方法。
      

  23.   


    你的建议值得考虑,因为这是几年前的旧系统,另外使用者对信息的保护看得最重要,不允许有一丝的泄漏。所以这个系统没有HHTP服务,也没有安装database对外使用. 
      

  24.   

    支持楼主的做法,针对这个项目,有其特定性,不需要系统有更好的开放性和再次开发性。保密,安全,稳定,这是最主要的目标,所以扩展ftp对这个项目而言是正确的方向。
      

  25.   

    你的问题在于想从客户端操作IO(不知是不是此问题),微软的fso可以用来从客户端读写文件。
      

  26.   

    哈哈,我处理过楼主类似的问题。在一个客户应用中,客户的网络环境比较复杂,防火墙的配置只能使用FTP和HTTP,其它的端口开放需要很麻烦的行政流程才能开放,用户不接受。由于系统的主要功能是文件传送,因此我选用了FTP。由于服务器端和客户端都是自己写的,可以对工作流程和命令都做一些扩展。对于楼主的应用,我觉得做工作流程的扩展更容易一些。比如,客户端上传文件失败后,自动重新上传;客户端需要查询服务器的某些信息,可以自动从服务器上下载某个指定的文件,比如QueryData.exe,当服务器检查到客户端要下载这个文件的时候,执行相应的操作,然后返回结果就可以了。
      

  27.   


     谢谢两位的理解和支持, 另外FTP的文件传送使得这个客户程序本身的更新变得很容易。
      

  28.   

    我觉得可以利用WCF + FTP来实现,
    WCF负责服务器端与客户端交流会话,
    1、FTP负责文件的上传与下载,全局只需要一个FTP服务器。
    2、通过WCF向客户端发送指令集(自制指令集)
    优点:
    FTP服务器文件上传下载速度快
    服务器端与客户端进行交流的时候,由于没有大量的数据的交互,速度比较快。
    由于通过80端口进行交互,故可穿越防火墙限制。