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

时间:2017-05-11 16:13:30

标签: python sockets dictionary pickle encode

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

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

#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和解码的顺序,但仍然无济于事。

1 个答案:

答案 0 :(得分:1)

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