C#Tcp向服务器发送数据?身份证还是反思?
首先,我找不到一个能准确解释我在这里要做什么的标题 我似乎无法理解的是,如何从tcp客户端向服务器发送一条包含多个部分的消息?例如:C#Tcp向服务器发送数据?身份证还是反思?,c#,reflection,login,tcp,stream,C#,Reflection,Login,Tcp,Stream,首先,我找不到一个能准确解释我在这里要做什么的标题 我似乎无法理解的是,如何从tcp客户端向服务器发送一条包含多个部分的消息?例如: *(MSGID=1 /用户名:文森特/密码:123ADmin)考虑或类似的现有编码。这些实现将使用反射“神奇地将数据映射到类型”。剩下的唯一步骤是根据需要添加框架。基本帧可以是类型、长度、数据、校验和。该类型为[Protocol Buffer]解码提供对正确类型的分派,长度指定完成该帧所需的时间。继续阅读所有内容,然后在阅读“完整框架”时发送:不要使每种类型的阅读
*(MSGID=1 /用户名:文森特/密码:123ADmin)考虑或类似的现有编码。这些实现将使用反射“神奇地将数据映射到类型”。剩下的唯一步骤是根据需要添加框架。基本帧可以是类型、长度、数据、校验和。该类型为[Protocol Buffer]解码提供对正确类型的分派,长度指定完成该帧所需的时间。继续阅读所有内容,然后在阅读“完整框架”时发送:不要使每种类型的阅读逻辑不同!或者,考虑像JSON这样的文本基础传输格式。它不那么紧凑,有点慢,但调试起来也非常容易——也就是说,可以创建简单的客户端来框接任意请求。如果使用接口,则可以在JSON或协议缓冲区之间轻松切换,并且两种编码可以使用相同的DTO
private void HandleClient(TcpClient c)
{
byte[] packetIDData = new byte[2];
c.GetStream().Read(packetIDData, 0, 2);
ushort packetID = BitConverter.ToUInt16(packetIDData,0);
Console.WriteLine("PacketID: " + packetID.ToString());
switch (packetID)
{
case 0:
break;
case (int)RequestTypeEnum.login:
break;
case (int)RequestTypeEnum.logout:
break;
case (int)RequestTypeEnum.ping:
break;
case (int)RequestTypeEnum.update:
byte[] data = new byte[4];
c.GetStream().Read(data, 0, 4);
int length = BitConverter.ToInt32(data, 0);
data = new byte[length];
c.GetStream().Read(data, 0, length);
List<byte> backData = new List<byte>();
backData.AddRange(BitConverter.GetBytes((short)0));
string response = Encoding.ASCII.GetString(data);
backData.AddRange(BitConverter.GetBytes(Encoding.ASCII.GetByteCount(response)));
backData.AddRange(Encoding.ASCII.GetBytes(response));
c.GetStream().Write(backData.ToArray(), 0, backData.ToArray().Length);
break;
}
c.Close();
}
List<byte> updateData = new List<byte>();
updateData.AddRange(BitConverter.GetBytes((short)RequestTypeEnum.login));
updateData.AddRange(StringMethods.MakeString(username));
updateData.AddRange(StringMethods.MakeString(password)); // this needs encryption
client.GetStream().Write(updateData.ToArray(), 0, updateData.Count);
client.GetStream().Read(new byte[2], 0, 2);
string answer = StringMethods.ReadString(client);
switch (answer)
{
case "success":
return true;
case "failed":
return false;
default:
return false;
}