字符串格式化`bytes`对象给了我一个字符串

时间:2015-04-15 02:32:54

标签: python python-3.x

我正在使用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)

1 个答案:

答案 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'...'