首页 > 解决方案 > 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()

标签: pythonpython-3.xsockets

解决方案


'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

推荐阅读