日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

silverlight中的socket编程注意事项

發布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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编程注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。