signalr 应用于微信小程序(一)

前言

在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在小程序上运行的前端库。

你可能感兴趣的:(signalr 应用于微信小程序(一))