前言
在2017年基于signalr 和微信小程序 写的脚本。
正文
先安装signalr:
1.安装singalr,用nutget就行,用这个包管理就行。
2.使用singalr
3.根据singalr的调用模式来开发singalr的客户端。
安装singalr,非core,后面我们会介绍core的。
我用的是2.23,那么开始上代码了
引用:
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
集成:
[HubName("ChatHub")]
public class ChatHub : Hub
{
}
HubName是重命名ChatHub,不然的话,signalr 默认使用后类名的小写作为路由。
//已经连接
public override async Task OnConnected()
{
Console.WriteLine("连接成功");
}
//恢复连接
public override Task OnReconnected()
{
return base.OnReconnected();
}
//断开连接
public override Task OnDisconnected(bool stopCalled)
{
}
在程序启动后启动该程序:
在Startup 中如下:
using Microsoft.Owin;
using Owin;
using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Cors;
[assembly: OwinStartupAttribute(typeof(ThinkingSpace.Startup))]
namespace ThinkingSpace
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
//允许跨域
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
}
下面是完整的ChatHub:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Comment;
using Comment.time;
using ThinkingSpace.Models;
using objectJson;
using objectJson.Chat;
//using Comment.everyday;
namespace ThinkingSpace.Chat
{
[HubName("ChatHub")]
public class ChatHub : Hub
{
public static List userList = new List();
///
/// 注册群组 注册用户信息
///
/// 群组ID
public void Group(string groupid)
{
friendsInformation friends = new friendsInformation();
friends.id = 1;
friends.list.AddRange(userList);
mineinformation mine = new mineinformation();
init begin = new init();
var thisuser = userList.Where(u => u.id == Context.ConnectionId).FirstOrDefault();
if (thisuser == null)
{
Users user = new Users();
Random rd = new Random();
mine.id=user.id = rd.Next(100).ToString();
user.username=mine.username= Comment.Math.RandomLength.GenerateRandomNumber(10);
user.conId = Context.ConnectionId;
Clients.AllExcept(Context.ConnectionId).newUser(user);
userList.Add(user);
}
begin.mine = mine;
List fr = new List();
fr.Add(friends);
List group = new List();
group.Add(new groupInformation());
begin.friend = fr;
begin.group = group;
Groups.Add(Context.ConnectionId, groupid);
//通知所有人在线
Clients.Client(Context.ConnectionId).addNewMessageToPage(begin);
}
public void getAlluser() {
}
public void sendtest(string yes)
{
Console.WriteLine("yes");
}
///
/// 发送消息 自定义判断是发送给全部用户还是某一个组(类似于群聊啦)
///
public void Send(mineAndto data)
{
long timestamp = AllOfTime.DataToTimeStamp();
// username: "纸飞机" //消息来源用户名
//,avatar: "http://tp1.sinaimg.cn/1571889140/180/40030060651/1" //消息来源用户头像
//,id: "100000" //聊天窗口来源ID(如果是私聊,则是用户id,如果是群聊,则是群组id)
//,type: "friend" //聊天窗口来源类型,从发送消息传递的to里面获取
//,content: "嗨,你好!本消息系离线消息。" //消息内容
//,mine: false //是否我发送的消息,如果为true,则会显示在右方
//,timestamp: 1467475443306 //服务端动态时间戳
sendTo To = data.To;
sendmine mine = data.mine;
Message ms = new Message();
ms.username = mine.username;
ms.avatar = mine.avatar;
ms.id = To.id;
ms.content = mine.content;
ms.mine = false;
ms.type = To.type;
ms.timestamp = timestamp;
Clients.Group("123",Context.ConnectionId).SendAsync(ms);
}
///
///
///
///
public void SendSingle(mineAndto data)
{
long timestamp = AllOfTime.DataToTimeStamp();
// username: "纸飞机" //消息来源用户名
//,avatar: "http://tp1.sinaimg.cn/1571889140/180/40030060651/1" //消息来源用户头像
//,id: "100000" //聊天窗口来源ID(如果是私聊,则是用户id,如果是群聊,则是群组id)
//,type: "friend" //聊天窗口来源类型,从发送消息传递的to里面获取
//,content: "嗨,你好!本消息系离线消息。" //消息内容
//,mine: false //是否我发送的消息,如果为true,则会显示在右方
//,timestamp: 1467475443306 //服务端动态时间戳
sendTo To = data.To;
sendmine mine = data.mine;
var user=userList.Where(u => u.username == To.username).FirstOrDefault();
if (user != null)
{
Message ms = new Message();
ms.username = mine.username;
ms.avatar = mine.avatar;
ms.id = To.id;
ms.content = mine.content;
ms.mine = false;
ms.type = To.type;
ms.timestamp = timestamp;
Clients.Client(user.conId).SendAsync(ms);
}
else
{
sysmessage sms = new sysmessage();
sms.type = To.type;
sms.id = To.id;
Clients.Client(Context.ConnectionId).SendAsync(sms);
}
}
//使用者离线
///
///
///
///
///
public override Task OnDisconnected(bool stopCalled)
{
var user = userList.Where(u => u.conId == Context.ConnectionId).FirstOrDefault();
if (user != null)
{
userList.Remove(user);
Clients.AllExcept(Context.ConnectionId).RemoveUser(user);
}
return base.OnDisconnected(true);
}
public override async Task OnConnected()
{
Console.WriteLine("连接成功");
}
///
///
///
public override Task OnReconnected()
{
return base.OnReconnected();
}
}
}
在浏览器前端有两种连接方式,一种是本地快捷版,一种是远程速度版。
本地快捷版:
远程速度版:
完整案例:
我是基于layim:
@{
Layout = null;
}
im 通讯
@**@
这就是一个完整的案例可以运行的,下一节介绍如何写一个简单的signalr在小程序上运行的前端库。