【问题标题】:How to send a json object using tcp socket in python如何在python中使用tcp套接字发送json对象
【发布时间】:2016-10-02 13:46:14
【问题描述】:

这是我的 python tcp 客户端。我想向服务器发送一个 json 对象。但我无法使用 sendall() 方法发送该对象。我该怎么做?

import socket
import sys
import json

HOST, PORT = "localhost", 9999

m ='{"id": 2, "name": "abc"}'
jsonObj = json.loads(m)


data = jsonObj

# Create a socket (SOCK_STREAM means a TCP socket)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    # Connect to server and send data
    sock.connect((HOST, PORT))
    sock.sendall(jsonObj)


    # Receive data from the server and shut down
    received = sock.recv(1024)
finally:
    sock.close()

print "Sent:     {}".format(data)
print "Received: {}".format(received)

【问题讨论】:

  • 当您说“我无法发送对象”时,您是否看到任何错误?还是程序卡住了?您是否已验证 TCP 服务器正在侦听 localhost:9999?
  • 服务器正在监听。并出现以下错误.. Traceback(最近一次调用最后一次):文件“C:/Users/Lochana/PycharmProjects/SocketClient/TCPClient.py”,第 19 行,在 sock.sendall(jsonObj) 文件“C: \Python27\lib\socket.py",第 228 行,在 meth 返回 getattr(self._sock,name)(*args) TypeError: sendall() argument 1 must be string or buffer, not dict
  • 在这种情况下,您需要将 dict 序列化为字符串。或者将对象 'm' 传递给 sendall 而不是 'jsonObj'。 (什么是序列化-en.m.wikipedia.org/wiki/Serialization

标签: python json sockets tcp


【解决方案1】:

在我的程序中使用如下所示的 json 发送 dict。

import socket
import sys
import json

HOST, PORT = "localhost", 9999

#m ='{"id": 2, "name": "abc"}'
m = {"id": 2, "name": "abc"} # a real dict.


data = json.dumps(m)

# Create a socket (SOCK_STREAM means a TCP socket)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    # Connect to server and send data
    sock.connect((HOST, PORT))
    sock.sendall(bytes(data,encoding="utf-8"))


    # Receive data from the server and shut down
    received = sock.recv(1024)
    received = received.decode("utf-8")

finally:
    sock.close()

print "Sent:     {}".format(data)
print "Received: {}".format(received)

【讨论】:

    【解决方案2】:

    跳过json.loads() 部分。将 json 对象作为 json 字符串发送,并在 TCP 客户端从字符串中加载。

    同时检查:Python sending dictionary throught TCP

    【讨论】:

    • 不,您不能发送 JSON 对象。你需要先序列化它
    • @LochanaThenuwara 套接字的 Send 和 sendall 方法接受字符串作为参数。因此,您需要将数据作为字符串发送。在这种情况下,数据是 json。在客户端,将其转换为字符串,在服务器端,将接收到的字符串转换为 json。
    • 当它只是一个字符串时返回 TypeError: a bytes-like object is required, not 'str' 并且当与 json.loads 一起使用时返回TypeError: 需要一个类似字节的对象,而不是 'dict'
    【解决方案3】:

    您可以从Python sending dictionary through TCP 找到 最好将 JSON 对象转换为字典并使用以下 sn-p

    import json
    data = json.load(open("data.json"))
     //or 
    data = json.load('{"id": 2, "name": "abc"}')
    
    type(data)
    print(data[<keyFromTheJsonFile>])
    

    你应该用pickle序列化它:

    import pickle
    dict = {...}
    tcp_send(pickle.dumps(dict))
    

    在另一端:

    import pickle
    dict = pickle.loads(tcp_recieve())
    

    如果另一端不是python写的,可以使用数据序列化格式,如xmljsonyaml

    【讨论】:

      猜你喜欢
      • 2015-01-08
      • 1970-01-01
      • 2014-03-24
      • 2016-11-19
      • 2021-07-17
      • 2015-01-30
      • 2012-12-03
      • 2018-05-07
      • 2022-01-15
      相关资源
      最近更新 更多