首先,很抱歉我不能給你一個最小的例子。代碼開始變得非常復雜,我想我不能再準備一個了。
但如果我簡單地告訴你我在做什么,這段代碼允許我通過套接字編程在我撰寫的應用程式和另一個外部應用程式之間進行通信。
我向這個外部程式發送了一個檔案路徑,它將這個路徑添加到它自己的設定中。
奇怪的是,如果我第一次發送訊息(即檔案路徑),就沒有問題。但是當我第二次發送它時,外部應用程式沒有收到訊息(并且我沒有收到任何錯誤)。此時事情開始變得更加奇怪,因為如果我第三次發送訊息,這一次它將我第二次發送的訊息/檔案路徑獲取到它自己的設定。
示例案例:
sent message: A
message received: A
sent message: B
message received: (message not received)
sent message: B
message received: B
sent message : C
message received: (message not received)
sent message: C
message received: (message not received)
sent message: C
message received: C
.
.
.
("message not received" keeps increasing)
我使用的功能:
def send_message(socket: QTcpSocket, message: str = "", message_type: str = "message"):
socket_stream = QDataStream(socket)
socket_stream.setVersion(QDataStream.Qt_5_10)
header_array = QByteArray()
message_size = len(message.encode("utf-8"))
header = f"messageType:{message_type},messageSize:{message_size},"
header_array.prepend(header.encode("utf-8"))
header_array.resize(128)
byte_array = QByteArray(message.encode("utf-8"))
byte_array.prepend(header_array)
socket_stream << byte_array
socket_stream.writeString(message)
def read_socket(self):
buffer = QByteArray()
socket_stream = QDataStream(self.socket)
socket_stream.setVersion(QDataStream.Qt_5_10)
socket_stream.startTransaction()
socket_stream >> buffer
header = buffer.mid(0, 128)
...
message = socket_stream.readString()
什么樣的情況會導致這個問題?
uj5u.com熱心網友回復:
你必須記住 TCP 不是一個資料包協議——它是一個流協議。您將不會收到與發送時完全相同形狀的資料包。如果您快速發送 40 位元組和 80 位元組,則另一端可能會獲得 120 位元組的單次讀取。或者,它可能會得到 20 個位元組,然后是 60 個位元組,然后是 40 個位元組。沒有任何保證。您必須能夠在一次讀取中處理多條訊息,并且您必須有一種方法來檢測您的訊息何時完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/456318.html
標籤:Python 插座 pyqt5 pyside2 pyqt6
