朝歌勇志 发表于 2014-05-28 23:26

TCP客户端和服务器多个socket连接的问题求助

刚接到一项目,要做一个TCP客户端代理,该代理工作在linux平台上,与服务器最多时有接近1000条tcp连接,并定时发送心跳包以维持TCP连接不中断。现在要求服务器的技术实现不能有任何改动。只能在TCP客户代理上做文章。

目前想了两个方案,如下所示:

1. 在一个进程中通过for循环等方式建立这1000条tcp连接,并采用轮询或select的方式实现其他细节,如心跳包和响应等;

2. 为每一个TCP连接建立一个线程。

方案1,我写了一个简单TCP服务器和客户端程序尝试过,1000条tcp连接通信似乎没有问题,速度也能接受,但总觉得这个方案不够好。

方案2,我认为是理想的方案,但如果真是1000个客户,就要建立1000个线程,这显然也不太合适,开销也巨大。

有没有哪位大侠有更好的方案,在此谢过!

hellioncu 发表于 2014-05-29 09:02

只是代理,处理开销小,方案1不是很合适么,有啥不好?
不过一般的代理,应该得接受客户端的连接吧

朝歌勇志 发表于 2014-05-29 09:33

谢谢楼上的热心回复,方案1虽然可行,只是觉得这样实现有点怪异,不符合日常的程序设计。我这个代理工作在基站上,终端与基站是无线连接,终端没有TCP/IP协议栈,基站获取终端的数据后,TCP代理通过串口读取终端的数据,然后将数据传给服务器。

请教高手们,是否还有更好的招?谢谢!

file3 发表于 2014-05-29 09:44

按照你的业务来说,我不知道为什么要千把连接,这里应该只需要有一两个连接就可以了。可以将业务简单的划分业务逻辑为终端数据接收部分,数据发送部分与控制部分。

数据发送与数据采集部分完全隔离。

朝歌勇志 发表于 2014-05-29 10:19

本帖最后由 朝歌勇志 于 2014-05-29 10:24 编辑

回复 4# file3

file3 发表于 2014-05-29 09:44 static/image/common/back.gif
按照你的业务来说,我不知道为什么要千把连接,这里应该只需要有一两个连接就可以了。可以将业务简单的划分 ...

因为服务器那边的代码不让动,以前最早是在终端上安装上一个GPRS模块,然后每个终端通过GPRS模块与服务器建立单独的、长久的TCP连接。没有业务数据的时候会有心跳包。
现在客户嫌成本过高,想去掉这个GRPS模块,所以我们就搞了一个无线模块替换GPRS模块,并加入一个无线基站,由基站来采集终端的数据,再传给服务器。

由于这个无线模块就是一个单片机,速率不高,还半双工,不带TCP协议栈;而客户又不想改动服务器的代码,所以我们才在基站上来模拟所有终端的TCP连接。基站每接入一个终端,基站就向服务器建立TCP连接,并上报相关信息。一个基站可能接入1000多个终端,所以需要和服务器建立至少1000条TCP连接。

服务器查询终端的情况时,把指令通过TCP连接发给基站,基站收到指令,并找到要询的终端,然后无线下发过去。终端收到指令,准备好数据并传给基站,基站得到数据,找到对应的socket,再发送给服务器,这就是整个流程。

请高手指点!

   

keep_hungery 发表于 2014-05-29 10:45

1. 启动一个心跳检查线程负责心跳检查
2. 开启几个业务线程池, 负责处理业务处理转发。
3. 主线程采用poll模式轮询,同时负责数据分发调度到不同线程;
仅供参考。

朝歌勇志 发表于 2014-05-29 11:27

keep_hungery 发表于 2014-05-29 10:45 static/image/common/back.gif
1. 启动一个心跳检查线程负责心跳检查
2. 开启几个业务线程池, 负责处理业务处理转发。
3. 主线程采用po ...

谢谢你的建议,我会认真考虑!同时,也恳请各路高手顶立相助,提出宝贵建议,在此叩谢!
页: [1]
查看完整版本: TCP客户端和服务器多个socket连接的问题求助