VB.Net套接字通信,接收异常数据

VB.Net套接字通信,接收异常数据,.net,vb.net,sockets,networking,air,.net,Vb.net,Sockets,Networking,Air,我正在尝试通过套接字与PC上的本地AS3 Air应用程序通信。 在这种情况下,VB.Net应用程序充当服务器,而Air应用程序充当客户端 .Net应用程序每25毫秒向Air应用程序发送一次数据。我没有发送任何终止消息。 我只是在Air应用程序上接收数据并进行处理 在接收端,当我调试数据时,我看到一些转换已经被浓缩 类似于如果我连续发送“ABCDEF”,在大多数情况下,我确实会收到“ABCDEF”,但在某些情况下,我会收到“ABCDEFABCDEF” 底层TCP网络是否可能正在组合数据,然后将其作

我正在尝试通过套接字与PC上的本地AS3 Air应用程序通信。 在这种情况下,VB.Net应用程序充当服务器,而Air应用程序充当客户端

.Net应用程序每25毫秒向Air应用程序发送一次数据。我没有发送任何终止消息。 我只是在Air应用程序上接收数据并进行处理

在接收端,当我调试数据时,我看到一些转换已经被浓缩

类似于如果我连续发送
“ABCDEF”
,在大多数情况下,我确实会收到
“ABCDEF”
,但在某些情况下,我会收到
“ABCDEFABCDEF”

底层TCP网络是否可能正在组合数据,然后将其作为一个数据包发送。 我真的需要发送一些消息终止符吗?例如,像这样的
“ABCDEF$”
,然后在接收端拆分我的消息


我是不是在浪费时间?

来自以下文档:

也不能保证您发送的数据会立即出现在网络上。为了提高网络效率,底层系统可能会延迟传输,直到收集到大量传出数据。Send方法的成功完成意味着基础系统有空间为网络发送缓冲您的数据


也不能保证您会在接收端收到完整的消息——这正是套接字的工作方式。我建议添加一个“消息结束”标记,并在接收代码中循环,直到接收到完整的消息——但您可能会收到一个跨越两条消息的缓冲区,因此当您有一个“消息结束”标记时,您需要保留在该点之后接收到的任何数据,以便用于重建下一条消息

例如,假设您要接收两条消息——“aaaaa”和“bbbbbb”。您可能会从三个单独的要接收的呼叫中接收以下内容(在添加$作为消息结束标记后):

你能在插座上设置为真吗

Nagle算法旨在通过使套接字缓冲小数据包,然后在特定情况下将它们合并并发送到一个数据包中,从而减少网络流量。TCP数据包由40字节的报头加上正在发送的数据组成。当使用TCP发送小数据包时,TCP报头产生的开销可能成为网络流量的重要部分。在负载沉重的网络上,这种开销导致的拥塞可能导致数据报丢失和重新传输,以及拥塞导致的过度传播时间。当新的传出数据从用户处到达时,如果连接上先前传输的任何数据未确认,Nagle算法将禁止发送新的TCP段


我正在使用networkStream.Write(),这是否也适用于该方法?@Kevin-是的,它使用
Socket.Send
内部发送避免这种情况的推荐技术是什么?我和我是否必须在客户端(air应用程序)和服务器(.net)上都设置它?我相信这是用来发送数据包的,所以只有服务器需要设置。我在客户端连接时,在服务器端将节点延迟设置为true,但是在发送的1000条消息中,我仍然会收到大约20条消息。
AAAA
AAAA$BB
BBBBBB$