首页 > 解决方案 > 无法在客户端加载 JSON 类型的消息

问题描述

当客户端从服务器接收到 JSON 类型消息时,我无法在其中加载带有字典的 JSON 类型消息

字典包含:消息、发件人地址、发送时间当我将字典转储到 JSON 并将其发送到客户端时,客户端尝试加载此字典,因此他不能使用来自服务器的字典中的数据并将其打印给用户此外,当客户端发送消息他可以写“/r”来接收来自服务器的数据,这意味着客户端可以一次接收大数据。这只是从服务器和客户端发送和接收数据的部分代码

服务器

    def serialize_data(self, sending_time, message, address,):
        message_dict = {
            'sending_time': sending_time,
            'message': message,
            'sender_address': address
            }
        serialized_dict = dumps(message_dict)
        return serialized_dict

    def send_messages(self, data_dict, address):
        if enable_log:
            message = f'{self.get_time()}, {data_dict["message"]}, {address}'
            self.save_log(message, 'a')
        message = self.serialize_data(self.get_time(), data_dict['message'], address)
        for client in self.connections_list:
            message = dumps(message)
            client.sendall(bytes(message, encoding='utf-8'))

客户

    def receive_data(self,):
        while True:
            try:
                data = self.sock.recv(2048).decode('utf-8')
                print(data)
                data_dict = loads(data)
                for d in data_dict:
                    d = loads(d)
                    d = f"{d['sending_time']} {d['sender_address']} - {d['message']}"
                    print(d)
            except timeout:
                break

当我尝试从服务器接收数据时,我在客户端得到了这个:

"{\"sending_time\": \"2019-05-17 | 21:16:32 \", \"message\": \"connected!\", \"sender_address\": \"127.0.0.1\"}""{\"sending_time\": \"2019-05-17 | 21:16:33 \", \"message\": \"abcd\", \"sender_address\": \"127.0.0.1\"}"

标签: pythonsockets

解决方案


那是因为您调用 json.dumps() 两次。

def serialize_data(self, sending_time, message, address,):
    message_dict = {
        'sending_time': sending_time,
        'message': message,
        'sender_address': address
        }
    serialized_dict = dumps(message_dict) # -------------> first time
    return serialized_dict


def send_messages(self, data_dict, address):
    if enable_log:
        message = f'{self.get_time()}, {data_dict["message"]}, {address}'
        self.save_log(message, 'a')
    message = self.serialize_data(self.get_time(), data_dict['message'], address)
    for client in self.connections_list:
        message = dumps(message)  # ------------------> Second time
        client.sendall(bytes(message, encoding='utf-8'))

删除其中任何一个都应该修复它。


推荐阅读