我正在尝试使用ws4py创建一个实时聊天应用程序(如果有更好的套接字库,我会喜欢建议),我想在我的应用程序。
对于文本聊天消息,我目前正在使用JSON库在我的插座上发送串行字典,并在任一侧进行解码。像这样的东西
message = raw_input("Message: ")
payload = {"username": self.username, "message": message}
payload["type"] = constants.CHAT
socket.send(json.dumps(payload), False)
我希望能够做同样的事情以进行文件传输,因此我只能发送一个JSON,其中一个字段是.wav文件的数据,而其他字段则是诸如用户名,fileName,fileExtension之类的东西,...
这是发送文件的正确方法吗?如果是这样,我似乎无法弄清楚如何将文件放入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()
您需要将二进制斑点变成可以表示为字符串(没有随机控制字符等)的东西。典型的方法是进行某种编码,例如base64。
import base64
payload['content'] = base64.b64encode(fh.read())
生成二进制数据的十六进制字符串表示。
然后在另一侧:
fileData = base64.b64decode(payload['content'])