为什么Python socket.send不返回文档所说的发送字节数?

时间:2017-08-16 18:03:44

标签: python sockets

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'

2 个答案:

答案 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)