如何通过 Python 中的套接字发送字典?

How do you send a dictionary over a socket in Python?

我知道有人提出了类似的问题,但它们似乎对我不起作用!我已经尝试序列化字典,然后将其转换为字符串,然后在通过套接字发送之前对其进行编码。到目前为止没有成功!

这是我的服务器代码: #图书馆 进口套接字 进口泡菜

#socket initialization
host = "127.0.0.1"
port = 5000
mainAddr = (host, port)

#dict initialization
dataDict = {} #just imagine that dict has content

#create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #TCP
s.bind((mainAddr))
s.listen(4)
print('program started')
print('listening..')

while True:
    try:
        conn, addr = s.accept()
        print("connection from: "+str(addr))
        print("sending message..")
        pickle.dumps(dataDict)
        print('pickled!')
        dataS = str(dataP)
        print('stringed!')
        dataE = dataS.encode('UTF-8')
        print('encoded!')
        s.sendto(dataE,addr)
        print('data sent!')
    except: 
        pass

s.close()

对于套接字初始化,我尝试了其他类型:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #UDP
s = socket.socket()

对于发送部分,我尝试了这些替代方案:

s.send(dataE)
s.send(dataE,addr)
s.sendall(dataE)
s.sendall(dataE,addr)

当我运行程序时,这些被打印出来:

program started
listening..
connection from:<insert addr here>
sending message..
pickled!
stringed!
encoded!

只有data sent!没有发送。所以我猜测是发送部分有问题。

对于客户端,代码如下:

#library
import socket
import pickle

#initialization
host = '127.0.0.1'
port = 5000
buffer = 1024

#create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #TCP
s.connect((host,port))
print('connected!')

#receive dictionary
print('receiving message..')
while True:
    data, addr = s.recvfrom(buffer)
    print('received!')
    dataD = data.decode("UTF-8")
    print('decoded!')
    dataP = pickle.loads(dataD)
    print('unpickled!')
    print(str(dataP))

s.close()

在客户端,只打印以下内容:

connected!
receiving message..

在客户端,我试过更改 unpickling 和解码的顺序,但仍然无济于事。

TCP 服务器套接字实际上并不用于 sending/receiving 数据;我很惊讶你在调用 s.send() 或类似的时候没有收到错误。相反,它是一个工厂,用于为连接到服务器的每个客户端生成单独的套接字 - conn,在您的代码中。所以,conn.sendall() 是你应该使用的。不需要地址参数,单个套接字已经知道它在和谁通话。 (.send() 如果您不做一些额外的工作是不可靠的;.sendto() 仅用于未连接到特定客户端的 UDP 套接字。)