【问题标题】:sending a json and an audio file to specific socketId from my app over Socket.io websocket通过 Socket.io websocket 从我的应用程序向特定的 socketId 发送 json 和音频文件
【发布时间】:2020-03-28 22:09:38
【问题描述】:

我正在尝试为我的应用设置聊天功能,我想知道最好的方法。

这是我目前的设想:

用户决定并选择他想与谁通信,然后他记录一个音频消息,该消息保存为文件并将其发送到 websocket。

由于 Socket.IO 的 android 实现不包括 .to(socketId) 方法,我需要在 JSON 中传递消息的预期接收者的 ID(以及一些其他消息相关数据),然后服务器可以阅读以便使用适当的.to(socketId) 调用发出消息。由于我想发送文本和音频,我将音频文件转换为byte[] byteArrayOfAudio,然后使用new String(byteArrayOfAudio) 将其转换为字符串。然后我将这个字符串添加到 JSON 中,并将实际文本发送到 websocket。

服务器读取消息并找到与接收者的用户ID匹配的连接ID(socketId)。然后将消息转发给适当的接收者。接收方解码 json 得到音频字符串,将其转换为 byte[],然后将其转换回适当的音频格式,然后接收方就可以播放了。

我的问题是:

  • 这是最佳做法吗?

  • 有没有办法直接从android 告诉服务器消息要转发到哪个socketId?服务器是否需要不断读取 50 000 个字符的 JSON 对象来获取接收者 ID,这是否存在潜在的高成本处理开销?

  • 我知道对文件进行字符串化会增加其大小,有没有更好的方法呢?

音频文件相当小(最大 50kb),如果收益不显着,我希望将音频文件和相关文本数据集中发送.emit()

任何有用的信息将不胜感激

【问题讨论】:

    标签: android json performance audio socket.io


    【解决方案1】:

    我建议您避免使用 json 发送音频...当使用 websockets 时,完全由您来定义客户端和服务器之间的协议...每个 websocket 消息必须是文本消息或二进制消息...发送使用未包装在 json 中的二进制消息类型的音频

    当您发送每个音频缓冲区时,单独发送它而没有其他属性......一旦在接收端以这种方式发送,测试传入的 websocket 消息的类型并将二进制消息与文本消息流量分开处理

    要唯一标识此二进制流量的发送者,您可以使用一些发送者 ID 标记此缓冲区内的元数据...或者在发送者端,您可以创建二进制音频缓冲区的哈希值作为该缓冲区的唯一标识符然后发送带有此哈希和发送者 id 标记的 json 消息,以便接收方知道它的到来,并且可以将下一条二进制消息与发送者唯一匹配

    【讨论】:

    • 好的,这是一个有用的想法,但服务器如何知道将消息转发给谁。服务器将成为用户通过音频消息相互聊天的平台。许多用户将同时互相聊天。使用 json 我可以在 json 中写入发送者和接收者 ID,但是如果我发送一个独立的二进制文件,服务器如何知道它的地址是谁?
    • 请记住,同一个用户可能同时从不同的其他用户接收多个音频消息,并且在到达时我必须知道如何将此二进制数据分配给我的每个开放式通信线。刚才想想,我想知道这是否可以通过哈希来实现,但我问自己,我从这样做中获得了什么真正的收益。使用 base64 编码音频会增加 33% 的文件大小到有效负载,这真的那么糟糕吗?
    • 文件散列的想法是正确的方法吗?这意味着 id 必须在服务器上缓存与 json msg 对应的文件的哈希值,以便我可以使用它将字节数组转发到正确的 socketId,对吧?
    猜你喜欢
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多