如果使用纯字节和字符串消息,则很难派生消息传递协议。您最好创建一个模型-类似
public class NetMessage{
public int MessageType{get;set;}
public dynamic Payload{get;set;}
}
因此,让成像MessageType 1是您的身份验证请求。
就像
{ "MessageType":"1", "PayLoad":{
"Username":"Admin",
"Password":"Password123"
}
}
您可以将其序列化为字符串并发送(通过Newtonsoft.Json),或者,按照我的喜好,使用二进制格式化程序将对象直接转换为字节,然后通过网络发送字节。发送序列化为字节形式的数据,将比通过网络发送字符串信息的效率略高。
使用上述协议,可以使服务器对MessageType执行switch语句,然后以不同方式处理逻辑。
在您的问题中,您要发送已连接客户端的列表吗?
使用类似MessageType 99的名称,并将“有效负载”设置为“客户端列表”。请记住,您无法序列化TcpClient对象并将其发送给远程用户,并且期望该对象像已连接的TcpClient一样起作用。您最多可以发送远程IP和服务器连接到的端口。因此,我建议发送代表该数据的模型。
更新:
目前,您的后台工作人员正在接收数据并将其作为字节->文本进行处理,然后对文本执行直接的业务逻辑。
您应该使用的是托管类型,而不是字符串类型。字符串级别太低,您需要一些中间类型来帮助管理逻辑。
在Visual Studio中使用nuget软件包管理器安装Newtonsoft.Json(或JSON.Net,有时也称为)
使用Newtonsoft,您可以执行以下操作。
给定一个看起来像这样的课程
public class MessageClass
{
public int MessageType{get;set;}
public dynamic Payload{get;set;}
}
您可以执行以下操作
string content = "{\"MessageType\":\"2\",\"Payload\":\"blah\"}";
这是JSON格式的字符串,表示类实例。
在C#代码中,此对象将如下所示:
var message = new MessageClass();
message.MessageType=2;
message.Payload = "blah";
Newtonsoft给您的是将字符串转换为托管C#类型的能力。例如:
还记得我们上面称为“内容”的字符串吗?
var managedObject = JsonConvert.DeserializeObject(content);
Console.WriteLine(managedObject.MessageType); // will; write 2
我的建议是,您的客户端和服务器通过JSON格式的对象进行通信,然后使您能够执行更高级的条件语句和更准确的断言。
Newtonsoft提供2种主要方法供您使用。记录在newtonsoft网站上。newtonsoft.com/json/help/html/Methods_T_Newtonsoft_Json_JsonConvert.htm
将C#对象转换为字符串JsonConvert.SerializeObject(object o); JsonConvert.DeserializeObject(String value);
对于反序列化方法,将您要反序列化的类型放在T所在的位置。
例如:
MessageClass msg = JsonConvert.DeserializeObject(content);