首页 新闻 会员 周边

Socket异步请求,数据会丢失

0
悬赏园豆:50 [已解决问题] 解决于 2015-11-18 13:20

      最近楼主本人自己在学习socket,然后遇到了如下的需求,但是也出了如下的问题,网上一直没找到答案,还请懂的人告诉下,是什么原因?

      应用场景:其实就是从多个socket客户端发送数据到单个socket服务器端,只是并发量不低,可能每秒有1000多个。

    解释:其实多个客户端就是指多个项目,但是发布以后都是部署在同一个服务器上的

            而单个socket服务器端指的就是另外一台服务器上了。

我的设计上这样的:在服务器上写了一个异步的socket服务端来监听数据,而在客户端写了一个发送信息的socket。每次发送一条信息就会有一个从创建到关闭socket的过程,每秒1000多条 就相当于1000多次这个过程,而且还有N个socket客户端。

但是运行下来发现,客户端有时候会链接不上服务器端,而且单位时间内,服务器端能接收到的客户端发送过来的信息也越少了。

比如在服务器端刚运行的1分钟 能收到5000条数据,那么下一分钟就只有2500条,在下一分钟只有12500条,最后稳定在200多条,但其实客户端产生的连接数远远超过这个数量,如果我重启服务端,又会回到第一分钟接受的5000的怪圈中

 

我想求教下,这到底是不是因为socket的并发问题呢,到底是和服务器端有关还是和客户端有关呢?

    

海神解说的主页 海神解说 | 菜鸟二级 | 园豆:245
提问于:2015-11-14 23:01
< >
分享
最佳答案
1

在服务器上写了一个异步的socket服务端来监听数据,而在客户端写了一个发送信息的socket。每次发送一条信息就会有一个从创建到关闭socket的过程,每秒1000多条 就相当于1000多次这个过程,而且还有N个socket客户端。

但是运行下来发现,客户端有时候会链接不上服务器端,而且单位时间内,服务器端能接收到的客户端发送过来的信息也越少了。

通常情况下,SOCKET编程,很少人会连接...断开...连接...断开...,SOCKET适合于长连接,如果你的业务场景是不需要客户端与服务端长期进行连接的,比如有的是半小时联系一下服务端,有的是两天联系一下服务端,那就建议你采用其他方式。

连接是一个比较消耗资源的操作,所以一旦连接,就不主动断开了。

另外,SOCKET编程确实是一件很费经验的事,这个时间长度是以年来计算,而不是以天来计算的,

所以如果你需要大量的连接用于业务,可能找个有经验的好过你自己研究三五年。

当然,作为学习,无可厚非。

收获园豆:20
爱编程的大叔 | 高人七级 |园豆:30839 | 2015-11-16 09:37
其他回答(5)
0

是你还不熟悉,掌控不了socket。

要是你用socket类来写,不用第三方框架,没有一定的经验是掌控不好的。

这就是为什么写服务端的人值钱。

收获园豆:10
arg | 园豆:1047 (小虾三级) | 2015-11-15 01:05

那么socket的第三方框架有哪些呢

支持(0) 反对(0) 海神解说 | 园豆:245 (菜鸟二级) | 2015-11-15 09:36

@海神解说:自己去搜。懒得要端到嘴边才行。

支持(0) 反对(0) arg | 园豆:1047 (小虾三级) | 2015-11-17 02:55
0

你有监控过服务端的CPU使用效率吗?如果这个CPU在SOCKET开起来之后上升的很快,一般这种问题可能是异步的时候没有设置sleep时间导致的

收获园豆:10
James-ping | 园豆:212 (菜鸟二级) | 2015-11-16 11:13
0

 建议你去 github 上找开源的组件, socket 自己写很不好写的

收获园豆:10
xmj112288 | 园豆:126 (初学一级) | 2015-11-16 11:45
0

1:服务器socket要开多线程来接受 当服务器繁忙 是会存在数据丢失

2:socket有沾包 并包 的情况 解决版本 采用协议 (类似http协议一样) 具体例子 7E 消息ID 消息属性 流水号 内容 效验 7

  E结尾 

3:前面的几个说的对 socket确实是门深的技术 。 不过都有个学习的过程

s_p | 园豆:138 (初学一级) | 2015-11-18 16:12
0

关注一下 最近在做类似的项目

何小宝 | 园豆:19 (初学一级) | 2015-11-20 14:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册