C# 在 System.Sockets 中接收数据包,并提供示例



在此 qusetion C# 接收 System.Sockets 中的数据包 一个人问道:"在我的客户端服务器应用程序中,我想知道如何制作数据包并通过客户端将其发送到服务器 然后在服务器上,我识别这是哪个数据包并发送正确的重播">

并展示了他实现"数据包识别器"的方式的示例。他得到的答案是他的"构建消息"的方式很糟糕,但没有解释和代码示例后面的答案。

所以,请任何人展示一个好代码的例子,它应该做这样的事情,但正确的方式:

[客户端]

Send(Encoding.ASCII.GetBytes("1001:UN=user123&PW=123456")) //1001 is the ID

[服务器]

private void OnReceivePacket(byte[] arg1, Wrapper Client)
{
try
{
int ID;
string V = Encoding.ASCII.GetString(arg1).Split(':')[0];
int.TryParse(V, out ID);
switch (ID)
{
case 1001://Login Packet
AppendToRichEditControl("LOGIN PACKET RECEIVED");
break;
case 1002:
//OTHER IDs
break;
default:
break;
}
}
catch { }         
}

TCP 确保数据以发送的相同顺序到达 - 但它没有消息的概念。例如,假设您发送以下两个数据片段:

1001:UN=user123&PW=123456
999:UN=user456&PW=1234

在接收端,您将读取1001:UN=user123&PW=123456999:UN=user456&PW=1234,这可能需要一次、两次或更多次读取。这甚至可能以两个数据包的形式到达:

1001:UN=user123&PW=12
3456999:UN=user456&PW=1234

这使得必须正确解析消息。另一篇文章提到在实际数据之前发送数据包的长度,这确实解决了这个问题,因为您可以准确确定一条消息何时结束,下一条消息何时开始。

例如,客户端和服务器可能同意每条消息以包含消息长度的 4 个字节开头。然后,接收器可以简单地:

  • 精确加载 4 个字节
  • 转换为整数,现在您知道消息其余部分的长度
  • 准确读取这么多字节并解析消息

C# 方便地具有BitConverter类,该类允许您将整数转换为 byte[],反之亦然。

最新更新