急!求助,Delphi数据转发服务器设计!在线等待!

rainbow_57 2012-02-27 09:01:35
这次的项目,是对已投入使用的程序做修改,Delphi的源码。
原来的设计是这样的,外网,600-1000个GPRS客户端,连接到一个服务器A。
但现在客户要求能开多个服务器,也就是说,原来只与一个服务器通讯的客户端,可能要与多个服务器通讯。
通讯有两种:一种类似心跳,只要接收到,就发给全部的服务器,另外一种,是服务器发指令给某个客户端,某个客户端回应。

我目前的设计是,在中间加一个代理服务器,通过代理服务器的SocketServer链接外网客户端,SocketClient链接内网的服务器A、B、C……,至于要创建几个内网SocketClient通过取数据库中的在线服务器表来获得。在接收到心跳时SocketServer将数据交给每个SocketClient发送,在接收到服务器A的指令时,交给SocketServer发送。

现在有几点疑惑:
1、内网服务器A、B、……是不是只能从数据库中的在线服务器表来获得?这好像是最原始的办法。
2、服务器A发送出来的指令,是发给外网的哪个客户端,怎么识别?指令上没有标识,以前是直接连接,可以保持这个链接,现在有个中介的服务器隔着。

因为以前没有做过服务器这块,还是个菜鸟,呵呵。

不知道有没有更好的办法,希望各位大侠多多指点。
...全文
295 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuihan20e 2012-05-10
  • 打赏
  • 举报
回复
说实话,你的表达让我很头晕,好像你把服务器和客户端给搞反了
按我的理解来说吧
你可以加一个负载均衡的硬件设备来实现,这样对外,只有一个服务器,具体由哪个服务器来工作,是用负载均衡来分配的
hetulink 2012-05-10
  • 打赏
  • 举报
回复

如果没有解决,我也许可以帮忙,做过类似问题的方案。 QQ1965-283-135
hetulink 2012-05-10
  • 打赏
  • 举报
回复

这个问题解决了吗?

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

可以在 a, b, c 和 master 之间保持一种心跳的机制来获取此时在线的服务器列表

然后client登录master的时候, 由master分配一个IP给client来连接就可以了

不知表达是否清楚, 欢迎拍砖.
mhhaifeng 2012-02-29
  • 打赏
  • 举报
回复
不改客户端? 我想可以这样:
1。在在线服务器表里加一个字段,表时这台服务器已经连接的客户端数
2。客户端连接中间服务器时, 先判断 在线服务器表里的客户端连接数 ,自动选择在线数最少的服务器连接
3。现在客户端都连上在线数最少的服务器端了 修改在线服务器表的客户端连接数
这样做,中转服务器端负担会不会太大?所有数据都通过它转发

方法二 修改客户端 如上面所说 设个 引导服务器 由用户自已选择登录那台服务器
rainbow_57 2012-02-28
  • 打赏
  • 举报
回复
我现在是准备在内网服务器发出的指令上加客户端的ID码来解决,还不知道行不行得通。

对于内网服务器是否在线,我有个想法,不知道能不能行得通。

因为中介服务器的IP是固定的,对内网服务器来说可知,不知道能不能在内网的服务器打开以后,主动链接中介服务器的IP呢?这样就不用频繁读取数据库了。
rainbow_57 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lzg827 的回复:]
客户端应该也要配合升级吧。
不然有点麻烦啊,如你所说,客户端怎么知道那个服务器呢?
[/Quote]

客户端不需要升级,所有的客户端,都是一样的,只需要收到指令验证密码正确就返回对应的数据,不用管哪个服务器,只要设置的服务器IP和端口正确就行。
rainbow_57 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sz_haitao 的回复:]
通讯有两种:
1、类似心跳,只要接收到,就发给全部的服务器,
2、是服务器发指令给某个客户端,某个客户端回应。

2不用修改吧
1可以由收到的服务器在数据库里加一条记录,其它服务器从数据库里查到就行了
[/Quote]

呵呵,看到你的三星等级,我只有仰望的份啊。

我倒是觉得心跳好解决。只要在收到心跳的时候对在线的内网服务器转发一次就可以了。
第二种情况,我是基于没有做这个中介服务器之前的情况说的,原来只需要保持服务器和对应的客户端的链接就行了,现在是中间加了一个转发的服务器,那就要知道内网服务器的指令是发给谁的。

感谢你的建议。
目前我查找在线服务器是从数据库的表中取的,每两分钟取一次。不过现在发现对应的内网服务器会在4个小时左右打不开数据库表。
不知道是我测试环境都是在本本上,性能不足,还是频繁的取数据库导致其他程序存取出错,还没排查原因。
lzg827 2012-02-28
  • 打赏
  • 举报
回复
客户端应该也要配合升级吧。
不然有点麻烦啊,如你所说,客户端怎么知道那个服务器呢?
funxu 2012-02-28
  • 打赏
  • 举报
回复
我是来学习的,希望这贴能有些技术讨论的说
haitao 2012-02-27
  • 打赏
  • 举报
回复
通讯有两种:
1、类似心跳,只要接收到,就发给全部的服务器,
2、是服务器发指令给某个客户端,某个客户端回应。

2不用修改吧
1可以由收到的服务器在数据库里加一条记录,其它服务器从数据库里查到就行了
xuwuli 2012-02-27
  • 打赏
  • 举报
回复
既然服务器的功能都是一样的,那可做一个引导服务器,然后将客户端根据服务器的不同负荷情况进行分配,也是有感而发,学习中...
rainbow_57 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 case5166 的回复:]
由于服务器数量可能不是固定的,所以在这方面我也困惑
[/Quote]

服务器数量目前来说确实是不固定的。
所以我原先考虑的是,把服务端的代码改成客户端,然后像外网的Client一样链接新建的服务器(中介),
这样可以动态创建链接,而跟客户端的通讯,就像聊天室一样。

但这样做感觉工作量蛮大,时间上可能来不及,所以暂时没考虑。
采取了另外一种方案,把中介服务器作为内网服务器的客户端来处理。
rainbow_57 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiaofansong 的回复:]
我们系统是这样做的
有一个引导服务器,所有的用户会登这个引导。然后引导服务器会分配各自的用户连上不同的功能服务器
[/Quote]

谢谢你的回答。不过我麻烦的地方是在,服务器功能全部都是一样的。指令只有服务器这边主动发起,客户端只能发心跳表示在线,而且指令中不包含某个客户端的特殊标志的。
我看见佛 2012-02-27
  • 打赏
  • 举报
回复
由于服务器数量可能不是固定的,所以在这方面我也困惑
一剑飘雪 2012-02-27
  • 打赏
  • 举报
回复
我们系统是这样做的
有一个引导服务器,所有的用户会登这个引导。然后引导服务器会分配各自的用户连上不同的功能服务器

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