SignalR說明。
SignalR服務(wù)
重寫了之前的那套ASP.MVC寄宿IIS模式的Websocket通訊亏拉。
客戶端采用winform實(shí)現(xiàn)所有需求.IIS只作為一個(gè)服務(wù)啟動(dòng)赌结。
圖示:
圖上功能均已實(shí)現(xiàn)
核心
事件驅(qū)動(dòng):
登錄(實(shí)質(zhì)觸發(fā)了服務(wù)器的connection)>監(jiān)聽(監(jiān)聽服務(wù)器的消息推送和點(diǎn)對(duì)點(diǎn)發(fā)送)>發(fā)送(廣播选浑,推送給所有已經(jīng)監(jiān)聽的客戶端,點(diǎn)對(duì)點(diǎn):推送給已經(jīng)監(jiān)聽的指定客戶端如客戶端未監(jiān)聽P2P則收不到該條消息。)
實(shí)現(xiàn):
登錄(注冊(cè)廣播點(diǎn)對(duì)點(diǎn)監(jiān)聽嘹吨,觸發(fā)了connection事件服務(wù)器廣播了登錄者ID)
>監(jiān)聽開啟(監(jiān)聽服務(wù)器的消息推送和點(diǎn)對(duì)點(diǎn)發(fā)送妖混,在監(jiān)聽之前的消息收不到)
>緩存(實(shí)質(zhì)是在登錄的時(shí)候就監(jiān)聽并觸發(fā)了獲取消息列表的事件)
思路:
每次新客戶端連接傳遞用戶名服務(wù)器判斷用戶集合中是否存在該用戶名對(duì)象,有則移除并給予一個(gè)新的ConnectID章郁,其他屬性一一賦值枉氮。
每次發(fā)送消息往消息集合中存入一條,到達(dá)一定閥值后存入LOG或者數(shù)據(jù)庫暖庄。
public static List<ClientObj> onlineObj = new List <ClientObj>();
//當(dāng)前在線客戶端集合
public static List<MessageObj>onlineObj = new List<MessageObj>();
連接事件內(nèi):
ClientObj obj = new ClientObj
{
ClientName = Context.QueryString["Name"],//客戶端傳遞過來的參數(shù) 可作為唯一客戶端比對(duì)
ConnectionID = Context.ConnectionId,
ConnectTime = DateTime.Now.ToString(),
ClientType = HttpContext.Current.Request.ContentType == "" ? "Winform" : "Browser",
IPAddress = Context.Request.Environment["server.RemoteIpAddress"].ToString() + Context.Request.Environment["server.RemotePort"].ToString()
};
onlineObj.Add(obj);
客戶端調(diào)用方法:
///注冊(cè)
hub.On<string>("SendUserObjList", (data) =>
{
Invoke(new MethodInvoker(() =>
{
comboBox1.Items.Clear();
dataGridView1.DataSource = null;
List<ClientObj> list = JsonHelper.DeserializeJsonToList<ClientObj>(data);
dataGridView1.DataSource = list;
this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
foreach (var item in list)
{
comboBox1.Items.Add(item.ConnectionID);
}
comboBox1.SelectedIndex = 0;
}));
});
hub.On<string>("SendMessageObjList", (data) =>
{
Invoke(new MethodInvoker(() =>
{
dataGridReive.DataSource = null;
List<MessageObj> list = JsonHelper.DeserializeJsonToList<MessageObj>(data);
dataGridReive.DataSource = list;
this.dataGridReive.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
}));
});
hub.Invoke("GetMessageList", name);
hub.Invoke("GetUser", name);
其他參考代碼注釋聊替。。
————————————————————————————————這應(yīng)該到底了———————————————————————————————————————