HarmonyOS 鸿蒙Next中“仿微信聊天”App开发技术分享(十四)向SocketIO服务器发送图片

HarmonyOS 鸿蒙Next中“仿微信聊天”App开发技术分享(十四)向SocketIO服务器发送图片

上一节我们综合使用util、image等工具库,把BASE64字符串成功解码为PixelMap像素图。接下来以BASE64串作为图片数据的载体,向后端的SocketIO服务器发送一段一段的图片消息,具体的发送过程分为下列三个步骤。

一、定义图片消息结构

因为图片可能会分段编码为BASE64串传输,所以每次传输的数据包都要携带序号、长度、内容等信息,这样既方便发送端有序地切分图片数据,也方便接收端按顺序重新组装完整的图片。那么定义一个图片分段结构,包括分段序号、分段名称、分段内容、分段长度等字段,详细的定义代码如下:

export interface ImagePart {
  seq: number; // 分段序号
  name: string; // 分段名称
  data: string; // 分段数据
  length: number; // 分段长度
}

二、把图片文件分为多个消息分段

为了按照固定大小切分图片数据,发送端得设置每段的数据包大小数值,不仅要求发送端按照该数值切割图片,接收端也要根据该数值拼接图片。固定的数据包大小声明代码如下:

private blockSize = 50 * 1024; // 每段的数据包大小

接下来先让图片数据总长度除以上面的数据包固定大小,得到切割的分段数量;再对图片数据按照固定长度依次切割,并将各段数据编码成BASE64字符串。详细的图片分段代码如下:

let count = Math.floor(buf.length / this.blockSize) + 1;

// 下面把图片数据经过BASE64编码后发给SocketIO服务器
for (let i = 0; i < count; i++) {
  console.info('sendImage i=' + i);
  let encodeData = '';

  if (i == count - 1) { // 是最后一段图像数据
    let remain = buf.length % this.blockSize;
    let temp = buffer.alloc(remain);
    buf.copy(temp, 0, i * this.blockSize, i * this.blockSize + remain)
    encodeData = temp.toString('base64');
  } else { // 不是最后一段图像数据
    let temp = buffer.alloc(this.blockSize);
    buf.copy(temp, 0, i * this.blockSize, (i + 1) * this.blockSize)
    encodeData = temp.toString('base64');
  }

  // 这里暂时省略向SocketIO服务器发送图片的操作
}

三、把各分段的图片消息依次发给SocketIO服务器

把每个图片分段编码为BASE64串之后,即可将包括序号、长度、内容等等在内的ImagePart分段消息封装为JSON字符串,并提交给三方的SocketIO库发给后端的SocketIO服务器。具体的SocketIO消息发送代码如下:

// 往SocketIO服务器发送本段的图片数据
let part: ImagePart = {seq: i, name: fileName, data: encodeData, length: buf.length}

let data = JSON.stringify(part)

this.client?.emit('send_image', data); // 发送图像数据

那么SocketIO服务器监听图片发送接口send_image,在收到图片消息后,把该消息通过receive_image接口转发给原设备。完整的服务端监听代码参见《Android Studio开发实战:从零基础到App上线(第3版)》一书的“13.5 实战项目:仿微信的私聊和群聊”。

综合上述几个步骤的图片分段、编码与发送过程,才算实现了仿微信聊天App的图片消息发送功能。

下一篇文章会介绍如何从SocketIO服务器接收图片消息。


更多关于HarmonyOS 鸿蒙Next中“仿微信聊天”App开发技术分享(十四)向SocketIO服务器发送图片的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

学习打卡

更多关于HarmonyOS 鸿蒙Next中“仿微信聊天”App开发技术分享(十四)向SocketIO服务器发送图片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中通过SocketIO发送图片,需将图片转换为Base64或二进制数据后传输。使用@ohos/net.socketio创建SocketIO连接。具体步骤:

  1. 使用@ohos.file.fs读取图片文件为ArrayBuffer
  2. 使用@ohos.util.base64将数据编码为Base64字符串
  3. 通过SocketIO的emit()方法发送数据包,事件名自定义(如"imageUpload")

关键代码示例:

const socket = socketio.connect('服务器地址');
const file = fs.openSync('图片路径');
const buffer = fs.readSync(file.fd);
const base64Data = base64.encodeToString(buffer);
socket.emit('imageUpload', {image: base64Data});

HarmonyOS Next图片分段传输实现分析

您分享的HarmonyOS Next中通过SocketIO传输图片的方案设计合理,我来补充几点技术细节:

  1. 分段传输优化
  • 50KB的分段大小选择合理,既考虑了网络传输效率,又避免了过大的内存占用
  • 建议在ImagePart接口中添加total字段,记录总分段数,方便接收端判断是否完整接收
  1. 性能优化建议
  • 可以考虑使用ArrayBuffer替代base64编码,减少33%的数据量
  • 对于大图片,可以添加压缩预处理步骤
  1. 错误处理
  • 建议为每个分段添加校验和字段,确保数据传输完整性
  • 可以实现分段重传机制,应对网络不稳定的情况
  1. HarmonyOS特有优化
  • 可以使用@ohos.fileio的Stream API处理文件分块读取
  • 考虑使用Worker线程处理图片编码/解码,避免阻塞UI

您实现的方案已经很好地解决了图片分段传输的核心问题,后续可以继续优化传输效率和稳定性。

回到顶部