免费注册 查看新帖 |

Chinaunix

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

请教关于socket的长连接问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-09 20:59 |只看该作者 |倒序浏览
模型简化如下:

服务器连接多个客户端。不同的客户端通过tcp给服务器发指令以执行不同的任务,而具体的指令需要根据服务器上任务的运行反馈来确定。因此每个指令的间隔时间不确定,可能几个小时,甚至几天,也可能只有几秒钟。

问题如下:

1    这种需求下,是不是只能采取长联系的方式?不关闭套机字,保持一直相连接。

2    由于tcp是基于流的,如何才能有效确保不同的指令不会发生“粘包”?比如客户端的两条指令被合成一条发给服务器。这样服务器肯定不能正常执行相应的任务。

3    可有类似的源代码供参考?

非常感谢诸位!

论坛徽章:
0
2 [报告]
发表于 2011-08-09 21:14 |只看该作者
长连接受到防火墙等一系列的影响,建议用短连接。

论坛徽章:
0
3 [报告]
发表于 2011-08-09 21:40 |只看该作者
长连接受到防火墙等一系列的影响,建议用短连接。
dn2010 发表于 2011-08-09 21:14



谢谢回帖!

短连接的话,我目前还不太清楚如何实现上述的需求。不知道您可否有合适的建议?

因为具体的任务要运行很长的时间。假如客户端发送“AAA run”指令给服务器,服务器收到指令后便运行AAA任务,然后服务器关闭套接字。那么当客户端下次再要对AAA进行操作的时候(比如读取某些信息),或者服务器需要给原来的客户端发送反馈的时候,该如何重新连接上呢?暂时对此还没有合适的方案。

论坛徽章:
0
4 [报告]
发表于 2011-08-10 06:56 |只看该作者
本帖最后由 ChiyuT 于 2011-08-10 06:58 编辑

想了一晚上,如果我将每个新建任务都进行编号,并将编号发送回客户端。然后在服务器上把新建任务放入一个任务队列,同时记录下pid。再关闭套接字。

当客户端想要再次对任务发出指令的时候,将任务编号和指令一起发给服务器,这样服务器就能找出任务,并对其进行操作。

不知道这个方案合适不,有没有什么漏洞,以及可改进的地方?还请诸位多多指教。

论坛徽章:
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
5 [报告]
发表于 2011-08-10 08:40 |只看该作者
使用短连接,仅凭一个编号取回结果存在不安全因素,因为编号谁都可以伪造。
另外要明确客户端重启还能取回上次的结果么

如果只是一问一答,粘包是不会的了。但不管怎么说,从协议设计来说,一般应该加上包长度以便区分

论坛徽章:
0
6 [报告]
发表于 2011-08-10 09:24 |只看该作者
本帖最后由 106033177 于 2011-08-10 09:26 编辑

回复 1# ChiyuT
不关闭连接的话可以在传输指令的链接上禁止N a g l e算法。

论坛徽章:
0
7 [报告]
发表于 2011-08-10 10:05 |只看该作者
你这个模型太简单了。只有连接层。
粘包的问题可以用自定义的包头解决。
短连接执行较长时间的任务,可以多加一个Session层。

论坛徽章:
0
8 [报告]
发表于 2011-08-10 13:11 |只看该作者
服务器按指令执行不同的任务,如果任务执行时间不定,有可能太长,建议将结果保存到文件或数据库,由客户端短连接发查询指令上来查询结果。

论坛徽章:
0
9 [报告]
发表于 2011-08-10 20:24 |只看该作者
使用短连接,仅凭一个编号取回结果存在不安全因素,因为编号谁都可以伪造。
另外要明确客户端重启还能取回 ...
hellioncu 发表于 2011-08-10 08:40


现在打算让客户端在第一次启动服务器上的任务的时候,同时发送一个密码,服务器在此任务运行期间会保存该密码。这样,以后对该任务的连接,都必需先核对密码才能进行操作。

这样应该没问题了吧。。。

论坛徽章:
0
10 [报告]
发表于 2011-08-10 20:33 |只看该作者
听了诸位的建议,现在还是打算用短连接。

将任务进行标记,加入到任务队列里。客户端根据标记查找任务,并进行后续的操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP