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