我制作了一个简单的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"
答案 0 :(得分:4)
您期望客户端获得完整的消息,而无需编写任何实际代码来实现此目的。 TCP没有应用程序消息的概念。如果您需要这样的东西,您必须准确定义消息是什么,编写代码来发送消息,以及编写代码来接收消息。你至少没有这样做过"消息"包含类型。
只要应用程序消息很短或交换速度很慢,经常损坏的代码就会运气好。但是,一旦受到任何压力,它往往会失败。
在编写使用TCP的代码而不是使用已建立协议的代码之前,仔细记录您要访问我们的协议是一个非常好的主意。您可以查看HTTP,SMTP,IRC等协议的文档。如果你不完全理解TCP上至少有一个现有的协议,那么你真的无法在任何位置尝试开发自己的协议,当然也不能通过它来实现它。而不是指定它。