[問題] Socket server 資料處理問題

作者: jack77102020 (哈哈龍)   2015-09-05 17:16:34
各位前輩好,想請教關於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的東西,不知道該如何做會比較好。希望前輩能指點一下。
如果敘述很難理解需要我的程式碼,我也可以貼出來,非常感謝!
作者: Litfal (Litfal)   2015-09-05 18:24:00
請在server中測量接受到回傳總共需要的時間
作者: fo40225   2015-09-05 21:01:00
有沒有考慮用SignalR 這樣不用自己重新發明輪子如果要自己刻的話 要用非同步 IIS的執行緒才不會卡住
作者: Litfal (Litfal)   2015-09-05 21:59:00
除非你的server要主動通知client,不然我覺得用http就好了
作者: jack77102020 (哈哈龍)   2015-09-10 23:49:00
感謝各位,後來我用了非同步server以及非同步invoke後就改善了,Litfal你好,我也需要主動發data給client,所以還是用了socket。另外我查了一下SignalR和IIS好像是網頁用的東西?我是用windows form也行嗎
作者: fo40225   2015-09-12 21:31:00
http://tinyurl.com/q8hppuewinform也可以用
作者: jack77102020 (哈哈龍)   2015-09-13 11:07:00
感謝您,我再研究一下

Links booklink

Contact Us: admin [ a t ] ucptt.com