0

首先,我找不到一个可以准确解释我在这里尝试做什么的标题。

我似乎无法理解的是如何将一条消息从我的 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;   
        }
4

0 回答 0