我正在使用Python练习数据发送,并且对于SERVER的代码有问题:
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)
while True:
print("waitin for msg...")
data, addr = udpSerSock.recvfrom(BUFSIZ)
udpSerSock.sendto("[%s] %s" % (ctime().encode("utf-8"), data), addr)
print("...received from and returned to ")
udpSerSock.close()
问题出在这一行
udpSerSock.sendto("[%s] %s" % (ctime().encode("utf-8"), data), addr)
每当我向服务器发送消息时它都会崩溃。“str不支持缓冲区接口” 如何改变那条线? 我知道问题是“[%s]%s”,但不知道如何解决它。
UPD>>>>> 解决了它。凌乱的方式:
udpSerSock.sendto(ctime().encode("utf-8") + b" " + data, addr)
答案 0 :(得分:0)
问题是你正在构建一个字符串。所以,即使你将bytes
个对象放入其中,它仍然是一个字符串。你需要做的是构建你的字符串,然后对整个事物进行编码。
msg = "[{}] {}".format(ctime(), data.decode())
b_msg = msg.encode()
udpSerSock.sendto(b_msg, addr)
您可以通过以下方式轻松诊断:
>>> your_msg = "[%s] %s" % (ctime().encode('utf-8'), data)
>>> print(type(your_msg))
<class 'str'>
>>> print(your_msg)
[b'Tue Apr 14 20:20:18 2015'] b'some data here' # note the multiple b'...'s
如果先构建整个字符串然后对其进行编码,那么
>>> my_msg = "[{}] {}".format(ctime(), data.decode()).encode()
>>> print(type(my_msg))
<class 'bytes'>
>>> print(my_msg)
b'[Tue Apr 14 20:21:38 2015] some data here' # note the singular b'...'