首页 > 解决方案 > 是否可以通过socket.io java客户端在json中发送字节数组

问题描述

这实际上是两个问题,但它们密切相关

我已经读过很多次了,你必须通过像 socket.io 这样的 websocket 发送 json/string 或二进制数据,但你不能混合这些类型。但是后来我在socket.io客户端java实现的官方文档中找到了下面这个例子,让我很疑惑

// Sending an object
JSONObject obj = new JSONObject();
obj.put("hello", "server");
obj.put("binary", new byte[42]);
socket.emit("foo", obj);

// Receiving an object
socket.on("foo", new Emitter.Listener() {
  @Override
  public void call(Object... args) {
    JSONObject obj = (JSONObject)args[0];
  }
});

顾名思义,该 json 的“二进制”元素显然是二进制的。文档讨论了使用 org.json 的 socket.io,但我找不到该库支持将二进制数据添加到任何地方的 json 文件。

现在支持此功能吗?如果是这样,socket.io 在后台做什么?是否将发射分成两个单独的消息然后重新合并?还是只是将二进制数据保存在base64中?

一点背景。

我正在尝试向我的应用程序添加私人聊天功能,以便用户可以与其他几个用户进行多个基于私人两方音频消息的聊天对话。我在找出如何告诉我的服务器如何转发所有消息时遇到问题。如果我使用 json,我可以简单地将发送者和接收者添加到 json 中,并让服务器读取接收者的 id 并相应地转发消息。但我不确定如何处理仅包含二进制数据的消息。我不知道如何向它们添加元数据(例如发送者和接收者 ID),以便服务器知道它们的地址。我听说过发送带有发送者 ID、接收者 ID 和我尝试发送的文件的 MD5 哈希的 json 的建议,然后单独发送二进制数据并让服务器通过 md5 签名匹配两条消息, 但这似乎有其自身的问题。就像我不知道如何计算服务器上大量音频文件的 MD5 会影响服务器性能,并且还有可能在指定其目的地的 json 到达之前接收音频字节数组的问题。

正如我到目前为止所做的那样,总是可以将我的音频文件编码为 base64 并将它们作为 json 发送,但我被告知这是一种不好的做法,应该避免,因为它会增加包的大小。

我觉得那里已经有很多消息应用程序,我敢打赌至少有一些是基于 websockets 的。我想知道是否有关于如何通过 websocket 将二进制数据路由到特定接收连接的最佳实践。

我会投票赞成上述问题的任何答案以及有关如何解决背景部分中提到的问题的任何提示。

标签: javaandroidarrayssocket.io

解决方案


推荐阅读