服务器无法在vb6中顺利接收字节数据

服务器无法在vb6中顺利接收字节数据,vb6,Vb6,我有一个发送器,一个消息转发器,它以每个消息5毫秒的速率将固定大小的字节数据发送到我用vb6编写的接收程序。当我在一台机器上运行消息转发器和接收程序时,没有问题,但当它们在不同的机器上运行时,接收程序开始出现一些异常 e、 g: 我有时会收到“2合1”消息,因为它以250字节或不可识别的字节大小出现,而我本应只接收100或150个字节,但如果我将发送速率降低到较低的速度,例如每条消息50毫秒,那么就可以了 有人能提供建议吗?谢谢。在通过网络发送数据时,您必须习惯数据包可能会无序到达,而不是及时到

我有一个发送器,一个消息转发器,它以每个消息5毫秒的速率将固定大小的字节数据发送到我用vb6编写的接收程序。当我在一台机器上运行消息转发器和接收程序时,没有问题,但当它们在不同的机器上运行时,接收程序开始出现一些异常

e、 g:

我有时会收到“2合1”消息,因为它以250字节或不可识别的字节大小出现,而我本应只接收100或150个字节,但如果我将发送速率降低到较低的速度,例如每条消息50毫秒,那么就可以了


有人能提供建议吗?谢谢。

在通过网络发送数据时,您必须习惯数据包可能会无序到达,而不是及时到达,或者根本没有到达,等等

您需要改进您的消息协议,以包含一个标头,该标头说明接下来是哪种类型的消息。如果顺序很重要,请包含一个序列号(我假设您使用的是UDP)。目前,您正依赖于定时来分离消息,这是网络上无法依赖的


缓冲所有到达的数据并将其分块处理-标头允许您告诉要使用的数据块大小。将输入缓冲区与消息处理分开—使用DataArrival事件将数据添加到缓冲区,使用计时器或其他轮询缓冲区的方法检查缓冲区是否有准备好解析的消息。唉,这是VB6,所以线程不是那么容易。如果您需要一个不依赖当前UI元素的计时器类,请查看计时器对象DLL。

TCP数据将按顺序到达。在“消息”后面还可以使用分隔符,而不是标题。但是,我看不出有任何理由使用任何类型的计时器。在DataArrival中,您只需将新数据附加到缓冲区,然后解析并处理所有完整的消息。感谢您的建议,我使用TCP进行数据传输,我不确定是否可以使用分隔符,因为传入的字节不是字符串消息,而是数组的字节,稍后将通过相应地移出字节进行处理。从上面的例子中,如果我收到250个字节,可能有一种方法来分割它,但有时它会以一些不规则的大小到达,比如180…等等,如果我错了,请纠正我。谢谢。对于二进制数据,您非常需要上面建议的长度头。
private sub socket_DataArrival(index as integer, ByVal dataTotal as Long)

 Dim Data() as Byte
 Length.Text = dataTotal

 socket.GetData byteData, vbArray + vbByte

 If Length.Text = "100" Then
  txtOutput.Text = "Message1"

 ElseIf Length.Text = "150" Then
  txtOutput.text = "Message2"

End Sub