簡體   English   中英

通過TCP套接字python發送一個字節

[英]Send a single byte over TCP socket python

我正在嘗試在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套接字發送單個字節的方法。

回答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()

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連接發送單個字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM