在VB6中工作时,我使用Winsock通过互联网发送和接收消息。 VB6 Winsock中的流行问题是,当我发送大约7000个字符的大字符串时,客户端收到许多部分截断为2500-> 3000字符,我需要加入截断的数据包以获得原始消息:
Public FullMessage as string
Private Sub wskConnect_DataArrival(ByVal bytesTotal As Long)
Dim sBuff As String
wskConnect.GetData sBuff, vbString
FullMessage = FullMessage & sBuff
End sub
此链接(VB6 Asynchronous Tcp Client truncates incoming messages)
中的VB6 winsock已确认此问题现在我要将我的代码迁移到.NET Framework。使用.Net UDPClient / TCPClient时,是否需要执行相同的方法? .Net会自动为我解决这个问题,或者邮件仍然是自动截断的,我需要自己加入吗?这个问题是针对UDP协议和TCP协议还是仅针对TCP协议?
答案 0 :(得分:2)
现在我要将我的代码迁移到.NET Framework。使用.Net
UDPClient
/TCPClient
时,是否需要执行相同的方法? .Net会自动为我解决这个问题,或者邮件仍然是自动截断的,我需要自己加入吗? UDP协议和TCP协议是出现此问题还是仅针对TCP协议?
TCP是基于流的协议。在其中没有消息的表示法(如在应用程序级别消息中)。它将所有内容都视为数据字节。
另一方面,UDP确实保证您发送的内容就是您将收到的内容。但是,还有另一个主要区别。 TCP保证它会最好地传递您的消息(或尝试死亡)。 UDP不保证。它只是承诺,如果它能传递你的信息,那就完整了。但是这个信息也会丢失。
因此,如果您使用TCP,您将获得数据,但您必须自己组装消息。如果您使用UDP,您将按照发送方式获取消息。但消息也可能丢失。
使用TCP编写消息要比在UDP之上编写可靠的协议容易得多。答案 1 :(得分:1)
没有消息截断,从来没有。您链接上投票最高的答案甚至是这样说的。这就是套接字的工作方式。他们对消息一无所知。他们知道字节正在进入。处理消息是你的工作。
.NET
套接字在其他语言中像套接字一样工作,因为这是它们的定义方式。但是,如果您希望交换消息并且不关心套接字的低级别工作,则可以使用WCF
之类的机制让.NET Framework
执行繁重的工作,并且只交付完成给你的消息。这意味着您必须控制消息对.NET Framework
的看法。例如,对于WCF
,这可能是SOAP
规范,甚至可能是REST
。