前言

在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<Users> userList = new List<Users>();
/// <summary>
/// 注册群组 注册用户信息
/// </summary>
/// <param name="groupid">群组ID</param>
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<friendsInformation> fr = new List<friendsInformation>();
fr.Add(friends);
List<groupInformation> group = new List<groupInformation>();
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");
}
/// <summary>
/// 发送消息 自定义判断是发送给全部用户还是某一个组(类似于群聊啦)
/// </summary>
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);
}
/// <summary>
///
/// </summary>
/// <param name="data"></param>
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);
}
}
//使用者离线
/// <summary>
///
/// </summary>
/// <param name="stopCalled"></param>
/// <returns></returns>
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("连接成功");
}
/// <summary>
/// </summary>
/// <returns></returns>
public override Task OnReconnected()
{
return base.OnReconnected();
}
}
}

在浏览器前端有两种连接方式,一种是本地快捷版,一种是远程速度版。

本地快捷版:

<script>
var chathub = $.connection.ChatHub;
$(function () {
$.connection.hub.start().done(function () {
//新建对象
chathub.invoke("Group", "123");
console.log("成功调用起");
})
$('.layim-chat-text img').zoomify();
})
//chat.client.SendAsync = function (name, data) {
// $('#msglist').append($('<li>').text(data));
//}
</script>

远程速度版:

<script>
//var chathub = $.connection.ChatHub;
var connection = $.hubConnection('http://localhost:55921');//如果前后端为同一个端口,可不填参数。如果前后端分离,这里参数为服务器端的URL
var chathub = connection.createHubProxy('ChatHub');
$(function () {
//$.connection.hub.start().done(function () {
// //新建对象
// chathub.invoke("Group", "123");
// console.log("成功调用起");
//})
connection.start().done(function () {
console.log('Now connected, connection ID=' + connection.id);
chathub.invoke("Group", "123");
console.log("成功调用起");
chathub.invoke("sendtest", "123");
}).fail(function (error) {
console.log('Could not connect');
console.log(error);
});
$('.layim-chat-text img').zoomify();
})
//chat.client.SendAsync = function (name, data) {
// $('#msglist').append($('<li>').text(data));
//}
</script>

完整案例:

我是基于layim:

