Android 客戶端與PC服務端socket通信接收與發(fā)送圖片(終結(jié)者)

前言

這個解決方案是我和隊友在《物聯(lián)網(wǎng)》比賽的集訓中得到的。在socket中Android客戶端接收圖片是相當?shù)募郑ǚ凑耶敃r就是這樣覺得)倔喂,接收文字還算簡單铝条。在剛開始接觸socket接收圖片的時候,出現(xiàn)一大堆意想不到的結(jié)果席噩,要么圖片顯示不出來班缰,要么圖片顯示不完整都有可能,下面我給出自己的解決方案悼枢,如果您有幸碰到了這個問題而且正在不知道怎么解決而發(fā)愁的時候埠忘,希望這篇文章能給您一些幫助。

開車

相信你們剛開始也會像我一樣犯了這樣一個錯誤用了下面這一段代碼處理流的接收

while((len = inputStream.read(bs))!=-1)

這段代碼并沒有錯馒索,只是我們還不太了解socket通信的原理莹妒。
當你在socket使用這段代碼,你將永遠都接收不到數(shù)據(jù)绰上,因為socket一旦通信是一直連接旨怠,所以永遠得不到返回-1,除非對方斷開連接蜈块。還有在socket通信中不能隨便關(guān)閉流鉴腻,否則將影響雙方的通信,要在適當?shù)臅r候關(guān)閉流才是最佳的做法疯趟。

核心代碼

由于我寫的是簡單的接收和發(fā)送拘哨,沒有其他的東西,所以我直接貼核心代碼就行信峻,當然我也會把源碼鏈接放在下面給大家共享。

接收圖片

Socket socket = new Socket("192.168.162.59", 9999);
InputStream inputStream = socket.getInputStream();
//begin 圖片接收
//第1步:接收服務端發(fā)過來的圖片大小
byte[] picLenBuff = new byte[200];
int picLen = inputStream.read(picLenBuff);
//將String 轉(zhuǎn)換成 int
String picLenString = new String(picLenBuff, 0, picLen);
int getPicLen = Integer.valueOf(picLenString);
//第2步:回饋瓮床。向服務端反饋客戶端已經(jīng)接收到圖片的大小了盹舞,可以開始發(fā)圖片了
OutputStream outputStream = socket.getOutputStream();
String string = "1";
outputStream.write(string.getBytes());
outputStream.flush();
//第3步:開始接收圖片
int offset = 0;//定義偏移量
byte[] bitmapBuff = new byte[getPicLen];//初始化圖片緩存

/**********************最主要部分***********************/
while(offset < getPicLen)
{
    int len = inputStream.read(bitmapBuff, offset, getPicLen-offset);
    offset+=len;
}
/**********************最主要部分***********************/

//開始圖片解碼
Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapBuff, 0, offset);
//用handler通知UI線程顯示圖片
Message message = handler.obtainMessage(1, bitmap);
handler.sendMessage(message);
//end 

發(fā)送圖片

Socket socket = new Socket("192.168.162.59", 9999);
OutputStream outputStream = socket.getOutputStream();
//初始化2M以內(nèi)的圖片緩存
byte[] PicBuff = new byte[1024*1024*2];
FileInputStream fileInputStream = new FileInputStream(Environment.getExternalStorageDirectory()+"/20.png");
//得到圖片大小
int lenPic = fileInputStream.read(PicBuff);
String lenString = String.valueOf(lenPic);
//向服務端發(fā)送圖片大小
outputStream.write(lenString.getBytes());
outputStream.flush();
//定義回饋
byte[] getRec = new byte[1];
InputStream inputStream = socket.getInputStream();
inputStream.read(getRec);
String string = new String(getRec);
//如果得到回饋是1产镐,說明服務端已經(jīng)接收完圖片大小,可以開始發(fā)送圖片了
if(string.equals("1"))
{
    outputStream.write(PicBuff, 0, lenPic);
    outputStream.flush();
}

以上通信格式都需要事先和PC端說好踢步,否則通信失敗癣亚。

這里只要講解下接收圖片這段代碼要注意的地方

/**********************最主要部分***********************/
while(offset < getPicLen)
{
    int len = inputStream.read(bitmapBuff, offset, getPicLen-offset);
    offset+=len;
}
/**********************最主要部分***********************/
  1. 如果PC服務端發(fā)送的圖片比較大,Android客戶端不可能一次性讀完全部輸入流获印,所以要在while(offset < getPicLen)中循環(huán)讀取述雾。
  2. read函數(shù)中的第三個參數(shù)要減去偏移量,否則會出現(xiàn)圖片顯示不完整或顯示不出來等問題兼丰。
    源碼點擊下載
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玻孟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鳍征,更是在濱河造成了極大的恐慌黍翎,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艳丛,死亡現(xiàn)場離奇詭異匣掸,居然都是意外死亡,警方通過查閱死者的電腦和手機氮双,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門碰酝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人戴差,你說我怎么就攤上這事砰粹。” “怎么了造挽?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵碱璃,是天一觀的道長。 經(jīng)常有香客問我饭入,道長嵌器,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任谐丢,我火速辦了婚禮爽航,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乾忱。我一直安慰自己讥珍,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布窄瘟。 她就那樣靜靜地躺著衷佃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹄葱。 梳的紋絲不亂的頭發(fā)上氏义,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天锄列,我揣著相機與錄音,去河邊找鬼惯悠。 笑死邻邮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的克婶。 我是一名探鬼主播筒严,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼情萤!你這毒婦竟也來了鸭蛙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤紫岩,失蹤者是張志新(化名)和其女友劉穎规惰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泉蝌,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡歇万,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了勋陪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贪磺。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诅愚,靈堂內(nèi)的尸體忽然破棺而出寒锚,到底是詐尸還是另有隱情,我是刑警寧澤违孝,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布刹前,位于F島的核電站,受9級特大地震影響雌桑,放射性物質(zhì)發(fā)生泄漏喇喉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一校坑、第九天 我趴在偏房一處隱蔽的房頂上張望拣技。 院中可真熱鬧,春花似錦耍目、人聲如沸膏斤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莫辨。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衔掸,已是汗流浹背烫幕。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工俺抽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敞映,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓磷斧,卻偏偏與公主長得像振愿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子弛饭,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評論 25 707
  • Java Socket編程 對于Java Socket編程而言冕末,有兩個概念,一個是ServerSocket侣颂,一個是...
    天空下天的月亮閱讀 2,067評論 10 41
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理档桃,服務發(fā)現(xiàn),斷路器憔晒,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 捧清水似的陽光洗了臉 我行走在湖底 文字像小船懸浮藻肄,遠離我 魚鱗多了青色 我的等長出鰭的脈絡 而十里外空城 目睹陽...
    驚蟄夕閱讀 253評論 12 32
  • 弓身欲攬光明, 隨風舒展風情拒担, 柔弱似水低問嘹屯, 何故薄幸? 湖送綠柳白云从撼!
    平天下之文世界閱讀 537評論 0 7