python套接字编程类型错误:类似字节的对象不是必需的
我有一个运行的Python服务器,它监听Python客户机发送的数据。客户机从用户处获取输入,并将其发送到服务器,由服务器打印。然而,我得到的错误是“TyperError:a byte-like-object是必需的,而不是'str'”。它位于客户代码的第8行 服务器代码:python套接字编程类型错误:类似字节的对象不是必需的,python,sockets,typeerror,Python,Sockets,Typeerror,我有一个运行的Python服务器,它监听Python客户机发送的数据。客户机从用户处获取输入,并将其发送到服务器,由服务器打印。然而,我得到的错误是“TyperError:a byte-like-object是必需的,而不是'str'”。它位于客户代码的第8行 服务器代码: import socket def server(interface, port): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) soc
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:需要类似字节的对象,而不是“str”
socket.sendall
需要字节
,但您已经传入了输入(“message>”
)的结果,这是一个str
。因此,您需要以某种方式将str
从input
转换为bytes
。您可以使用encode
执行此操作:
command = input("message > ").encode()
encode
,将str
编码为字节
在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)
如果你这样编辑你的代码,我想你会纠正你收到的错误。我希望这对我有所帮助,因为我是新手。对不起,我的初级英语