@{
Layout = null;
} <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, height=device-height, user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">
<meta name="format-detection" content="telephone=no">
<title>im 通讯</title>
<link href="~/layim.std/layim-v3.7.7/dist/css/layui.mobile.css" rel="stylesheet" />
</head>
<body>
<script src="~/Scripts/jquery-1.12.1.js"></script>
@*<script src="~/Scripts/jquery.signalR-2.2.3.js"></script>*@
<script src="~/Scripts/jquery.signalR-2.2.3.js"></script>
<script src="~/layim.std/layim-v3.7.7/dist/layui.js"></script>
<link href="~/Scripts/dist/zoomify.min.css" rel="stylesheet" />
<script src="~/Scripts/dist/zoomify.min.js"></script>
<script>
//var chathub = $.connection.ChatHub;
var connection = $.hubConnection('http://localhost:55921');//如果前后端为同一个端口,可不填参数。如果前后端分离,这里参数为服务器端的URL
var chathub = connection.createHubProxy('ChatHub');
$(function () {
//$.connection.hub.start().done(function () {
// //新建对象
// chathub.invoke("Group", "123");
// console.log("成功调用起");
//})
connection.start().done(function () {
console.log('Now connected, connection ID=' + connection.id);
chathub.invoke("Group", "123");
console.log("成功调用起");
chathub.invoke("sendtest", "123");
}).fail(function (error) {
console.log('Could not connect');
console.log(error);
});
$('.layim-chat-text img').zoomify();
})
//chat.client.SendAsync = function (name, data) {
// $('#msglist').append($('<li>').text(data));
//}
</script>
<script>
layui.config({
version: true
}).use('mobile', function(){
var mobile = layui.mobile
,layim = mobile.layim
,layer = mobile.layer;
var autoReplay = [
'您好,我现在有事不在,一会再和您联系。',
'你没发错吧?face[微笑] ',
'洗澡中,请勿打扰,偷窥请购票,个体四十,团体八折,订票电话:一般人我不告诉他!face[哈哈] ',
'你好,我是主人的美女秘书,有什么事就跟我说吧,等他回来我会转告他的。face[心] face[心] face[心] ',
'face[威武] face[威武] face[威武] face[威武] ',
'你要和我说话?你真的要和我说话?你确定自己想说吗?你一定非说不可吗?那你说吧,这是自动回复。',
'face[黑线] 你慢慢说,别急……',
'(*^__^*) face[嘻嘻] ,是贤心吗?'
];
var config = {
//上传图片接口
uploadImage: {
url: '/Ashx/ImageUpDown.ashx' //(返回的数据格式见下文)
, type: 'post' //默认post
}
//上传文件接口
, uploadFile: {
url: '/Ashx/FileUpDown.ashx' //(返回的数据格式见下文)
, type: 'post' //默认post
} //,brief: true , init: {
//我的信息
}
//扩展聊天面板工具栏
//, tool: [{
// alias: 'code'
// , title: '代码'
// , iconUnicode: ''
//}
//] //扩展更多列表
, moreList: [{
alias: 'find'
, title: '发现'
, iconUnicode: '' //图标字体的unicode,可不填
, iconClass: '' //图标字体的class类名
}, {
alias: 'share'
, title: '分享与邀请'
, iconUnicode: '' //图标字体的unicode,可不填
, iconClass: '' //图标字体的class类名
}] //,tabIndex: 1 //用户设定初始打开的Tab项下标
//,isNewFriend: false //是否开启“新的朋友”
, isgroup: true //是否开启“群聊”
, maxLength:1000000
//,chatTitleColor: '#c00' //顶部Bar颜色
//,title: 'LayIM' //应用名,默认:我的IM
}
//创建一个会话
/*
layim.chat({
id: 111111
,name: '许闲心'
,type: 'kefu' //friend、group等字符,如果是group,则创建的是群聊
,avatar: 'http://tp1.sinaimg.cn/1571889140/180/40030060651/1'
});
*/ //监听点击“新的朋友”
layim.on('newFriend', function(){
layim.panel({
title: '新的朋友' //标题
,tpl: '<div style="padding: 10px;">自定义模版,后期接入使用</div>' //模版
,data: { //数据
test: '么么哒'
}
});
}); //查看聊天信息
layim.on('detail', function(data){
//console.log(data); //获取当前会话对象
layim.panel({
title: data.name + ' 聊天信息' //标题
, tpl: '<div style="padding: 10px;">自定义模版,自定义模版,后期接入使用</div>' //模版
,data: { //数据
test: '么么哒'
}
});
}); //监听点击更多列表
layim.on('moreList', function(obj){
switch(obj.alias){
case 'find':
layer.msg('自定义发现动作'); //模拟标记“发现新动态”为已读
layim.showNew('More', false);
layim.showNew('find', false);
break;
case 'share':
layim.panel({
title: '邀请好友' //标题
, tpl: '<div style="padding: 10px;">自定义模版,后期接入使用</div>' //模版
,data: { //数据
test: '么么哒'
}
});
break;
}
}); //监听返回
layim.on('back', function(){
//如果你只是弹出一个会话界面(不显示主面板),那么可通过监听返回,跳转到上一页面,如:history.back();
}); //监听自定义工具栏点击,以添加代码为例
//layim.on('tool(code)', function(insert, send){
// insert('[pre class=layui-code]123[/pre]'); //将内容插入到编辑器
// send();
//}); //监听发送消息
layim.on('sendMessage', function(data){
var To = data.to;
var mine=data.mine;
console.log("侦察数据",data);
if (To.type == "friend") {
chathub.invoke("SendSingle", data);
}
else {
chathub.invoke("Send", data);
}
}); chathub.on("SendAsync" , function (data) {
console.log("接受的数据",data);
layim.getMessage(data);
})
chathub.on("addNewMessageToPage" , function (data) {
config.init = data;
layim.config(config);
})
chathub.on("newUser",function (res) {
//监听添加列表的socket事件,假设你服务端emit的事件名为:addList
//socket.onmessage = function (res) {
//if (res.emit === 'addList') {
console.log("执行了自动添加");
res.type = 'friend';
res.groupid = 1;
var nihao={
type: 'friend' //列表类型,只支持friend和group两种
, avatar: "http://tvax1.sinaimg.cn/crop.0.0.300.300.180/006Iv8Wjly8ff7ghbigcij308c08ct8i.jpg" //好友头像
, username: '冲田杏梨' //好友昵称
, groupid: 1 //所在的分组id
, id: "1233333312121212" //好友id
,sign: "本人冲田杏梨将结束的工作" //好友签名
}
layim.addList(res);
})
chathub.on("RemoveUser",function (res) {
console.log("执行了自动删除");
res.type= "friend";
res.groupid = 1;
console.log(res);
layim.removeList(res);
}) //监听查看更多记录
layim.on('chatlog', function(data, ul){
console.log(data);
layim.panel({
title: '与 '+ data.name +' 的聊天记录' //标题
,tpl: '<div style="padding: 10px;">这里是模版,{{d.data.test}}</div>' //模版
,data: { //数据
test: 'Hello'
}
});
});
layim.on('chatChange', function (data) {
console.log("查询窗口",data);
});
//模拟"更多"有新动态
layim.showNew('More', true);
layim.showNew('find', true);
});
</script>
</body>
</html>

