我正在尝试在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套接字发送单个字节的方法。
答案 0 :(得分:3)
回答OP的基本问题:
我试图通过TCP套接字发送该单字节。
用于保存字节的Python表示无关紧要。您不发送Python对象的副本,而是发送Python对象中包含的值。由于socket.send()
需要一个缓冲区或字符串,我的函数会返回一个bytestring: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()
答案 1 :(得分:3)
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连接发送单个字节。