免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11656 | 回复: 6
打印 上一主题 下一主题

[网络] TCP客户端和服务器多个socket连接的问题求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-28 23:26 |只看该作者 |倒序浏览
刚接到一项目,要做一个TCP客户端代理,该代理工作在linux平台上,与服务器最多时有接近1000条tcp连接,并定时发送心跳包以维持TCP连接不中断。现在要求服务器的技术实现不能有任何改动。只能在TCP客户代理上做文章。

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

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

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

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

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

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

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2014-05-29 09:02 |只看该作者
只是代理,处理开销小,方案1不是很合适么,有啥不好?
不过一般的代理,应该得接受客户端的连接吧

论坛徽章:
0
3 [报告]
发表于 2014-05-29 09:33 |只看该作者
谢谢楼上的热心回复,方案1虽然可行,只是觉得这样实现有点怪异,不符合日常的程序设计。我这个代理工作在基站上,终端与基站是无线连接,终端没有TCP/IP协议栈,基站获取终端的数据后,TCP代理通过串口读取终端的数据,然后将数据传给服务器。

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

论坛徽章:
1
白羊座
日期:2013-09-18 22:02:26
4 [报告]
发表于 2014-05-29 09:44 来自手机 |只看该作者
按照你的业务来说,我不知道为什么要千把连接,这里应该只需要有一两个连接就可以了。可以将业务简单的划分业务逻辑为终端数据接收部分,数据发送部分与控制部分。  

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

论坛徽章:
0
5 [报告]
发表于 2014-05-29 10:19 |只看该作者
本帖最后由 朝歌勇志 于 2014-05-29 10:24 编辑

回复 4# file3

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


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

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

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

请高手指点!

   

论坛徽章:
0
6 [报告]
发表于 2014-05-29 10:45 |只看该作者
1. 启动一个心跳检查线程负责心跳检查
2. 开启几个业务线程池, 负责处理业务处理转发。
3. 主线程采用poll模式轮询,同时负责数据分发调度到不同线程;
仅供参考。

论坛徽章:
0
7 [报告]
发表于 2014-05-29 11:27 |只看该作者
keep_hungery 发表于 2014-05-29 10:45
1. 启动一个心跳检查线程负责心跳检查
2. 开启几个业务线程池, 负责处理业务处理转发。
3. 主线程采用po ...


谢谢你的建议,我会认真考虑!同时,也恳请各路高手顶立相助,提出宝贵建议,在此叩谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP