服务器如何区分多个客户端的信息,如何从服务器向客户端发送已连接客户端的列表,以区分常规消息?...
如果使用純字節(jié)和字符串消息,則很難派生消息傳遞協(xié)議。您最好創(chuàng)建一個模型-類似
public class NetMessage{
public int MessageType{get;set;}
public dynamic Payload{get;set;}
}
因此,讓成像MessageType 1是您的身份驗證請求。
就像
{? ? "MessageType":"1",? ? "PayLoad":{
"Username":"Admin",
"Password":"Password123"
}
}
您可以將其序列化為字符串并發(fā)送(通過Newtonsoft.Json),或者,按照我的喜好,使用二進制格式化程序?qū)ο笾苯愚D(zhuǎn)換為字節(jié),然后通過網(wǎng)絡(luò)發(fā)送字節(jié)。發(fā)送序列化為字節(jié)形式的數(shù)據(jù),將比通過網(wǎng)絡(luò)發(fā)送字符串信息的效率略高。
使用上述協(xié)議,可以使服務(wù)器對MessageType執(zhí)行switch語句,然后以不同方式處理邏輯。
在您的問題中,您要發(fā)送已連接客戶端的列表嗎?
使用類似MessageType 99的名稱,并將“有效負(fù)載”設(shè)置為“客戶端列表”。請記住,您無法序列化TcpClient對象并將其發(fā)送給遠程用戶,并且期望該對象像已連接的TcpClient一樣起作用。您最多可以發(fā)送遠程IP和服務(wù)器連接到的端口。因此,我建議發(fā)送代表該數(shù)據(jù)的模型。
更新:
目前,您的后臺工作人員正在接收數(shù)據(jù)并將其作為字節(jié)->文本進行處理,然后對文本執(zhí)行直接的業(yè)務(wù)邏輯。
您應(yīng)該使用的是托管類型,而不是字符串類型。字符串級別太低,您需要一些中間類型來幫助管理邏輯。
在Visual Studio中使用nuget軟件包管理器安裝Newtonsoft.Json(或JSON.Net,有時也稱為)
使用Newtonsoft,您可以執(zhí)行以下操作。
給定一個看起來像這樣的課程
public class MessageClass
{
public int MessageType{get;set;}
public dynamic Payload{get;set;}
}
您可以執(zhí)行以下操作
string content = "{\"MessageType\":\"2\",\"Payload\":\"blah\"}";
這是JSON格式的字符串,表示類實例。
在C#代碼中,此對象將如下所示:
var message = new MessageClass();
message.MessageType=2;
message.Payload = "blah";
Newtonsoft給您的是將字符串轉(zhuǎn)換為托管C#類型的能力。例如:
還記得我們上面稱為“內(nèi)容”的字符串嗎?
var managedObject = JsonConvert.DeserializeObject(content);
Console.WriteLine(managedObject.MessageType);? // will; write 2
我的建議是,您的客戶端和服務(wù)器通過JSON格式的對象進行通信,然后使您能夠執(zhí)行更高級的條件語句和更準(zhǔn)確的斷言。
Newtonsoft提供2種主要方法供您使用。記錄在newtonsoft網(wǎng)站上。newtonsoft.com/json/help/html/Methods_T_Newtonsoft_Json_JsonConvert.htm
將C#對象轉(zhuǎn)換為字符串JsonConvert.SerializeObject(object o); JsonConvert.DeserializeObject(String value);
對于反序列化方法,將您要反序列化的類型放在T所在的位置。
例如:
MessageClass msg = JsonConvert.DeserializeObject(content);
總結(jié)
以上是生活随笔為你收集整理的服务器如何区分多个客户端的信息,如何从服务器向客户端发送已连接客户端的列表,以区分常规消息?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软服务器收费吗,了解 Azure 外部
- 下一篇: 刀片服务器和机架服务器性能,刀片服务器与