繁体   English   中英

python 套接字编程类型错误:不需要像 object 这样的字节 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 因此,您需要以某种方式将strinput转换为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.

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