![](/img/trans.png)
[英]Socket programming: TypeError: a bytes-like object is required, not 'str'
[英]python socket programming TypeError: bytes like object is required not str
我有一个 Python 服务器正在运行,它监听 Python 客户端发送的数据。 客户端从用户那里获取输入并将其发送到打印它的服务器。 但是,我收到错误消息“TyperError:需要类似字节的 object,而不是 'str'”。 它位于客户端代码的第 8 行。
服务器代码:
import socket
def server(interface, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((interface, port))
sock.listen(1)
print('Listening at', sock.getsockname())
while True:
sc, sockname = sock.accept()
print('We have accepted a connection from', sockname)
print(' Socket name:', sc.getsockname())
print(' Socket peer:', sc.getpeername())
message = sc.recv(1024)
print(' Incoming sixteen-octet message:', repr(message))
sc.sendall(b'Farewell, client')
sc.close()
print(' Reply sent, socket closed')
if __name__ == '__main__':
server('0.0.0.0', 9999)
客户代码:
import socket
def client(host, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
print('Client has been assigned socket name', sock.getsockname())
command = input("message > ")
sock.sendall(command)
reply = sock.recv(1024)
print('The server said', repr(reply))
sock.close()
if __name__ == '__main__':
client('localhost', 9999)
TyperError:需要类似字节的 object,而不是“str”
socket.sendall
需要bytes
,但是您已经传入了input("message > ")
的结果,这是一个str
。 因此,您需要以某种方式将str
从input
转换为bytes
。 您可以使用encode
来执行此操作:
command = input("message > ").encode()
encode
,嗯,将str
编码为bytes
。
在 Python 中进行通信时,您应该将发送的参数编码为字节,并将接收到的参数解码为字节格式。 你可以从下面的代码中理解我想说的话。
服务器代码:
import socket
def server(interface, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((interface, port))
sock.listen(1)
print('Listening at', sock.getsockname())
while True:
sc, sockname = sock.accept()
print('We have accepted a connection from', sockname)
print(' Socket name:', sc.getsockname())
print(' Socket peer:', sc.getpeername())
message = sc.recv(1024).decode('utf-8')
print(' Incoming sixteen-octet message:', repr(message))
sc.sendall(bytes('Farewell, client','utf-8'))
sc.close()
print(' Reply sent, socket closed')
if __name__ == '__main__':
server('0.0.0.0', 9999)
客户代码:
import socket
def client(host, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
print('Client has been assigned socket name', sock.getsockname())
command = input("message > ")
sock.sendall(bytes(command,'utf-8'))
reply = sock.recv(1024).decode('utf-8)
print('The server said', repr(reply))
sock.close()
if __name__ == '__main__':
client('localhost', 9999)
如果您以这种方式编辑代码,我认为您将更正收到的错误。 我希望它有所帮助,因为我是新手。 对不起我的入门级英语。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.