繁体   English   中英

TypeError:需要一个类似字节的对象,而不是'str'

[英]TypeError: a bytes-like object is required, not 'str'

我正在尝试建立客户端-服务器模型,这是python网络编程的新手,但我陷入了一个错误,该错误指出以下内容:

tcpCliSoc.send('[%s]%s'%(bytes(ctime(),'utf_8'),data))TypeError:需要一个类似字节的对象,而不是'str'

这是服务器和客户端的实现

TCP服务器实施

from socket import *  
from time import ctime

HOST = ''  
PORT = 21572  
ADDR = (HOST, PORT)  
BUFFSIZE = 1024  

tcpSerSoc = socket(AF_INET, SOCK_STREAM)

tcpSerSoc.bind(ADDR)
tcpSerSoc.listen(5)

while True:  
    print("waiting for connection......")  
    tcpCliSoc, addr = tcpSerSoc.accept()  
    print("connected from", addr)  

    while True:  
        data = tcpCliSoc.recv(BUFFSIZE)
        if not data:
            break
        tcpCliSoc.send('[%s] %s' % (bytes(ctime(), 'utf_8'), data))
    tcpCliSoc.close()
tcpSerSoc.close()

TCP客户端实现

from socket import *

__author__ = 'Lamer'

HOST = 'localhost'
PORT = 21572
ADDR = (HOST, PORT)
BUFFSIZE = 1024

tcpCliSoc = socket(AF_INET, SOCK_STREAM)
tcpCliSoc.connect(ADDR)

while True:
    data = input('>')
    if not data:
        break
    tcpCliSoc.send(data.encode())
    data = tcpCliSoc.recv(BUFFSIZE)
    if not data:
        break
    print(data.decode(encoding='utf-8'))

tcpCliSoc.close()

字符串插值创建的是字符串,而不是字节对象:

>>> '%s foo' % b'bar'
"b'bar' foo"

(请注意,结果的类型为str -并且它有一个'b'和一些您可能不希望插入的引号)。

您可能想用字节插入字节:

>>> b'%s foo' % b'bar'
b'bar foo'

或者,在您的代码中:

tcpCliSoc.send(b'[%s] %s' % (bytes(ctime(), 'utf_8'), data))

在行中

tcpCliSoc.send('[%s] %s' % (bytes(ctime(), 'utf_8'), data))

参数'[%s] %s' % (bytes(ctime(), 'utf_8'), data)是字符串,而不是字节数组。 即使您将字节对象用于第二个字符串占位符,总的格式化字符串“ [blah] blah”也是一个字符串。 您应该可以使用以下方法轻松解决此问题:

message_str = '[%s] %s' % (bytes(ctime(), 'utf_8'), data)
message_bytes = message_str.encode(utf-8)
tcpCliSoc.send(message_bytes)

我正在使用Python 3.5.1,并且遇到了发送和接收数据的问题。 通过将编码添加到服务器和客户端,我解决了错误“ TypeError:不带编码的字符串参数”。

# Server Code:
while True:
    data = c.recv(1024)
    if not data:
        break;
    print("from connected user:"+ str(data))
    data = str(data).upper()
    print("Sending :"+ str(data))
    byte_message = data.encode()
    c.send(byte_message)
c.close()
# Client Code:
while(message != 'q'):
    fmessage = message.encode()
    s.send(fmessage)
    data = s.recv(1024)
    print("Recieved from server :" + str(data))
    message = input()
s.close()

请享用 !!!

达摩德拉

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM