最近公司的產(chǎn)品用到了socket通信方面的東西欧宜,花了點時間學習了下,基本使用什么的網(wǎng)上很容易找断国,就不說啦贤姆,這里呢,我把我遇到的坑們給大家嘮嘮稳衬,希望對大家有所幫助霞捡。
(○’ω’○)
1. android網(wǎng)絡(luò)請求需要放在工作線程中,socket通信也不例外薄疚;
2. 當socket長連接建立成功后碧信,如果手機屏幕關(guān)閉,只要過很短的時間街夭,android系統(tǒng)就會將socket服務(wù)掛起砰碴,這種行為應該是出于節(jié)電考慮的,但體驗會下去很多板丽,因為總是自動斷開呈枉!另外當我們的手機通過數(shù)據(jù)線連接電腦調(diào)試的時候趁尼,手機熄滅屏幕后,socket服務(wù)是不會被自動掛起的猖辫,似乎在調(diào)試模式下酥泞,手機不會自動進入節(jié)電模式,但當連接數(shù)據(jù)線充電的的話啃憎,手機在熄屏后還是會將socket服務(wù)掛起的ㄟ( ▔, ▔ )ㄏ芝囤。如果希望手機在熄屏后不將socket服務(wù)掛起,可以通過PowerManager設(shè)置電源模式辛萍,使cpu不進入節(jié)電模式悯姊,當然了,可以做個計時器贩毕,也別讓cpu全馬力輸出太久嘛悯许。
3. 客戶端希望確認服務(wù)器端是否在運行,可以發(fā)送心跳包耳幢;
4. 如果客戶端和服務(wù)器端需要雙向確認對方是否存活岸晦,可以自定義一個易區(qū)分的字段欧啤,時時發(fā)送睛藻,在網(wǎng)絡(luò)暢通的前提下,發(fā)送端如果發(fā)送失敗邢隧,則接收端停止運行店印,接收端如果超過某個時間段之后依然無法接收到信息,則發(fā)送端停止運行倒慧;
5. socket通信按摘,在發(fā)送數(shù)據(jù)時如果發(fā)送的數(shù)據(jù)被轉(zhuǎn)化為byte后,長度超過1448時纫谅,發(fā)送的數(shù)據(jù)將被拆分炫贤,比方說,發(fā)送一個1500長數(shù)據(jù)付秕,就會接收到2個包兰珍,包內(nèi)攜帶的發(fā)送信息的長度分別為1448和52;
6. 為了解決socket的這種自動拆包問題询吴,我們需要在發(fā)送的信息中寫入所發(fā)送的信息的總長度掠河,比如,首先我們可以將發(fā)送的第一位設(shè)置為“$”猛计,它就表示數(shù)據(jù)的開頭唠摹,接下來后四位用來存放數(shù)據(jù)的總長度,之后的部分用來存放發(fā)送數(shù)據(jù)奉瘤,這樣勾拉,接收端在接收到數(shù)據(jù)后就可以通過解析出數(shù)據(jù)的總長度來確認是否已經(jīng)接收完全,如果不全再繼續(xù)接收就可以了;
7. 發(fā)送數(shù)據(jù)過長時會有自動拆包的問題藕赞,當發(fā)送數(shù)據(jù)過短或者發(fā)送的數(shù)據(jù)之間時間間隔很短的時候苛秕,還會發(fā)生自動粘包的問題!自動粘包就是指本來是兩個或者多個包中的數(shù)據(jù)同時合并到了一個包中找默,這時候艇劫,容易出現(xiàn)解析不全的情況。解決粘包問題同樣可以使用上面提到的方法惩激,只不過反過來了店煞,當發(fā)現(xiàn)接收到的數(shù)據(jù)比通過首部一至五位計算出的長度要長時,可以通過截取的方法风钻,分段計算顷蟀;
8. 別以為自動拆包和自動粘包是互斥的,它們也有可能同時出現(xiàn)骡技! (╯‵□′)╯︵┻━┻ 首先發(fā)生粘包鸣个,而粘包的長度超過了1448,然后就會發(fā)生拆包布朦。囤萤。。處理方法也不難是趴,接收端首先處理粘包涛舍,當處理到最后一個包時會發(fā)現(xiàn)最后一個包不完整,將他保存下來唆途,與接下來接收到的數(shù)據(jù)進行拼接富雅,然后接續(xù)處理粘包就可以了,調(diào)用流程就是:處理粘包肛搬、處理拆包没佑、處理粘包。温赔。蛤奢。就可以了。
9. socket在api19之前沒有繼承Closeable接口让腹,如果大家是通過寫一個關(guān)閉Closeable對象的工具類來關(guān)閉socket的話還是別用了远剩,不然老版本的手機們只要一執(zhí)行到關(guān)閉socket的語句時就會異常退出;
10. socket在通信的時候可能需要啟動多個線程骇窍,可以考慮使用線程池瓜晤,線程池操作多個線程到底是方便些,而且因線程長時間持有socket對象而產(chǎn)生內(nèi)存溢出的情況會少很多腹纳,因為線程池可以集體關(guān)閉所有線程痢掠;
11.? 在熄屏的情況下驱犹,安卓端是接收不到UDP廣播的,試過各種方法足画,就是接收不到雄驹。查了下,發(fā)現(xiàn)是安卓本身的機制淹辞,沒發(fā)現(xiàn)啥解決方案医舆。
先寫這么多吧
(,,? ? ?,,)(,,? ? ?,,)