silverlight中的socket编程注意事项
1.粘包
目前sl中的socket只能用tcp/ip協議,而tcp/ip本質是一個"流"協議,也就是說數據無邊界,發送的就是一連串的字節(沒有數據包的概念),因此連續發送時有所謂的“粘包”現象,詳細解釋如下:
比如你設置發送緩沖區的大小是512字節,如果(在相隔時間極短的情況下)連續發送次數據,第一次為500字節,第二次為100字節,實際上你在服務器端接收到的二次數據長度并不是500和100,而是512和88.
換言之:如果socket能“感覺”到馬上還有數據要發送,而且在本次發送的緩沖區還有空余時,它會自動把下次發送的內容挪一部分過來,直到本次緩沖區填滿,以便有效的利用緩沖區,減少發送次數,至于它是如何感覺的,我就不知道鳥:)
所以如果想正確的劃清數據邊界,得自己想辦法封包/拆包
?
常見的解決辦法:在發送方與接收方制定一個共同的約定,比如定義一個結構體struct,把“包長度,包序號,要發送的數據,包的唯一標識...”這一堆東西封裝在struct中,然后通過序列化最終得到一個byte[]進行發送。
?
另外如果最終得到的byte[]太大,超過了數據下標所允許的最大值(比如傳遞大文件時),會導致接收時反序列化失敗,所以還得人工把大塊頭數據割成一塊一塊,這里有一個技巧:為了避免前面提到“scoket自我感覺良好”進行的數據挪移,分割的單位建議正好就是緩沖區的大小,如果不足一個緩沖區,寧可湊數填寫一些空字節也要湊滿一個緩沖區長度--這樣系統會覺得你在高效使用緩沖區,沒有浪費,也就不會管閑事了 :)
?
2.異常捕獲
網絡編程中,會有各種不可控的情況,所以異常的捕獲很重要,否則程序會用著用著就掛掉了。
?
3.異常數據包的及時清理
異常數據包指“非法的”或“不完整的(比如一個大文件最終拆分成10個包,結果第10個包都收到了,前面的某個包即始終收不到)”數據包,對于這類數據包,要及時清理否則會一直占用資源(必要時可以將連接關閉)
?
后話:很期待silverlight在未來的版本中,加入udp協議支持,這樣應用范圍將更加廣泛。
轉載于:https://www.cnblogs.com/yjmyzz/archive/2009/12/02/1615204.html
總結
以上是生活随笔為你收集整理的silverlight中的socket编程注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何判断两个单向链表是否有相交,并找出交
- 下一篇: BB陆逊高达(3Dmax)