python - Python套接字输出错误的参数
问题描述
我试图让我的 python 代码在 python 3 上工作。在 python 2 中它工作正常,但是当我把它放在 python 3 中时,它从套接字接收到错误的文本。在 python 2 中它收到stop
了,但在 python 3 中它收到了b'stop'
. 我不知道为什么。
我的代码:
import socket
import sys
import subprocess
HOST = '192.168.176.71'
PORT = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('socket created')
try:
s.bind((HOST, PORT))
except socket.error as err:
print('Bind Failed, Error Code: ' + str(err[0]) + ', Message: ' + err[1])
sys.exit()
print('Socket Bind Success!')
s.listen(10)
print('Socket is now listening')
while 1:
conn, addr = s.accept()
print('Connect with ' + addr[0] + ':' + str(addr[1]))
buf = conn.recv(4096)
if buf == "stop":
print("stoping")
exit()
print(buf)
s.close()
解决方案
'stop'
是一个字符串并且b'stop'
是一个字节对象而不是一个字符串。
python 3的文档recv()
说:
从套接字接收数据。返回值是一个字节对象,表示接收到的数据。
python 2的文档recv()
说:
返回值是一个字符串,表示接收到的数据。
因此,在 python 2 中行为是正确的,您会收到一个字符串,但在 python 3 中,您会收到字节。因此,如果您希望将其作为字符串,则需要对其进行解码。
data = bytes('stop'.encode())
print(data)
print(data.decode())
print(data == 'stop')
print(data.decode() == 'stop')
输出
b'stop'
stop
False
True
推荐阅读
- java - PE部分标志
- php - 想要得到如下结果。如何为此编写查询
- r - 简单的 If 语句。比较非数值
- angular - 子路由不起作用,应用程序重定向到 404 页面
- python - Django查询,仅当所有子项的列值为零时才返回
- ruby-on-rails - 带有自动完成功能的 Rails 标记
- python - 处理 Flask 路由中的所有异常
- xml - XPath 1.0 条件:如果 b 的值为 true,则选择 a
- c# - 选择 Linq 无法将类型 byte[] 隐式转换为 System.web.httpPostedFileBase
- ios - UIView.init() 只能在主线程中使用(当我转到这个控制器时)