Network programming 网络上各种大小的连续消息

Network programming 网络上各种大小的连续消息,network-programming,messaging,network-protocols,Network Programming,Messaging,Network Protocols,我想通过网络发送不同大小的连续消息。发送方将每条消息序列化为字节数组,并通过TCP发送。我将使用一些(受C#影响的)伪代码 CustomClass message = new CustomClass(data: 12345); byte[] messageBytes = Serialize(message); socket.Send(messageBytes); 在接收端,我需要能够区分每条消息,以便对其进行反序列化 byte[] messageBytes = new byte[...]; s

我想通过网络发送不同大小的连续消息。发送方将每条消息序列化为字节数组,并通过TCP发送。我将使用一些(受C#影响的)伪代码

CustomClass message = new CustomClass(data: 12345);
byte[] messageBytes = Serialize(message);
socket.Send(messageBytes);
在接收端,我需要能够区分每条消息,以便对其进行反序列化

byte[] messageBytes = new byte[...];
socket.Receive(messageBytes);
CustomClass message = Deserialize(messageBytes);
到目前为止,我提出了两种不同的方法:

长度前缀 我先发送字节数组的长度,然后发送字节数组本身。这样在接收端我需要读取长度,然后读取那么多字节。这应该可以很好地工作,但是对于过大的消息会有性能损失。在这种情况下,我必须为整个消息分配一个字节数组(或多个字节数组),以便计算其长度

分离器 我发送后跟分隔符的字节数组。这适用于任何大小的消息。问题是-如果消息字节中存在分隔符怎么办

以下是我的问题:
  • 是否有可能改进长度前缀,使其也适用于大型消息
  • 对于这种情况,是否有专用的分隔符符号或字符串?为了让它发挥作用,除了逃跑还有别的选择吗
  • 除了这两种方法之外,还有其他方法吗

  • 当您有一个长度为的头时,为什么会对大消息造成性能损失?我想说,使用分隔符会对性能造成更大的损失,因为您必须检查接收到的每个字节或字。在第一种情况下,您读取一个固定长度的报头(长度为),然后确切地知道要接收多少字节,而不管数据的长度如何。在第二种情况下(使用分隔符),您还必须能够处理部分消息。例如,如果您收到一个包含一条消息结尾和下一条消息开头的数据包。当您有确切的接收长度时,这种情况是次要的。您不必为标头和数据保留单独的缓冲区。只需将长度作为单独的“消息”发送,后跟数据。在接收端,您必须使用两个(或更多!)接收才能读取标题和数据。虽然分隔符有一个“赞成”的观点:您可以在一次接收中接收整个消息,包括分隔符,但您仍然必须将其作为两个发送(除非您要分配缓冲区并将分隔符附加到其中)。就我所见,这两种方法之间的唯一区别是分隔消息的协议(长度与分隔符)。您仍然需要对分隔符进行序列化,因此仍然需要创建字节数组。为了完成此任务,OP需要使用两种以上的方法:例如,FTP使用两种连接:一种用于控制数据流,另一种用于实际传输数据(当然,它有自己的一罐蠕虫)。或者,人们可以创建基本的协议,类似于每个逻辑“消息”前面是一个字节,表示是否需要更多消息,前面是n个字节,表示当前消息的长度。这将允许在不事先知道其总长度的情况下中断连续流。当然,还可以创建一个成熟的协议。。。