看板 C_Sharp 關於我們 聯絡資訊
各位前輩好,想請教關於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://www.ptt.cc/bbs/C_Sharp/M.1441444597.A.561.html
Litfal: 請在server中測量接受到回傳總共需要的時間 09/05 18:24
fo40225: 有沒有考慮用SignalR 這樣不用自己重新發明輪子 09/05 21:01
fo40225: 如果要自己刻的話 要用非同步 IIS的執行緒才不會卡住 09/05 21:02
Litfal: 除非你的server要主動通知client,不然我覺得用http就好了 09/05 21:59
jack77102020: 感謝各位,後來我用了非同步server以及非同步invoke 09/10 23:49
jack77102020: 後就改善了,Litfal你好,我也需要主動發data給clie 09/10 23:50
jack77102020: nt,所以還是用了socket。另外我查了一下SignalR和 09/10 23:51
jack77102020: IIS好像是網頁用的東西?我是用windows form也行嗎 09/10 23:55
fo40225: http://tinyurl.com/q8hppue 09/12 21:31
fo40225: winform也可以用 09/12 21:32
jack77102020: 感謝您,我再研究一下 09/13 11:07