如何通过 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 套接字。)
我知道有人提出了类似的问题,但它们似乎对我不起作用!我已经尝试序列化字典,然后将其转换为字符串,然后在通过套接字发送之前对其进行编码。到目前为止没有成功!
这是我的服务器代码: #图书馆 进口套接字 进口泡菜
#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 套接字。)