【问题标题】:Send a single byte over TCP socket python通过 TCP 套接字 python 发送一个字节
【发布时间】:2018-06-13 10:14:07
【问题描述】:

我正在尝试在 python 3.x 中编写一个函数,该函数返回单个字节的数据以通过 TCP 连接发送。

我要发送的数据是从 0 到 100 的 unsigned integer

我正在使用sys.getsizeof(data) 检查数据使用的字节,但我没有遇到sys.getsizeof(data) == 1 的实例。

让我们说data = 10

我尝试了几种不同的方式来存储一个字节:

 1) struct.pack('>b', 10)

 2) bytes(10), bytes([10])

 3) 0x10

 4) bytearray(10)

 5) b'10'

所有这些都返回了超过两位数的字节大小。

我正在寻找一种在 python 中通过 TCP 套接字发送单个字节的方法。

【问题讨论】:

  • 如果你只有一个字节,那么如果你有几十个字节的开销也没关系,因为你只支付了一次开销。您拥有数十亿字节的内存。
  • 你能再解释一下吗?当然它不使用这些字节,但由于空间限制,我不想要开销。
  • 现在,如果您不止一次调用此函数,那么您有 bunch 字节要存储,然后将它们 together 存储在相同的字节数组。
  • 我只想返回一个字节
  • Python 对象不能那样工作。你不能只有一个字节或一个机器整数,你总是得到一个成熟的对象,随之而来的开销。也许你应该解释一下你真正想要做什么。例如,如果您需要将一个字节从 Python 传递到用 C 编写的库,那么有一种方法可以做到这一点。

标签: python python-3.x sockets tcp tcpclient


【解决方案1】:

Python 不像 C 或 C++。 Python 天生就有很高的开销。您不能将数据存储在内存中,而是获取存储在内存中的成熟对象。

当你尝试像

 1) struct.pack('>b', 10)
 2) bytes(10), bytes([10])
 3) 0x10
 4) bytearray(10)
 5) b'10'

这些不是将字节直接存储到内存中,而是创建 python 对象来存储字节数据。这就是为什么sys.getsizeof(data) != 1

话虽如此,有办法解决这个问题。 socket.send() 需要缓冲区或字符串,python 有字节字符串。所以socket.send('\x0a') 会发送一个字节。你也可以从函数中返回一个字节串。

def return_byte_string():
    return b'\x0a'

然后可以将其传递到socket.send(return_byte_string()) 以通过 TCP 连接发送单个字节。

【讨论】:

    【解决方案2】:

    回答 OP 的基本问题:

    我正在尝试通过 TCP 套接字发送该单个字节。

    用于保存字节的 Python 表示是无关紧要的。您不发送 Python 对象的副本,而是发送 Python 对象中包含的值。由于socket.send() 需要缓冲区或字符串,我会让你的函数返回一个字节字符串:b'\x0a' 应该可以工作。

    这是一个简单的客户端程序,它只向服务器发送一个字节:

    import socket
    
    def return_one_byte():
        return b'\x10'
    
    s = socket.socket()
    s.connect(('localhost', 1234))
    s.send(return_one_byte())
    s.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2015-04-11
      • 2016-02-17
      • 2020-04-28
      • 2019-03-31
      相关资源
      最近更新 更多