Java Socket 如何接收byte和String
一、發送byte[]與String
我們平時是怎麼發送byte和String的呢?舉例代碼:
String str = "hello world"+ "\n";
byte[] bytes = 圖片字節流;
// 獲取socket輸出流
OutputStream out = socket.getOutputStream();
// 發送字符串
out.write(str.getBytes());
// 發送byte數組
out.write(bytes);
發送代碼部分很簡單,即使是String也是轉了byte發送的。那客戶端在接收的時候如何做區分呢,客戶端怎麼知道接收的byte是要轉字符串,還是轉圖片或其它類型呢?
那麼就需要改進代碼了,在發送端增加一個標識
,客戶端在接收到消息的時候,根據標識
進行區分,這樣接收端就知道消息該怎麼轉了。
修改之後的發送端代碼舉例:
// 定義兩個標識
final int SOCKET_STRING = 1;
final int SOCKET_BYTE = 2;
public void sendString() {
String str = "hello world";
// 獲取socket輸出流
OutputStream out = socket.getOutputStream();
// 增加字符串的標識
out.write(BytesUtils.int2ByteArray(SOCKET_STRING));
// 發送字符串
out.write(str.getBytes());
out.flush();
}
public void sendBytes() {
byte[] bytes = 圖片字節流;
// 獲取socket輸出流
OutputStream out = socket.getOutputStream();
// 增加字符串的標識
out.write(BytesUtils.int2ByteArray(SOCKET_BYTE));
// 發送byte數組
out.write(bytes);
out.flush();
}
二、區分接收byte[]與String
// 獲取輸入流
InputStream is = socket.getInputStream();
byte[] types = new byte[4];
is.read(types)
int type = BytesUtils.bytes2Int(srcType);
if(type == 1){
// todo 接收數組轉爲String
}else{
// todo 接收數組轉爲圖片
}
這裏爲什麼會創建4個字節呢。原因是因爲在java中,一個int佔用4個字節,我們判斷類型只需要將int取出來即可。在java中:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ONbRTFzf-1588685277648)(evernotecid://17BA373C-0ACF-4FD7-AE4C-68B9365102F8/appyinxiangcom/26996375/ENResource/p48)]
附上BytesUtils
代碼
public class BytesUtils {
/**
* int轉byte[]
* 該方法將一個int類型的數據轉換爲byte[]形式,因爲int爲32bit,而byte爲8bit所以在進行類型轉換時,知會獲取低8位,
* 丟棄高24位。通過位移的方式,將32bit的數據轉換成4個8bit的數據。注意 &0xff,在這當中,&0xff簡單理解爲一把剪刀,
* 將想要獲取的8位數據截取出來。
*
* @param i 一個int數字
* @return byte[]
*/
public static byte[] int2ByteArray(int i) {
byte[] result = new byte[4];
result[0] = (byte) ((i >> 24) & 0xFF);
result[1] = (byte) ((i >> 16) & 0xFF);
result[2] = (byte) ((i >> 8) & 0xFF);
result[3] = (byte) (i & 0xFF);
return result;
}
/**
* byte[]轉int
* 利用int2ByteArray方法,將一個int轉爲byte[],但在解析時,需要將數據還原。同樣使用移位的方式,將適當的位數進行還原,
* 0xFF爲16進制的數據,所以在其後每加上一位,就相當於二進制加上4位。同時,使用|=號拼接數據,將其還原成最終的int數據
*
* @param bytes byte類型數組
* @return int數字
*/
public static int bytes2Int(byte[] bytes) {
int num = bytes[3] & 0xFF;
num |= ((bytes[2] << 8) & 0xFF00);
num |= ((bytes[1] << 16) & 0xFF0000);
num |= ((bytes[0] << 24) & 0xFF0000);
return num;
}
}