SignalR说明。
SignalR服务
重写了之前的那套ASP.MVC寄宿IIS模式的Websocket通讯。
客户端采用winform实现所有需求.IIS只作为一个服务启动。
图示:
图上功能均已实现
核心
事件驱动:
登录(实质触发了服务器的connection)>监听(监听服务器的消息推送和点对点发送)>发送(广播,推送给所有已经监听的客户端,点对点:推送给已经监听的指定客户端如客户端未监听P2P则收不到该条消息。)
实现:
登录(注册广播点对点监听,触发了connection事件服务器广播了登录者ID)
>监听开启(监听服务器的消息推送和点对点发送,在监听之前的消息收不到)
>缓存(实质是在登录的时候就监听并触发了获取消息列表的事件)
思路:
每次新客户端连接传递用户名服务器判断用户集合中是否存在该用户名对象,有则移除并给予一个新的ConnectID,其他属性一一赋值。
每次发送消息往消息集合中存入一条,到达一定阀值后存入LOG或者数据库。
public static List<ClientObj> onlineObj = new List <ClientObj>();
//当前在线客户端集合
public static List<MessageObj>onlineObj = new List<MessageObj>();
连接事件内:
ClientObj obj = new ClientObj
{
ClientName = Context.QueryString["Name"],//客户端传递过来的参数 可作为唯一客户端比对
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);
客户端调用方法:
///注册
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);
其他参考代码注释。。
————————————————————————————————这应该到底了———————————————————————————————————————