首页 新闻 会员 周边

关于Socket通信,如何处理多客户端并发访问的问题

0
[已解决问题] 解决于 2016-05-27 15:22

如图所示,我用C#完成了一个简单的1对多的通信服务器的服务器端和客户端的编写,这些客户端根据业务需求都挂在服务器1上,并且周期性的,比如500毫秒或者更低的时间间隔向服务器1发送数据(数据的量并不大,只是一个小的字符串)。服务器1在接受到各个客户端发送的消息后将消息转发至服务器2,请问有什么比较好的方式和架构来处理这种需求,保证多客户端访问服务器1时不会被拥堵,而且服务器1能准确快速的将收到的数据转发到服务器2

无线电静默的主页 无线电静默 | 初学一级 | 园豆:28
提问于:2016-05-26 13:04
< >
分享
最佳答案
1

服务器1这层做负载集群.简单做法是:连接都在服务器1上.如果1的已连接数超过配置值.则返回一个新地址1.1让客户端连.所有的服务器1都是这个逻辑.服务器1这层就没问题了.

而你的服务器2是接口消息的.可以用消息总线来处理.服务器将消息发送到消息总线.服务器2订阅这个消息.这是服务器2可以直接集群.反正都订阅那个消息队列就是

奖励园豆:5
吴瑞祥 | 高人七级 |园豆:29449 | 2016-05-26 13:35

可以这样么,就是 服务器1在这里充当两个身份,在下层实际上就是一个服务器 负责连接所有的客户端并保存每个客户端的Socket对象。第二个身份是面对服务器2,服务器1是服务器2的客户端,服务器1要登录服务器2。我的想法是,服务器1接收到任意客户端发送的消息时,就直接通过 服务器1链接服务器2的Socket对象将收到的信息发送至服务器二,我只是担心这种方式 会拥堵 而且并发访问时造成丢包  我C#都是自学的 很多架构都不是太懂  你说的消息订阅什么的有没有一些简单的例子能够参考?消息总线的话 如果完成这个需求困难不?自学的话大概需要多久呢?

无线电静默 | 园豆:28 (初学一级) | 2016-05-26 14:04

@无线电静默: 没什么难度.具体操作查百度.看你这说法.是客户端推数据到服务器1的?不需要服务器推数据到客户端?

吴瑞祥 | 园豆:29449 (高人七级) | 2016-05-26 14:13

@吴瑞祥: 服务器1实际上就是起到转发作用   不同客户端将数据都发送到服务器1,服务器1将这些数据转发至服务器2,  服务器2也会发送信息 通过服务器1 群发或者选择性发送至客户端 这种需求 我之前说的那种架构行么? 

无线电静默 | 园豆:28 (初学一级) | 2016-05-26 14:34

@无线电静默: 你的客户端是在PC端的一个exe程序吗?架构肯定是可以的.最多就是在服务器1这一层加个调度服务器.

吴瑞祥 | 园豆:29449 (高人七级) | 2016-05-26 15:30

@吴瑞祥: 我Socket 通信时发生一个莫名其妙的问题 我发送方将数据放松到接收方时,使用的都是UTF8编码,给的buffer空间也绝对够用  但是接收方接收到byte数组时 第一位始终为“0”造成转成字符串时 变成“\0······”  之前我也遇到过  接收到的byte数组第一位是“30” 转成的字符串也不正常  我把发送和接收的代码看了几遍  没错啊

无线电静默 | 园豆:28 (初学一级) | 2016-05-26 17:29

@吴瑞祥: 以前做另一个Socket通信的时候也遇到过 就是 接收方的byte数组里面 第一位是30 造成转变成也有一个看不见的字符  一直没找原因 请问你们做得时候遇见过没有?》

无线电静默 | 园豆:28 (初学一级) | 2016-05-26 17:34
其他回答(1)
0

说了都是简单的服务器,却来研究应对高并发的方案,有意思吗?

你已经找到怎么模拟足够客户端的方法了吗?

在知识贮备不够的时候,不要想着搞些高大上的玩意。

搞些实际点的,别浪费时间。

arg | 园豆:1047 (小虾三级) | 2016-05-26 20:08

其实我也真的想简简单单就完成这些事情,但是今天测试,就五个客户端,每个客户端都简单的每隔500毫秒发送一次数据,服务器接收到转发后,socket粘包了。网上查一会儿是用队列,可惜我不会,一会儿又是写什么分包算法什么的,我也就想简单实现我要的功能而已,但是就是出现这个问题了啊。粘包这个问题我还能理解,毕竟服务器缓冲区收到的数据多了来不及处理。但是日了狗的是明明发的就是一个字符串,收到后前面莫名奇妙多了个字符,这个字符看不见,但确实存在不知道哪里来的,发送端发送的都没有,接收到时就出现了。虽然这个问题好解决,我截取后面的字符串第一个字符不要就是了,但是就是好奇多那个字符到底哪里来的

支持(0) 反对(0) 无线电静默 | 园豆:28 (初学一级) | 2016-05-27 00:04

@无线电静默: 只能说长路漫漫,socket编程是很难的,大概率微软下的开发者都是用asp.net,或是wcf做服务和通信。若是你仅仅是要完成功能,直接用wcf吧,毕竟例子抄抄就好。

若想用好socket,有时间肯花时间和精力,肯定会成功,就看你自己怎么决定了。

支持(0) 反对(0) arg | 园豆:1047 (小虾三级) | 2016-05-27 00:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册