這個解決方案是我和隊友在《物聯網》比賽的集訓中獲得的。在socket中Android客戶端接收圖片是至關的棘手(反正我當時就是這樣以爲),接收文字還算簡單。在剛開始接觸socket接收圖片的時候,出現一大堆意想不到的結果,要麼圖片顯示不出來,要麼圖片顯示不完整都有可能,下面我給出本身的解決方案,若是您有幸碰到了這個問題並且正在不知道怎麼解決而發愁的時候,但願這篇文章能給您一些幫助。java
相信大家剛開始也會像我同樣犯了這樣一個錯誤用了下面這一段代碼處理流的接收緩存
while((len = inputStream.read(bs))!=-1)
複製代碼
這段代碼並無錯,只是咱們還不太瞭解socket通訊的原理。 當你在socket使用這段代碼,你將永遠都接收不到數據,由於socket一旦通訊是一直鏈接,因此永遠得不到返回-1,除非對方斷開鏈接。還有在socket通訊中不能隨便關閉流,不然將影響雙方的通訊,要在適當的時候關閉流纔是最佳的作法。bash
因爲我寫的是簡單的接收和發送,沒有其餘的東西,因此我直接貼核心代碼就行,固然我也會把源碼連接放在下面給你們共享。socket
Socket socket = new Socket("192.168.162.59", 9999);
InputStream inputStream = socket.getInputStream();
//begin 圖片接收
//第1步:接收服務端發過來的圖片大小
byte[] picLenBuff = new byte[200];
int picLen = inputStream.read(picLenBuff);
//將String 轉換成 int
String picLenString = new String(picLenBuff, 0, picLen);
int getPicLen = Integer.valueOf(picLenString);
//第2步:回饋。向服務端反饋客戶端已經接收到圖片的大小了,能夠開始發圖片了
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
複製代碼
Socket socket = new Socket("192.168.162.59", 9999);
OutputStream outputStream = socket.getOutputStream();
//初始化2M之內的圖片緩存
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);
//向服務端發送圖片大小
outputStream.write(lenString.getBytes());
outputStream.flush();
//定義回饋
byte[] getRec = new byte[1];
InputStream inputStream = socket.getInputStream();
inputStream.read(getRec);
String string = new String(getRec);
//若是獲得回饋是1,說明服務端已經接收完圖片大小,能夠開始發送圖片了
if(string.equals("1"))
{
outputStream.write(PicBuff, 0, lenPic);
outputStream.flush();
}
複製代碼
以上通訊格式都須要事先和PC端說好,不然通訊失敗。函數
這裏只要講解下接收圖片這段代碼要注意的地方spa
/**********************最主要部分***********************/
while(offset < getPicLen)
{
int len = inputStream.read(bitmapBuff, offset, getPicLen-offset);
offset+=len;
}
/**********************最主要部分***********************/
複製代碼