“必须是str,而不是字节”

时间:2018-04-03 20:36:08

标签: python string python-3.x sockets

我在python上写了一个服务器:

import  socket
server_socket = socket.socket()
server_socket.bind(('0.0.0.0', 8820))

server_socket.listen(1)

(client_socket, client_address) = server_socket.accept()

client_name = client_socket.recv(1024)
client_socket.send('Hello ' + client_name)

client_socket.close()
server_socket.close()

而且,我写了一个客户:

import socket

my_socket = socket.socket()
my_socket.connect(('127.0.0.1', 8820))

my_socket.send('Sami')
data = my_socket.recv(1024)
print('The server sent: ' + data)

my_socket.close()

但是当我运行代码时,在服务器中出现错误:"must be str, not bytes",在客户端我收到错误:"a bytes-like object is required, not 'str'"

2 个答案:

答案 0 :(得分:2)

在发送之前和收到之后,使用encode/decodestrbytes之间进行转换:

my_socket.send('Sami'.encode('utf-8'))  # encode string before sending
data = my_socket.recv(1024).decode('utf-8')  # decode string after receiving

您可以将'utf-8'替换为其他字符编码,具体取决于您的使用情况(例如,您可能会在Windows应用程序中看到'cp1252')。

对于服务器,不是解码字符串并在将'Hello '放在前面后再次编码,您可以跳过一步并执行此操作:

client_name = client_socket.recv(1024)
client_socket.send(b'Hello ' + client_name)

b'Hello'是一个文字bytes对象,而不是像str这样的'Hello'对象。因此,b'Hello' + client_name将直接bytes + bytes = bytes {而不是client_name转换为str .decode,添加'Hello'以获得另一个str然后使用bytes转换回.encode

答案 1 :(得分:0)

您需要在发送字符串之前进行编码。例如:

mySocket.send("Hello".encode() + Client_name.encode())

或者:

mySocket.send(b"Hello" + Client_name.encode())