C# socket 非同步接收訊息
近日根據官方提供的通訊例子自己寫了一個關於Unity(C#)和後臺通訊的類,拿出來和大家分享一下。
具體請參考:
1.java服務端用的apach.mina框架搭建。java服務端請參考:http://blog.9tech.cn/?c=site&m=article&id=548</a></p>
2.C#環境:.NET framework 2.0
3.C#幫組文件,及Socket註解:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket(v=vs.85).aspx</a></p>
4.官方例子:http://msdn.microsoft.com/zh-cn/library/bew39x2a(v=VS.85).aspx#CommunityContent</a></p>
個人覺得,最難的地方在與以下幾個地方:
1.封裝資料,和後臺的編解碼格式保持一致
封裝資料,其實就是一個前後臺約定好一個通訊格式。比如:獲得所以資料後並寫入位元組陣列後,在吧這個位元組陣列的長度讀出來(4個位元組的整形資料),再封裝進一個位元組陣列中。
所以最終的資料位元組陣列內容是:4個位元組的資料長度+實際資料的位元組陣列。
當然資料的加密加壓可以在吧實際資料存入位元組陣列後就進行,那麼傳送的長度就是加密加壓後的資料長度了。
實現方法:
1 2 3 4 5 6 7 8 9 |
|
2.非同步通訊的執行緒管理
非同步通訊的執行緒安全一直是一個難點,它不像ActionScript那樣,建立通訊連線後註冊事件用來偵聽即可。但是在C#中就必須讓執行緒等待當前的非同步操作完成後才可以繼續向下執行。C#非同步通訊中可以使用ManualResetEvent類來處理這類問題。當需要暫停執行後續程式碼以完成非同步操作時。使用ManualResetEvent的WaitOne();方法來阻塞這個執行緒(類似與java的ReentrantLock類),但是必須在非同步操作完成後使執行緒恢復,否則就會出現執行緒被鎖死的情況。使用ManualResetEvent的Set()方法即可。
實現方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
ManualResetEvent類的幫組文件及例子:http://msdn.microsoft.com/zh-cn/library/system.threading.manualresetevent_members(v=vs.85).aspx</a></p>
3.關於資料的壓縮,和解壓.
對於資料的壓縮和解壓可以採用ICSharpCode.SharpZipLib這個動態連結庫。下載地址:http://www.icsharpcode.net/opensource/sharpziplib/</a></p>
下載後再MonoDevelop裡倒入引用就可以了,位置:Project->Edit References..
using ICSharpCode.SharpZipLib.Zip;
然後在程式碼裡就可以倒入類了
參考:http://blog.sina.com.cn/s/blog_62fda93c0101d51j.html</a></p>
4.接收和讀取資料的操作
在接受服務端傳送的資料時,也根據同樣的格式進行解讀;先讀取4個位元組的資料長度,再跟進這個長度得到實際的資料,最後在解密和解壓就可以得到最終的資料了。
但是在這個操作過程中,會出現一些意想不到的麻煩。
大致流程是:
採取分段讀取的方式,第一次只讀取4個位元組的長度資訊。
取得長度後,根據設定的每次分段讀取資料長度來讀取,知道所得的資料和總長度相同;
每次分段讀取的資料的長度不一定都是設定的長度,所以將每次讀取的資料寫入記憶體流MemoryStream類中。特別重要的每次操作MemoryStream類時注意設定它的Position位置,不然會出現你本來已經成功的存入了資料,但是由於Position的原因沒有找準需要取出或者存入資料的準確位置而讀取資料失敗。
詳細程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
|