Re: [問題] 呼叫對象為非同步

看板C_Sharp (C#)作者 (人生只有一次)時間13年前 (2012/08/20 23:41), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
※ 引述《Abbee (阿比)》之銘言: : 真不好意思,沒受過socket的正規訓練, : 最近在寫socket時, : 遇到了一些問題, : 我寫的是甲server, : 以下為作業流程 : client 送出查詢→甲server再以socket方式送出查詢→乙server : 乙server查到資料後,以socket連入傳送→甲server : 所以甲server這支程式本身是: : 1. 眾多client的.net remoting server(多台) : 2. 乙server(是多台,但數量不同)的socket client : 3. 乙server的socket server : 所以我需要等待乙server回覆結果, : 再將結果回給client端... : 但是乙server回覆是隨機送回這數台甲server之一, 這個做法不能改嗎? 因為隨機收到的甲 Server 再送回正確的 甲 Server 是一個多餘的流程 不能改的話~也許可以想想怎麼讓甲 Server 間的資料共享 讓每一台甲 Server 都可以處理 : 所以我在甲server上再加上: : 4. 甲server同時也是另外幾台甲server的server和client : 這樣的話, 若是乙server丟到別台機器的話, : 我以資料上的編號判斷後, 再丟回原機器處理... : 小妹有以下問題想請教各位: : 1. 我的甲server和乙server溝通是採用字串, 以字串前4碼為訊息長度, : (這是規定格式) : 所以我接收socket的方式, 是先讀入前4碼, 判讀後, 再將判讀後數字-4, : 將剩下的訊息再讀入, 之後再回到讀入前4碼動作重覆繼續... : 請問這樣是否會有什麼問題? 該不會是用 Json 吧? 這可能會有 Json 轉換效率的問題 如果一定要用字串傳的話~可能封包會很大~轉換成正確資料也有轉換上的效率問題 : 2. client端想作成同步的效果, 那我是否要在.net remoting的method內, : 在作完送出socket動作後, 要不斷跑迴圈等待結果呢? : 我是打算以訊息編號作dictionary, 記下從乙server回來的訊息, : 在迴圈內去查該dictionary是否有該編號的資料, 有的話取出處理, : 並在取出同時刪除該dictionary內的該筆資料~ : 請問有沒有更好的建議呢? 總覺得跑迴圈好像不太好... client 不能改嗎?就是 client 送出封包到甲 Server 後 甲 Server 記住該 client 連接資訊~這樣就不用跑迴圈~讓一條 thread 耗在那邊 client 端只要弄個正在進行的字或圖就好了 等甲 Server 處理完後~再送回正確的 client 讓它進行下去就好了 -----------------這段應該可以略過???------------------------------------ 推文中您回應的"廠商把封包都寫在db"~乙 Server 是廠商吧? 其實我很不解為什麼要這樣做?不是應該直接把封包都送給甲 Server 就好了? 如果不能改~那就要想辦法弄個 lock 讓同一時間只有一台甲 Server 去處理 db 裡的封包 ------------------------------------------------------------------------ 不好意思~剛剛反覆看了好幾遍~總算應該是看懂了? XD 簡單來講~ client 根本沒真的送出封包~而是透過寫入 db 的方式去模擬? 真是開了我的眼界了... 其實要這樣搞應該也不是不行~只是一定要在 db 模擬出一個 queue 就是讓 client 寫入要送的封包 弄個 stored procedure 讓同一時間只有一台甲 Server 讀到第一筆後 就刪除該封包資料 處理完後在 db 的另一個 table 寫入可讓 client 查到結果的資料 但是除非 db 有主動通知 client 的功能 不然似乎免除不了 client 一直跑迴圈去連 db 查結果 畢竟這不是真的可以互相連接的封包... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.173.236.75 ※ 編輯: andymai 來自: 1.173.236.75 (08/20 23:49) ※ 編輯: andymai 來自: 1.173.236.75 (08/21 00:16)
文章代碼(AID): #1GCbgEo1 (C_Sharp)
文章代碼(AID): #1GCbgEo1 (C_Sharp)