这就是一个完整的案例可以运行的,下一节介绍如何写一个简单的signalr在小程序上运行的前端库。

signalr 应用于微信小程序(一)的更多相关文章

  1. 基于vs2015 SignalR开发的微信小程序使用websocket实现聊天功能

    一)前言 在微信小程上实现聊天功能,大致有三种方式:1)小程序云开发 2)购买第三方IM服务 3)使用自己的服务器自己开发. 这里重要讲使用自己的服务器自己开发,并且是基于vs的开发. 网上提供的解决 ...

  2. .Net Webapi SignalR与微信小程序的交互

    .Net Webapi SignalR与微信小程序的交互 一.SignalR与Webapi 1.SignalR的安装: Signalr与跨域仅需要安装两个开源库 Microsoft.Owin.Cors ...

  3. 微信小程序与AspNetCore SignalR聊天实例

    微信小程序与aspnetcore signalr实例 本文不对小程序与signalr做任何介绍,默认读者已经掌握 aspnetcore Signalr文档 小程序文档 写在之前 SignalR没有提供 ...

  4. Asp.Net Core SignalR 与微信小程序交互笔记

    什么是Asp.Net Core SignalR Asp.Net Core SignalR 是微软开发的一套基于Asp.Net Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给 ...

  5. .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转

    .net mvc 站点自带简易SSL加密传输   因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net ...

  6. SignalR v3.1.3.js [支持微信小程序]

    微信小程序开发中想做实时通知功能.作为一个.net系的程序员,当然首选SignalR,但是默认的js客户端库不支持微信小程序,因为微信小程序的websocket是使用自己的一套相关api来创建和管理的 ...

  7. 微信小程序开发心得

    微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...

  8. 微信小程序体验(2):驴妈妈景区门票即买即游

    驴妈妈因为出色的运营能力,被腾讯选为首批小程序内测单位.驴妈妈的技术开发团队在很短的时间内完成了开发任务,并积极参与到张小龙团队的内测问题反馈.驴妈妈认为,移动互联网时代,微信是巨大的流量入口,也是旅 ...

  9. 微信小程序(微信应用号)组件讲解

    这篇文章主要讲解微信小程序的组件. 首先,讲解新建项目.现在有句话:招聘三天以上微信小程序开发,这个估计只能去挖微信的工程师了.技术新,既然讲解,那我们就从开始建项目讲解. 打开微信web开发者工具, ...

  10. 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新

    微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...

随机推荐

  1. Codeforces Round 928 (Div. 4)(A、B、C、D、E、G)

    目录 A B C D E G A 统计A.B输出 #include <bits/stdc++.h> #define int long long #define rep(i,a,b) for ...

  2. Java开发者的Python快速进修指南:掌握T检验

    前言 T检验是一种用于比较两个独立样本均值差异的统计方法.它通过计算T值和P值来判断样本之间是否存在显著性差异.通常情况下,我们会有两组数据,例如一组实验组和一组对照组. T检验的原假设是两组样本的均 ...

  3. gitee的 私人令牌 就是 Gitee Open API 的 access_token

    gitee的 私人令牌 就是 Gitee Open API 的 access_token

  4. 2.4G无线音频一对多传输解决方案难点解析

    前记     2.4G无线音频传输是一个非主流的应用,做这个的人 相对要比较少.但是,这个领域所涉及到的知识却不少,也就导致了这个领域是好入门,但是东西想做好特别难.这里涉及到声学,无线协议,电子,设 ...

  5. 加密与安全:非对称加密算法 RSA 1024 公钥、秘钥、明文和密文长度

    RSA 1024 是指公钥及私钥分别是 1024bit,也就是 1024/8 = 128Bytes. RSA 原理 RSA 算法密钥长度的选择是安全性和程序性能平衡的结果,密钥长度越长,安全性越好,加 ...

  6. auto推导类型注意

    auto推导类型忽略顶层const,不忽略底层const. 顶层const:指针或引用本身是const不可变,也就是指针指向的内存地址不可变,但指向的内存内容可变. 底层const:指针指向的内存地址 ...

  7. 《TencentNCNN系列》 之工作原理简要解析(以LeNet-5为例)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  8. FreeRTOS教程8 任务通知

    1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...

  9. 介绍几款WPF应用的UI库

    在WPF中对于前端页面的书写,我们有现成的UI类库,不需要我们自己再去写 我这里介绍几款 1.MahApps 官网 https://mahapps.com/ 使用,在App.xaml中添加 <A ...

  10. 记录--基于css3写出的流光登录(注释超详细!)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 完整效果 对基本的表单样式进行设置 这里设置了基本的表单样式,外层用了div进行包裹,重点是运用了两个i元素在后期通过css样式勾画出一条 ...