socket编程接收消息时的一个问题
An issue when receiving messages with socket programming
首先,很抱歉我不能给你一个最小的例子。代码开始变得很复杂,我觉得我已经写不下去了。
但是如果我简单地告诉你我在做什么,这段代码允许我通过套接字编程在我编写的应用程序和另一个外部应用程序之间进行通信。
我向这个外部程序发送了一个文件路径,它把这个路径添加到它自己的设置中。
奇怪的是,如果我第一次发送消息(即文件路径),没有问题。但是当我第二次发送它时,外部应用程序没有收到消息(而且我没有收到任何错误)。此时事情开始变得更奇怪了,因为如果我第三次发送消息,这次它会得到我第二次发送的消息/文件路径到它自己的设置中。
案例:
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()
什么样的情况会导致这个问题?
您必须记住,TCP 不是数据包协议——它是流协议。您不会收到与发送时形状完全相同的数据包。如果您快速发送 40 字节和 80 字节,另一端可能会单次读取 120 字节。或者,它可能先是 20 个字节,然后是 60 个字节,然后是 40 个字节。没有任何保证。您必须能够在一次读取中处理多条消息,并且必须有一种方法来检测消息何时完成。
首先,很抱歉我不能给你一个最小的例子。代码开始变得很复杂,我觉得我已经写不下去了。
但是如果我简单地告诉你我在做什么,这段代码允许我通过套接字编程在我编写的应用程序和另一个外部应用程序之间进行通信。
我向这个外部程序发送了一个文件路径,它把这个路径添加到它自己的设置中。
奇怪的是,如果我第一次发送消息(即文件路径),没有问题。但是当我第二次发送它时,外部应用程序没有收到消息(而且我没有收到任何错误)。此时事情开始变得更奇怪了,因为如果我第三次发送消息,这次它会得到我第二次发送的消息/文件路径到它自己的设置中。
案例:
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()
什么样的情况会导致这个问题?
您必须记住,TCP 不是数据包协议——它是流协议。您不会收到与发送时形状完全相同的数据包。如果您快速发送 40 字节和 80 字节,另一端可能会单次读取 120 字节。或者,它可能先是 20 个字节,然后是 60 个字节,然后是 40 个字节。没有任何保证。您必须能够在一次读取中处理多条消息,并且必须有一种方法来检测消息何时完成。