前台处理方式:
//连接成功后设置自己的信息
Userpush= $.connection.Userpush;
//允许跨域
$.connection.hub.start({ xdomain: true })
//给当前链接设置用户信息
.done(function () {
//参数:用户名、用户id
Userpush.server.getSetUserInfo(用户名,用户id);
});
后台处理方式
1.创建实体类
/// <summary>
/// 用户实体类
/// </summary>
public class User
{
/// <summary>
/// 连接ID
/// </summary>
[Key]
public string ConnectionID { get; set; }
/// <summary>
/// 用户名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 用户id
/// </summary>
public int Id { get; set; }
public User(string name, int id ,string connectionId)
{
this.Name = name;
this.Id = id;
this.ConnectionID = connectionId;
}
}
2.自定义处理方法,主要为GetSetUserInfo方法
//userpush为前台链接推送时候指定的服务器名,每实例化一个都可以新建一个
[HubName("Userpush")]
public class PushHub : Hub
{
//创建用户集合,用于存储所有链接的用户数据
public static List<User> users = new List<User>();
//给指定用户发送消息
public void SendMessage(string userId, string message)
{
Clients.All.hello();
var user = users.Where(s => s.Id== userId).FirstOrDefault();
if (user != null)
{
Clients.Client(user.connectionId).addMessage(message + "" + DateTime.Now, Context.ConnectionId);
//给自己发送,把用户的ID传给自己
Clients.Client(Context.ConnectionId).addMessage(message + "" + DateTime.Now, user.connectionId);
}
else
{
Clients.Client(Context.ConnectionId).showMessage("该用户已离线...");
}
}
// <summary>
///给当前连接绑定用户信息
/// </summary>
[HubMethodName("getSetUserInfo")]
public void GetSetUserInfo(string name, int uid = 0)
{
//查询用户
var user = users.SingleOrDefault(u => u.ConnectionID == Context.ConnectionId);
if (user != null)
{
user.Name = name;
user.Id = uid;
Clients.Client(Context.ConnectionId).showId(Context.ConnectionId);
}
}
/// <summary>
/// 重写连接事件
/// </summary>
/// <returns></returns>
public override Task OnConnected()
{
//查询用户
var user = users.Where(u => u.ConnectionID == Context.ConnectionId).SingleOrDefault();
//判断用户是否存在,否则添加集合
if (user == null)
{
user = new User("", 0, Context.ConnectionId);
users.Add(user);
}
return base.OnConnected();
}
/// <summary>
/// 重写断开连接事件
/// </summary>
/// <returns></returns>
public override Task OnDisconnected(bool stopCalled)
{
var user = users.Where(p => p.ConnectionID == Context.ConnectionId).FirstOrDefault();
//判断用户是否存在,存在则删除
if (user != null)
{
//删除用户
users.Remove(user);
}
return base.OnDisconnected(stopCalled);
}
}