问题描述:
  客户端A、B、C、D通过外网(InterNet)与服务器S相连接。进行远程数据交换。A、B、C、D都是通过ADSL上网,动态IP。也有可能是通过代理服务器上网。
  数据交换在A、B、C、D之间进行,为了减少对服务器的压力,打算当A要从B取得数据时,A通过服务器得到B的网络地址,然后A直接连到B进行数据交换。
  想了几种方案都有缺陷,哪位高手能出一个好的方案,多谢。
  

解决方案 »

  1.   

    A向S发出申请(与B传递数据)
    服务器S向B发出申请(请求与A建立连接)
    B同一连接,打开端口(由软件控制)
    S向A发送B的地址,向B发送A的地址(服务器实时更新A  B的IP地址,当地址变化时向A  B更新)
    A接受B地址后向B发起连接,端口为软件设置
    B判断连接的IP,如果非A则拒绝,如果是则允许接入
    (或者可以设定密码,改密码是隐性由服务器发送双方接受的,不会被查知)
    (如果要求的密级更高,可以考虑用证书方式,一次性使用)综上:
    需要注意的问题:1需要A  B  C  D 均有相应软件支持
    或者从服务器下载的插件
    又或者时刻登陆S ,由S的插件实现
      

  2.   

    ADSL虽然是动态分配IP地址的,但是每个ADSL都有一个固定码的,也是四位的IP,用此判定就行了^_^
      

  3.   

    建议LZ去学习一下 点对点传输(P2P原理)和断点传续
      

  4.   

    谢谢关注。
    我考虑是在S上进行监听,记录ABCD的网络地址,A要从B下载数据时通过S转发,A与B用UDP建立连接,进行通信,但丢包问题不好处理。哪位高手有比较好的方案。
      

  5.   

    传输数据,最好用TCP, Sokcet(客户) 与 ServerSocket (服务器)
      

  6.   

    TCP如果监听在服务器端的话服务器端压力太大的。客户端不指ABCD可能有几K个。而服务器却差得要命。
    如果TCP监听设置在客户端那么监听的端口号怎么取得呢。客户端通赤路由上网时对外网的端口号并不是本地取得的。比如本地用1999在外网看来则是36119。
      

  7.   

    谢谢关注,现在唯一问题就是“TCP穿透NAT”原理我明白。求源码。最好是VB或JAVA的。分不够可以加。