首先,我找不到一个可以准确解释我在这里尝试做什么的标题。
我似乎无法理解的是如何将一条消息从我的 tcp 客户端发送到我的服务器,该消息包含多个部分?例如:
*(msgID = 1 / 用户名:vincent / 密码:123admin) <-- 这是完整的消息。
如您所知,我正在尝试制作登录系统。现在回到这个问题,我的问题是我想可能将每个部分添加到一个数组中,这样当收到数组时,我可以拆分每个部分,而无需检查字符串中的消息 id 等。
我也听说过反射?我想这就像通过网络远程调用一个方法?也许这种方法更适合我的情况,例如 CheckLoginDetails(int ID, string username,string password) 如果详细信息正确,此方法将 true 或 false 返回给客户端?如果您认为这种方法更合适,我很想学习如何做到这一点!我曾经使用 Unity3D 并且网络涉及到这样的事情。
这是我现在的位置:
服务器:
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;
}