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<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 应用于微信小程序(一)的更多相关文章
- 基于vs2015 SignalR开发的微信小程序使用websocket实现聊天功能
一)前言 在微信小程上实现聊天功能,大致有三种方式:1)小程序云开发 2)购买第三方IM服务 3)使用自己的服务器自己开发. 这里重要讲使用自己的服务器自己开发,并且是基于vs的开发. 网上提供的解决 ...
- .Net Webapi SignalR与微信小程序的交互
.Net Webapi SignalR与微信小程序的交互 一.SignalR与Webapi 1.SignalR的安装: Signalr与跨域仅需要安装两个开源库 Microsoft.Owin.Cors ...
- 微信小程序与AspNetCore SignalR聊天实例
微信小程序与aspnetcore signalr实例 本文不对小程序与signalr做任何介绍,默认读者已经掌握 aspnetcore Signalr文档 小程序文档 写在之前 SignalR没有提供 ...
- Asp.Net Core SignalR 与微信小程序交互笔记
什么是Asp.Net Core SignalR Asp.Net Core SignalR 是微软开发的一套基于Asp.Net Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给 ...
- .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 ...
- SignalR v3.1.3.js [支持微信小程序]
微信小程序开发中想做实时通知功能.作为一个.net系的程序员,当然首选SignalR,但是默认的js客户端库不支持微信小程序,因为微信小程序的websocket是使用自己的一套相关api来创建和管理的 ...
- 微信小程序开发心得
微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...
- 微信小程序体验(2):驴妈妈景区门票即买即游
驴妈妈因为出色的运营能力,被腾讯选为首批小程序内测单位.驴妈妈的技术开发团队在很短的时间内完成了开发任务,并积极参与到张小龙团队的内测问题反馈.驴妈妈认为,移动互联网时代,微信是巨大的流量入口,也是旅 ...
- 微信小程序(微信应用号)组件讲解
这篇文章主要讲解微信小程序的组件. 首先,讲解新建项目.现在有句话:招聘三天以上微信小程序开发,这个估计只能去挖微信的工程师了.技术新,既然讲解,那我们就从开始建项目讲解. 打开微信web开发者工具, ...
- 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新
微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...
随机推荐
- C++ String //string字符串查找和替换 比较 存取 修改单个字符 插入和删除 string字串
1 //string字符串查找和替换 比较 存取 修改单个字符 插入和删除 string字串 2 #include <iostream> 3 #include<string> ...
- Metasploitable3 渗透测试
1.信息手机阶段 信息收集经常使用的软件 功能也比较强大的Nmap Nmap nmap -p- -sS -sV -n -v --reason --open -oX demon.xml 192.168. ...
- C++ Qt开发:QHostInfo主机地址查询组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QHo ...
- XAF Blazor TabbedMdi
开源项目地址:https://gitee.com/easyxaf/blazor-tabbed-mdi 前言 XAF在WinForm中采用了多文档界面(MDI),但在Blazor中却没有,在官网中也有人 ...
- Kubernetes: kube-controller-manager 源码分析
0. 前言 在 Kubernetes 架构中,controller manager 是一个永不休止的控制回路组件,其负责控制集群资源的状态.通过监控 kube-apiserver 的资源状态,比较当前 ...
- autohotkey 设置快捷键 设置光标位置 (ctrl + alt + Numpad0)
autohotkey 设置快捷键 设置光标位置 (ctrl + alt + Numpad0) 原因 3个屏幕,所以鼠标设置的灵敏度非常高,经常就找不到鼠标在哪了. 设置个快捷键,让鼠标每次都初始化一个 ...
- .vscode/extensions.json 是项目用到的 插件 推荐列表,项目应该将此配置 写入用到的插件
.vscode/extensions.json 是项目用到的 插件 推荐列表,项目应该将此配置 写入用到的插件 .vscode/extensions.json { "recommendati ...
- vue 可选链 功能 ?. 替代 res && res.status 可以变成 res?.status
安装 cnpm install --save-dev @babel/plugin-proposal-optional-chaining .babelrc { "presets": ...
- OSI七层协议和TCP/IP五层协议
OSI七层模型概略: OSI 中的层 功能 TCP/IP协议族 应用层 文件传输,电子邮件,文件服务,虚拟终端 HTTP,SMTP,FTP,DNS 表示层 数据压缩,解压,数据加密 无 会话层 解 ...
- Mac M芯片使用PD安装centos7无页面安装
1.选择Centos镜像 点击继续 设置虚拟机名称: 点击创建 : 选择第一个回车开始下载系统,下载完成进入设置页面,首先输入 1 设置语言: 进入语言设置,选择77普通话: 选择c继续,又回到系统配 ...