从TCP客户端接收不同(已更改)的数据

时间:2015-10-12 16:57:22

标签: c# .net

我制作了一个简单的TCP服务器和客户端,但遇到了Object.GetType()的问题.AssemblyQualifiedName.ToString();

以下是我发生的一些注意事项:

"System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" - first time string A, single line
"System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" - string B - much longer than string A, its multiline
"System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e08989" - second time string A, single line

你可以看到最后一个与其他的不同,无论我发送的是什么字符串都将是相同的。

我的客户发送无效:

public void sendObjectToServer(object obj, Socket server)
        {
            string type = obj.GetType().AssemblyQualifiedName.ToString();
            bool isNull = false;
            byte[] objectInArray;
            if (obj == null)
                isNull = true;
            try
            {
                BinaryFormatter bf = new BinaryFormatter();
                using (MemoryStream ms = new MemoryStream())
                {
                    bf.Serialize(ms, obj);
                    objectInArray = ms.ToArray();
                }
                //if (isNull == false)
                {
                    server.Send(Encoding.UTF8.GetBytes(objectInArray.Length.ToString() + "|" + type));
                    server.Receive(new byte[1024]);
                    server.Send(objectInArray);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

服务器接收无效:

public object receivedData(byte[] data)
        { //[0] - length [1] - type in string
            string[] dataToString = Encoding.UTF8.GetString(data).TrimEnd('\0').Split('|');
            try
            {
                object rtn = "";
                int length = Convert.ToInt32(dataToString[0]);
                byte[] mainObject = new byte[length];
                currentClient.Client.Send(Encoding.UTF8.GetBytes("1"));
                int r = currentClient.Client.Receive(mainObject);
                Type type = Type.GetType(dataToString[1]);
                object mainObj = ByteArrayToObject(mainObject);
                if (type == typeof(String))
                {
                    rtn = mainObj.ToString();
                }
                else if (type == typeof(Int32))
                {
                    return Convert.ToInt32(mainObj);
                }
                else if (type == typeof(Bitmap))
                {
                    return (Bitmap)mainObj;
                }
                else
                {
                    rtn = "none. Type name: " + type.AssemblyQualifiedName.ToString();
                }
                return rtn;
            }
            catch (Exception ex)
            {
                return "error" + ex.ToString();
            }
        }

我已修改Type type = Type.GetType(dataToString[1]);Type type = Type.GetType(dataToString[1].Replace("08989", "089")); 但我想知道它为什么会发生。

我也检查了客户端,客户端发送给我"System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",但我收到"System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e08989"

1 个答案:

答案 0 :(得分:4)

直言不讳地说,你从根本上不了解TCP。应该有一条法律规定,一个人不得写任何使用TCP的应用程序,直到他们能够背诵这句话并解释其中的每个词的含义:" TCP是一种可靠的字节流协议,不保留应用程序消息边界。"

您期望客户端获得完整的消息,而无需编写任何实际代码来实现此目的。 TCP没有应用程序消息的概念。如果您需要这样的东西,您必须准确定义消息是什么,编写代码来发送消息,以及编写代码来接收消息。你至少没有这样做过"消息"包含类型。

只要应用程序消息很短或交换速度很慢,经常损坏的代码就会运气好。但是,一旦受到任何压力,它往往会失败。

在编写使用TCP的代码而不是使用已建立协议的代码之前,仔细记录您要访问我们的协议是一个非常好的主意。您可以查看HTTP,SMTP,IRC等协议的文档。如果你不完全理解TCP上至少有一个现有的协议,那么你真的无法在任何位置尝试开发自己的协议,当然也不能通过它来实现它。而不是指定它。