According to the docs,Python的socket.send()
:
返回发送的字节数。
但是,当我使用它时,它似乎返回上次发送的字节,而不是发送的总字节数。请考虑以下代码:
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.connect(('localhost', 12345))
>>> r = s.send(bytes(1))
>>> print(r)
1
>>> r = s.send(bytes(15))
>>> print(r)
15
>>> r = s.send(bytes(150))
>>> print(r)
150
>>> r = s.send(bytes(255))
>>> print(r)
255
>>> r = s.send(bytes(0))
>>> print(r)
0
This SO post seems related,虽然它没有回答我的问题。
我期待看到的是每行r == 1
。
解决:
我明白了。这有效:
>>> y = bytearray(1)
>>> y[0] = 125
>>> r = s.send(y)
>>> print(r)
1
我将bytes()
放在那里的原因是因为没有它你会得到:
>>> r = s.send(125)
TypeError: a bytes-like object is required, not 'int'
答案 0 :(得分:3)
正如bytes
的文档所说,如果参数是一个整数,那么它会创建一个这个大小的bytearray。
https://docs.python.org/3.1/library/functions.html#bytes https://docs.python.org/3.1/library/functions.html#bytearray
也许这就是你的意思?
In [26]: r = s.send(b'250')
In [27]: r
Out[27]: 3
但即便如此,b'250'
也会返回3
。
答案 1 :(得分:0)
混淆是Python 2.x和Python 3.x如何使用bytes()
函数。
在Python3中,bytes(100)
将计算为填充为零的100字节二进制数组。 (API docs)
这必须是您正在运行的Python版本,因为此行为与您的输出一致。
在Python2中,bytes(100)
将评估为'100'
。
它将整数转换为字符串,然后将bytearray分配给该值。
在其上执行help(bytes)
表示它实际上与内置对象str
相同。因此,在Python2 bytes(100)
中,行为与str(100)
相同。
同样在您的示例中,即使根据您预期的Python2行为,返回值也不总是1
。
它将是字符串的长度,它与整数中的位数相同,例如3
的情况为bytes(100)
。