C# 接收 System.Sockets 中的数据包示例
C# Receiving Packet in System.Sockets with examples
在这个问题中 C# Receiving Packet in System.Sockets
一个人问:
"在我的客户端服务器应用程序中,我想知道如何制作一个数据包并通过客户端将其发送到服务器
然后在服务器上我识别出这是哪个数据包并发送正确的重播"
并举例说明了他实现 'packet recognizer' 的方法。他得到的回答是他的 'structuring the message' 方式不好,但没有解释和代码示例。
那么,任何人都可以展示一个好的代码示例,它应该做这样的事情,但是正确的方法:
[客户]
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
这使得它不得不正确解析消息。另一个 post 提到在实际数据之前发送数据包的长度,这确实解决了问题,因为您可以准确确定一条消息何时结束以及下一条消息何时开始。
例如,客户端和服务器可以同意每条消息以包含消息长度的 4 个字节开始。然后接收者可以简单地:
- 正好加载 4 个字节
- 转换为整数,现在你知道消息剩余部分的长度
- 准确读取那么多字节并解析消息
C# 方便地具有 BitConverter
class 允许您将整数转换为 byte[],反之亦然。
在这个问题中 C# Receiving Packet in System.Sockets 一个人问: "在我的客户端服务器应用程序中,我想知道如何制作一个数据包并通过客户端将其发送到服务器 然后在服务器上我识别出这是哪个数据包并发送正确的重播"
并举例说明了他实现 'packet recognizer' 的方法。他得到的回答是他的 'structuring the message' 方式不好,但没有解释和代码示例。
那么,任何人都可以展示一个好的代码示例,它应该做这样的事情,但是正确的方法:
[客户]
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
这使得它不得不正确解析消息。另一个 post 提到在实际数据之前发送数据包的长度,这确实解决了问题,因为您可以准确确定一条消息何时结束以及下一条消息何时开始。
例如,客户端和服务器可以同意每条消息以包含消息长度的 4 个字节开始。然后接收者可以简单地:
- 正好加载 4 个字节
- 转换为整数,现在你知道消息剩余部分的长度
- 准确读取那么多字节并解析消息
C# 方便地具有 BitConverter
class 允许您将整数转换为 byte[],反之亦然。