作者jack77102020 (哈哈龙)
看板C_Sharp
标题[问题] Socket server 资料处理问题
时间Sat Sep 5 17:16:34 2015
各位前辈好,想请教关於Server以及data处理的问题。
目前我想做的事情是建立一个Server供多个Client连线并且进行不间断的data传递。
收到data後解析封包并将资讯显示在Form的listbox上。
我现阶段的架构是使用MVC,Form里有一个Form controller。Controller内部包含一个
Server。
Server是以同步和多执行绪来实做。每个连进来的client都是一个执行绪在处理receive
後的资料。server还有收到data的event供controller观察,以及n个queue来存放n个
client传来的heartbeat。
Server收到data後会解析类型并且读取需要的长度存入byte[]。接着利用事件invoke
将此byte[]传出给controller。controller将此byte[]处理後保存至记忆体。并且也
invoke事件让form去更新UI画面。而若是收到heartbeat则加入该对应的queue中。
由server内部自己一条背景执行绪来回应。
每个Client传递给Server的资料量约是2MB/s。目前遇到的问题是当client变多时,
heartbeat回应给client的时间间隔就会越来越长。最终导致client端timeout而断线。
若无heartbeat机制也会因为server端的buffer越积越多而爆掉。
是否因为我在server就将资料分析并且每取得一笔资料都invoke一次而导致处理慢了?
有想过是否要将server端receive出来的资料直接丢给controller去处理就好,但这样
会不会变成是controller中的buffer爆掉?
这是第一次做server和client的东西,不知道该如何做会比较好。希望前辈能指点一下。
如果叙述很难理解需要我的程式码,我也可以贴出来,非常感谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 124.8.75.51
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1441444597.A.561.html
1F:→ Litfal: 请在server中测量接受到回传总共需要的时间 09/05 18:24
2F:→ fo40225: 有没有考虑用SignalR 这样不用自己重新发明轮子 09/05 21:01
3F:→ fo40225: 如果要自己刻的话 要用非同步 IIS的执行绪才不会卡住 09/05 21:02
4F:→ Litfal: 除非你的server要主动通知client,不然我觉得用http就好了 09/05 21:59
5F:→ jack77102020: 感谢各位,後来我用了非同步server以及非同步invoke 09/10 23:49
6F:→ jack77102020: 後就改善了,Litfal你好,我也需要主动发data给clie 09/10 23:50
7F:→ jack77102020: nt,所以还是用了socket。另外我查了一下SignalR和 09/10 23:51
8F:→ jack77102020: IIS好像是网页用的东西?我是用windows form也行吗 09/10 23:55
10F:→ fo40225: winform也可以用 09/12 21:32
11F:→ jack77102020: 感谢您,我再研究一下 09/13 11:07