socket编程: TypeError: must be bytes or buffer, not str
先看一段代码
#!/usr/bin/env python3
from socket import *
serverName = "10.10.10.132"
serverPort = 80
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
clientSocket.send("GET / HTTP/1.1\r\nHost: 10.10.10.132\r\n\r\n")
response = clientSocket.recv(4096)
print(response)
clientSocket.close()
在命令行中执行会出错,显示 TypeError: must be bytes or buffer, not str,错误在 clientSocket.send("GET / HTTP/1.1\r\nHost: 10.10.10.132\r\n\r\n")这一行。
意思是send的这个字符串格式错误,应该是字节或者缓冲区(差不多是这个意思吧?)。
google一下,看看stackoverflow:
翻译一下:这个问题就是python2与python3的区别之一,在python2中,send发送的string可以被当做'bytes',但是在python3中string就是string,bytes就是bytes,在调用send方法时,必须转换成字节(bytes)。
那如何将string转换成byte呢?
两种方法:
1.在字符串前加一个b,表示将字符串以bytes方式输出,即:b"This is a string"。
2.使用encode()方法
还有一种方法不推荐,就是使用python2的环境:将文件首部的#!/usr/bin/env python3
改成#!/usr/bin/python
现在知道问题所在了,把出错的那一行改成clientSocket.send(b"GET / HTTP/1.1\r\nHost: 10.10.10.132\r\n\r\n"),或者clientSocket.send("GET / HTTP/1.1\r\nHost: 10.10.10.132\r\n\r\n".encode())
enter, 运行。
搞定
那个stackoverflow链接:https://stackoverflow.com/questions/2411864/python-socket-send-buffer-vs-str