需求是这样的,说:1.有公网服务器A,可以提供http,ftp等任意服务;
2.有局域网B,B内有计算机B1,B2,B3.....Bn;(n可能会很大,二三百或者四五百)现在要求:
1.B内有机器(BX)开机时,就从A下载一个文件,BX下载完毕后,发送给B内的其它机器;
2.BX在下载时,B内的其它机器不得从A下载;
3.BX在下载时,如果出错,B内的其它机器,要有一个顶替BX,开始下载,下载完毕后发送给B内的其它机器;
听完这需求我当时第一反应就是“我艹~~~~”。想了几天没什么头绪,希望高手给指点下~~~难点:
1.怎么确定哪台服务器最先开始从A下载;
2.B内的其它机器,怎么知道已经有一台机器已经开始从A下载了;
3.最先开始下载的机器挂了以后,其它机器怎么知道它挂了,怎么去代替他下载?

解决方案 »

  1.   

    在B机器里面一台作为管理者,其他机器向它汇报,由这台决定B里面的机器向A下载的过程。
      

  2.   


    难点:
    1.怎么确定哪台服务器最先开始从A下载;    
    2.B内的其它机器,怎么知道已经有一台机器已经开始从A下载了;
    3.最先开始下载的机器挂了以后,其它机器怎么知道它挂了,怎么去代替他下载?
    答:
      在B机器里面一台作为管理者
      BX开机时,向B的管理者数据库读取表A中的A1字段,如果A1字段值为1,则代表已有机器正在下载,不开始下载任务,如果A1字段值为0,则将A1字段值改为 1,A2字段值改为 BX的计算机名,并开始下载任务。
       问题1,2就解决了。
      管理的机器通过socketconnect与BX建立连接,与如果BX的下载挂了,管理的机器就通过socketconnect,随机找一台与之能通讯的BY,通知BY去下载。BY下载前再重新修改一下表A中的A1和A2字段值
      

  3.   

    1. A机只能提供特定端口(比如你说的HTTP、FTP)服务吗?2. B1~Bn在同一个内网吗?
      

  4.   

    如果文件不大,都从A下载好了一定要节省A的流量,则需要在B里找固定的建立服务器,其它电脑都看它好了如果一定都是平等的,则电脑间的协议会复杂很多:通过群发建立服务器
      

  5.   

    1、Bn在下载前,先从A获得一个配置文件,这人配置文件就是告诉是谁在下载,或者谁下载了。
    2、如果从配置文件上得知 ,有人在下载了,那就等。
    3、如果从配置文件上得知, 有人下载完了,就去找他罗。注意:正在下载的B,要间隔时间往A写下备注信息,说我正在下载啦,最后更新时间是什么时候啦,这样就防止突然断线了,其它机子在死等。
      

  6.   


    这样做,其实B内所有机器都会先访问A,去查看(下载)一下配置文件。而本方案其实就是为了最大程度的减少公网A服务器的压力。最好做到,内网B内,只有一台机器需要访问A。
      

  7.   

    你可以在A运行一个服务器端,当B有机器连线时,不接授B内其它机器的连接,当B内当前连接的机器掉线时,再开放B内别的电脑进行连接,B内当前进行下载的电脑把这个文件下载完后,以广播的形式向B内其它电脑发送这个文件
      

  8.   

    老板漏掉了一项,需要建立一个服务器来管理所有的B电脑。由他来管理和分配谁可以作为BX
      

  9.   

    提供个思路: 
    服务器端
    首先建立个‘连接池’,所有B网内的机器在启动时先入池。
    按池的顺序下载文件A 同时锁定A;
    如果下载成功 清空池 下载程序结束 客户端
    连接和下载成功 分发文件A 否则什么也不做 只接受
      

  10.   


    就像tcp/ip流行以前,各个大公司自行实现的网络协议一样
    如令牌协议,有令牌者才能发言。。
      

  11.   

    1、Bn在下载前,先从A获得一个配置文件,这人配置文件就是告诉是谁在下载,或者谁下载了。
    2、如果从配置文件上得知 ,有人在下载了,那就等。
    3、如果从配置文件上得知, 有人下载完了,就去找他罗。方法有很多种,具体就要看楼主怎么使用了,祝你成功。
      

  12.   

    看了大家都思路,感觉像是server里面的域一样。
      

  13.   

    非常感谢大家踊跃发言~~
    看了大家的思路,好像基本上都是让“控制”这块在服务器A上实现。这样的话,说个稍微具体点的场景,比如:内网B里面的机器开机后,他们都通过Http向服务器请求下载File文件,当然顺序是有先有后了,那服务器A发现已经有个机器BX在下载File文件了,就不让其它机器下载了。而BX在下载File的时候,下载了一半,机器断电了(出现意外)。这个时候怎么办?BX没办法通知B内的其它机器它自己挂了,因为服务器A和内网B是Http通信,服务器也没办法通知B内其它机器下载文件的机器挂了,你们再来个兄弟顶上。这个场景就牵涉到几个问题:
    1.B内机器怎么和A通信比较合适?TCP肯定没戏,压力太大(假如B网内有500台机器,就得建立500个连接。而且还可能有C网,D网。X网)。Http也不合适,貌似只有UDP了,但是UDP这玩意,不好说呀不好说;
    2.假如还有内网C,内网D内网X,必然还牵涉到分辨网络的问题,怎么区分这个?
    非常感谢大家~
      

  14.   

    为什么非得HTTP?服务器端程序只开一条通道,如果有某台电脑先连上了,别的电脑发过来的请求不给于回复不就行了?这就没什么压力不压力了,如果当前在下载的电脑挂了,那再把通道打开,等待下一台电脑连上来,还有按你说的,用HTTP,那可以用端口复用技术,监视80端口啊
      

  15.   

    1、A有一个初始值为false的变量AA
    2、A有初始值为空的两个string类型变量IP及port,用于记录Bn
    3、A建立一个计数器,每一秒自增1,并检测是否大于120,大于则将AA置为false
    4、Bn每一分钟要求A对计数器清零,并将AA置为true
    5、B内的其他机器每两分钟检测一下A的变量AA,发现为false则自动顶上,发现IP不为空则从局域网的机器下载
    6、Bn下载完之后,设置A的IP及port,分别设置为Bn的内网IP及端口号,并启动下载服务供B内的其他机器下载
      

  16.   


    Bi下载成功才通知A:可以禁止别人下载了;A在n分钟里没得到通知,重新开放下载
      

  17.   

    TCP UDP都可以实现的,(建议用TCP)
    TCP保证你传送的顺序,不保证传送的完整性
    UDP保证你传送的完整性,不保证你的传送顺序 你自己看用哪种...
    如果你考虑机器多的话 你可以使用IOCP完成端口模型(5000+机器没有问题^_^)
    至于你那B断网问题 你可以通过心跳机制实现 
    还有 你下载个文件最多也就几分钟,文件下载完成也就转为局域网的服务了
    你觉得几分钟内有5000+的机器同时访问A的可能性有多大?在说还可以控制保留多少连接的,比如我只保留10个连接,其他的不接受。
    我最近也在研究网络这块 如不嫌弃 就一起研究吧(我用delphi 7 ) 
    我也学没有太高的水平,不过基本通信都已实现,现研究IOCP。 
    QQ41027527 (加我注明来处) ^_^! 
      
      

  18.   

    先做一个在线列表。
    知道BA-BZ的在线状态和数据下载完整的状态。
    如果BA\BB\BC一起向A获取数据,则只给其中一位提供下载。
    当BA下载完成之后,向A提供信息登记。列表里记录BA的信息,如果再有B向A申请下载,则通知B向BA获取完整数据。如果BB从BA那获得了完整数据,也向A进行登记。以后BB可以作为BA的替补。
    当BA或BB掉线时,在列表里清除他们的完整数据登记信息。
    当列表为空时,A则直接向某B提供下载。
      

  19.   

    试一下使用apache作为你的web server,使用Apache的扩展模块mod_limitipconn做连接限制
      

  20.   

    帮你upupupupupupupupupupupupupupupupupup了