首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android Socket 傳輸 int 數組:序列化協議設計與實現

     編輯:程式設計綜合問答

需從服務端發送 800+ 個 int 到 Android 客戶端。核心問題是**定義二進制協議格式**,保雙端解析一致。

推薦協議:長度前綴 + 定長二進制

// 發送端
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
int[] data = generateIntArray(); // 800+ 元素
dos.writeInt(data.length);       // 1. 先寫數組長度 (4 bytes)
for (int v : data) {
    dos.writeInt(v);             // 2. 依次寫入每個 int (4 bytes)
}
dos.flush();
// 接收端
DataInputStream dis = new DataInputStream(socket.getInputStream());
int len = dis.readInt();         // 1. 讀長度
int[] data = new int[len];
for (int i = 0; i < len; i++) {
    data[i] = dis.readInt();     // 2. 逐個讀取
}
// 後續處理 data...

關鍵優勢

  • 跨平台一致性: DataOutputStream/InputStream 使用網絡字節序,Java/Android 完全兼容。
  • 零拷貝高效: 直接操作字節流,無反射/序列化開銷。
  • 流式處理: 不需一次性載入所有數據到內存,邊讀邊處理。

替代方案對比

方案優點缺點適用場景
JSON 序列化 (Gson/Jackson)可讀、調試易、支持複雜對象體積大 2-3 倍、解析慢、需全量載入數據量小、頻率低、需人工檢查
Protobuf / FlatBuffers極致體積/速度、Schema 演進、多語言需定義 .proto、引入依賴、學習成本高性能、長期維護、跨語言項目
Java 原生序列化代碼極少不安全、不跨語言、版本脆弱、體積大**強烈不推薦**生產環境使用

工程化建議

  1. 封裝 ProtocolUtil.writeIntArray()/readIntArray() 統一入口。
  2. 添加魔數、版本號、CRC32 校驗字段,構建健壯幀結構:[Magic:2B][Version:1B][Len:4B][CRC:4B][Data:N*4B]。
  3. 網絡層使用 Netty/KryoNet 等框架處理粘包/半包、重連、心跳。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved