Java Socket 如何接收byte和String

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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章