这次的项目,是对已投入使用的程序做修改,Delphi的源码。
原来的设计是这样的,外网,600-1000个GPRS客户端,连接到一个服务器A。
但现在客户要求能开多个服务器,也就是说,原来只与一个服务器通讯的客户端,可能要与多个服务器通讯。
通讯有两种:一种类似心跳,只要接收到,就发给全部的服务器,另外一种,是服务器发指令给某个客户端,某个客户端回应。我目前的设计是,在中间加一个代理服务器,通过代理服务器的SocketServer链接外网客户端,SocketClient链接内网的服务器A、B、C……,至于要创建几个内网SocketClient通过取数据库中的在线服务器表来获得。在接收到心跳时SocketServer将数据交给每个SocketClient发送,在接收到服务器A的指令时,交给SocketServer发送。现在有几点疑惑:
1、内网服务器A、B、……是不是只能从数据库中的在线服务器表来获得?这好像是最原始的办法。
2、服务器A发送出来的指令,是发给外网的哪个客户端,怎么识别?指令上没有标识,以前是直接连接,可以保持这个链接,现在有个中介的服务器隔着。因为以前没有做过服务器这块,还是个菜鸟,呵呵。不知道有没有更好的办法,希望各位大侠多多指点。

解决方案 »

  1.   


    服务器数量目前来说确实是不固定的。
    所以我原先考虑的是,把服务端的代码改成客户端,然后像外网的Client一样链接新建的服务器(中介),
    这样可以动态创建链接,而跟客户端的通讯,就像聊天室一样。但这样做感觉工作量蛮大,时间上可能来不及,所以暂时没考虑。
    采取了另外一种方案,把中介服务器作为内网服务器的客户端来处理。
      

  2.   

    我现在是准备在内网服务器发出的指令上加客户端的ID码来解决,还不知道行不行得通。对于内网服务器是否在线,我有个想法,不知道能不能行得通。因为中介服务器的IP是固定的,对内网服务器来说可知,不知道能不能在内网的服务器打开以后,主动链接中介服务器的IP呢?这样就不用频繁读取数据库了。
      

  3.   

    设想 服务器   a, b, c
      索引服务器  master
      客户端      client可以在  a, b, c 和 master 之间保持一种心跳的机制来获取此时在线的服务器列表然后client登录master的时候, 由master分配一个IP给client来连接就可以了不知表达是否清楚, 欢迎拍砖.
      

  4.   

    首先,你做个代理服务器的做法是对的,由这个代理服务器来管理服务器A,B列表,如果是在内网是好办的,TCP本身就有心跳检测机制,不需要通过数据库来解决,如果通过数据库的话,碰到网线断了之类的异常就不好处理了,网上也有很多,我自己就用INDYTCPSERVER来做的,在CONNECT时加入心跳检测,DISCONNECT时就去列表中删除对应的客户端,比通过数据库方式准确得多,至于你第2点担心,外面的客户端只需要连接代理服务器,跟原先没有区别,就是你代理服务器要做的工作可能就要多点了,要在与其他服务器通讯时记住数据是有外部的哪个连接送来的