TCP客户端数据接收
TCP Client Data Receiving
目前,只要是 17 个字节,我就会接收数据。但是,我有两种类型的数据,17 字节和 10 字节。当我有两种类型的数据时,如何让它处理?
byte[] message = new byte[17];
int bytesRead;
while (true)
{
bytesRead = 0;
try
{
//blocks until a client sends a message
bytesRead = clientStream.Read(message, 0, 17);
}
catch
{
//a socket error has occured
break;
}
if (bytesRead == 0)
{
//the client has disconnected from the server
break;
}
我看到过类似的问题,但它是用 C 语言写的,我无法理解。请帮助我。
您正在尝试在 stream-based 协议(如 TCP)之上实现消息交换。当消息具有不同长度and/or类型时,有两种常见的方法
- framed messages:每条消息将包含一个 header 已知长度,其中包含消息的长度和类型以及可能的其他元数据(例如时间戳)。读取 header 后,从流中读取适当数量的字节(即有效负载)。
- self-delimiting messages:可以通过目前读取的流内容来检测消息的结尾。 self-delimiting 的一个示例是 HTTP Header,它由双换行符 (2x CRLF) 分隔。
恕我直言,框架消息更容易实现,因为您始终知道要读取多少字节。对于 self-delimiting 消息,您必须使用缓冲和解析来检测消息的结尾。此外,您必须确保 end-of-message-marker 不会出现在消息的有效负载中。
要实现框架消息协议的接收方,您可以使用 System.IO.BinaryReader
class。
- 如果消息超过 255 字节,请使用
ReadByte()
或 ReadUInt*()
方法之一读取消息的长度
- 使用
Read(Byte[], Int32, Int32)
读取负载。 请注意 Read
可能 return 即使读取的字节少于指定的字节数。 您必须使用循环来填充 byte[] message
。
目前,只要是 17 个字节,我就会接收数据。但是,我有两种类型的数据,17 字节和 10 字节。当我有两种类型的数据时,如何让它处理?
byte[] message = new byte[17];
int bytesRead;
while (true)
{
bytesRead = 0;
try
{
//blocks until a client sends a message
bytesRead = clientStream.Read(message, 0, 17);
}
catch
{
//a socket error has occured
break;
}
if (bytesRead == 0)
{
//the client has disconnected from the server
break;
}
我看到过类似的问题,但它是用 C 语言写的,我无法理解。请帮助我。
您正在尝试在 stream-based 协议(如 TCP)之上实现消息交换。当消息具有不同长度and/or类型时,有两种常见的方法
- framed messages:每条消息将包含一个 header 已知长度,其中包含消息的长度和类型以及可能的其他元数据(例如时间戳)。读取 header 后,从流中读取适当数量的字节(即有效负载)。
- self-delimiting messages:可以通过目前读取的流内容来检测消息的结尾。 self-delimiting 的一个示例是 HTTP Header,它由双换行符 (2x CRLF) 分隔。
恕我直言,框架消息更容易实现,因为您始终知道要读取多少字节。对于 self-delimiting 消息,您必须使用缓冲和解析来检测消息的结尾。此外,您必须确保 end-of-message-marker 不会出现在消息的有效负载中。
要实现框架消息协议的接收方,您可以使用 System.IO.BinaryReader
class。
- 如果消息超过 255 字节,请使用
ReadByte()
或ReadUInt*()
方法之一读取消息的长度 - 使用
Read(Byte[], Int32, Int32)
读取负载。 请注意Read
可能 return 即使读取的字节少于指定的字节数。 您必须使用循环来填充byte[] message
。