Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python套接字编程类型错误:类似字节的对象不是必需的_Python_Sockets_Typeerror - Fatal编程技术网

python套接字编程类型错误:类似字节的对象不是必需的

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

我有一个运行的Python服务器,它监听Python客户机发送的数据。客户机从用户处获取输入,并将其发送到服务器,由服务器打印。然而,我得到的错误是“TyperError:a byte-like-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:需要类似字节的对象,而不是“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)
如果你这样编辑你的代码,我想你会纠正你收到的错误。我希望这对我有所帮助,因为我是新手。对不起,我的初级英语