1

我正在尝试使用 ws4py 创建一个实时聊天应用程序(如果有更好的套接字库,我会喜欢建议)并且我想在我的应用程序中实现文件传输(特别是 .wav 文件)。

对于文本聊天消息,我目前正在使用 JSON 库通过我的套接字发送序列化字典并在任一端对其进行解码。像这样的东西

message = raw_input("Message: ")
payload = {"username": self.username, "message": message}
payload["type"] = constants.CHAT
socket.send(json.dumps(payload), False)

我希望能够为文件传输做同样的事情,所以我可以只发送一个 JSON,其中一个字段是 .wav 文件的数据,其他字段是用户名、文件名、文件扩展名等。 .

这是发送文件的正确方法吗?如果是这样,我似乎无法弄清楚如何将文件转换为 JSON 字符串以通过网络发送。这是我正在尝试的

fh = open('foo.wav', 'rb')
payload = {}
payload['content'] = fh.read()
import json
js = json.dumps(payload)

这是我得到的错误

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 4-5: invalid continuation byte

我将如何序列化和反序列化包含文件的 JSON,以便我可以通过套接字发送它?

我的目标是一旦这个工作我可以让这个交易的接收端代码看起来像这样

def received_message(self, received_message):
    payload = json.loads(received_message)
    filename = payload['filename']
    fileData = payload['content']
    fh = open(filename, 'wb')
    fh.write(fileData)
    fh.close()
4

1 回答 1

6

您需要将二进制 blob 变成可以表示为字符串的东西(没有随机控制字符等)。典型的方法是进行某种编码,例如 base64

import base64
payload['content'] = base64.b64encode(fh.read())

这会生成二进制数据的十六进制字符串表示。

然后在另一边:

fileData = base64.b64decode(payload['content'])
于 2017-03-02T07:10:42.430 回答