【问题标题】:Why doesn't Python socket.send return the number of bytes sent as the documentation says?为什么 Python socket.send 不返回文档所说的发送的字节数?
【发布时间】:2017-08-16 18:03:44
【问题描述】:

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'

【问题讨论】:

  • 也许你把byteschr混淆了?

标签: python sockets


【解决方案1】:

正如bytes 的文档所说,如果参数是一个整数,那么它会创建一个该大小的字节数组。

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

【讨论】:

    【解决方案2】:

    令人困惑的是 Python 2.x 和 Python 3.x 如何使用 bytes() 函数。

    在 Python3 中,bytes(100) 将计算为一个用零填充的 100 字节二进制数组。 (API docs) 这必须是您正在运行的 Python 版本,因为此行为与您的输出一致。

    在 Python2 中,bytes(100) 的计算结果为 '100'。 它将整数转换为字符串,然后将字节数组分配给该值。 在它上面做help(bytes)说明它实际上和内置对象str是一样的。所以在 Python2 中 bytes(100) 的行为与 str(100) 相同。

    同样在您的示例中,即使根据您预期的 Python2 行为,返回值也不总是1。 这将是字符串的长度,与整数中的位数相同,例如3 对于bytes(100) 的情况。

    【讨论】:

      猜你喜欢
      • 2020-03-15
      • 2013-10-12
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多