2017-03-05 91 views
5

我想创建一个程序,它将在本地机器上打开一个端口,并让其他人通过netcat连接到它。我目前的代码是。Python套接字错误TypeError:需要类似字节的对象,而不是带发送功能的'str'

s = socket.socket() 
host = '127.0.0.1' 
port = 12345 
s.bind((host, port)) 

s.listen(5) 
while True: 
    c, addr = s.accept() 
    print('Got connection from', addr) 
    c.send('Thank you for connecting') 
    c.close() 

我是新来的Python和套接字。但是,当我运行这段代码将允许我发送带有命令的netcat连接:

nc 127.0.0.1 12345 

但后来在我的Python脚本,我得到了c.send错误:

TypeError: a bytes-like object is required, not 'str' 

我我基本上只是试图打开一个端口,允许netcat连接,并在该机器上有一个完整的shell。

+0

你试过编码了吗? –

+0

不,我可以注释掉c.send,它会运行。你认为这个字符串需要被编码吗? – sqlsqlsql

回答

9

这个错误的原因是,在Python 3中,字符串是Unicode的,但是当在网络上传输时,数据需要是字节字符串。所以...一对夫妇的建议:

  1. 建议使用的c.sendall()代替c.send()以防止在那里你可能没有发送整个味精用一个电话(见docs)可能存在的问题。
  2. 对于文字,添加'b'为字节字符串:c.sendall(b'Thank you for connecting')
  3. 对于变量,则需要进行Unicode字符串字节字符串(见下文)

最好的解决办法:

output = 'Thank you for connecting' 
c.sendall(output.encode('utf-8')) 

结语/背景:这不是Python 2中的问题,因为字符串已经是字节字符串了 - 您的OP代码将在该环境中完美工作。 Unicode字符串是在Python 1.6/2.0中添加的,并且在成为默认的字符串类型之前一直保持到3.x。另见this question

+1

谢谢你。这是非常有用的,也回答了我的问题。 – sqlsqlsql

0

您可以发送线路改成这样:

c.send(b'Thank you for connecting') 

在B使它字节而不是。

+0

谢谢你做到了! – sqlsqlsql

4

您可以用receive.decode('utf_8')将其解码为str。

相关问题