Hub
public class StreamHub : Hub
{
public ChannelReader<string> ReadLogStream()
{
var channel = Channel.CreateUnbounded<string>();
_ = WriteFileLine(channel.Writer); return channel.Reader;
} private async Task WriteFileLine(ChannelWriter<string> writer)
{
using (var streamReader = new StreamReader(Directory.GetCurrentDirectory() + "/logs/server.log"))
{
string line;
while ((line = streamReader.ReadLine()) != null)
{
await writer.WriteAsync(line);
await Task.Delay(TimeSpan.FromSeconds(2));
} writer.TryComplete();
}
}
}
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace SignalRCharSample.Hubs
{
[Authorize]
public class UserChatHub: Hub
{
public async Task SendMessage(string toUserName, string message)
{
await Clients.User(toUserName).SendAsync("ReceiveMessage", $"{DateTime.Now}--{Context.UserIdentifier}--{message}");
}
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<div>
UserName:<input type="text" id="userInput" />
Message:<input type="text" id="messageInput" />
<input type="button" id="sendButton" value="Send" />
</div>
<ul id="messagesList"></ul>
<script src="http://localhost:57634/lib/jquery/dist/jquery.js"></script>
<script src="http://localhost:57634/lib/signalr.min.js"></script>
<script>
var connection = new signalR.HubConnectionBuilder().withUrl("http://localhost:57634/chatHub").build();
connection.on("ReceiveMessage", function (user, message) {
var msg = user + " says " + message;
var li = document.createElement("li");
li.textContent = msg;
document.getElementById("messagesList").appendChild(li);
}); connection.start().catch(function (err) {
return console.error(err.toString());
}); document.getElementById("sendButton").addEventListener("click", function (event) {
var user = document.getElementById("userInput").value;
var message = document.getElementById("messageInput").value;
connection.invoke("SendMessage", user, message).catch(function (err) {
return console.error(err.toString());
}); event.preventDefault();
}); </script>
</body>
</html>
using Microsoft.AspNetCore.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace SignalRCharSample.Hubs
{
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, DateTime.Now + "--" + message);
} public Task SendMessageToCaller(string message)
{
return Clients.Caller.SendAsync("ReceiveMessage",message);
} public Task SendMessageToGroups(string message)
{
List<string> groups = new List<string>() { "Group1","Group2" };
return Clients.Groups(groups).SendAsync("ReceiveMessage", message);
} public override async Task OnConnectedAsync()
{
await Groups.AddToGroupAsync(Context.ConnectionId, "Group1");
await base.OnConnectedAsync();
} public override async Task OnDisconnectedAsync(Exception exception)
{
await Groups.RemoveFromGroupAsync(Context.ConnectionId, "Group1");
await base.OnDisconnectedAsync(exception);
}
}
}
using Microsoft.AspNetCore.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace SignalRCharSample.Hubs
{
public class CustomUserIdProvider : IUserIdProvider
{
public string GetUserId(HubConnectionContext connection)
{
//return connection.GetHttpContext().Request.Query["userid"]; return connection.User?.FindFirst("UserName")?.Value;
}
}
}
using Microsoft.AspNetCore.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace SignalRCharSample.Hubs
{
public class GroupChatHub: Hub
{
public async Task AddToGroup(string groupName)
{
await Groups.AddToGroupAsync(Context.ConnectionId, groupName); await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
} public async Task RemoveFromGroup(string groupName)
{
await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName); await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}.");
} public Task SendMessageToGroup(string groupName, string message)
{
return Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId}: {message}");
} public override Task OnConnectedAsync()
{
return base.OnConnectedAsync();
}
}
}
Hub的更多相关文章
- 从爬取湖北某高校hub教务系统课表浅谈Java信息抓取的实现 —— import java.*;
原创文章与源码,如果转载请注明来源. 开发环境:Myeclipse,依赖包:apache-httpclient . Jsoup.base64 一.概述 整个系统用Java开发.我们现在要做的是类似于超 ...
- hub,桥,交换机,路由器的区别
1.四种设备在网络中的物理位置 如下图 2.这四种设备的本质 这四种设备,不管怎样,他们都是进行包的转发,只不过转发的行为有些不一样而已 3.逐一介绍 对于hub,一个包过来后,直接将包转发到其他口. ...
- 把代码搬到Git Hub 吧(一)
作为码农的我们,应该都是知道Git Hub,因为git几乎是码农必备的技能啊,所以就不多介绍Git Hub了,直入主题,这篇博客主要讲解Git Hub网页端和客户端的操作. 网页端: 首页第一步自然是 ...
- SignalR入门之Hub
在持久性连接的基础上,SignalR提供了一个更高层次的抽象层:Hub,基于javascript的灵活性和C#的动态特性,Hub是一个至关重要的开发模式,它消弭了客户端和服务端这两个独立的物理环境之间 ...
- asp.net signalR 专题—— 第四篇 模拟RPC模式的Hub操作
在之前的文章中,我们使用的都是持久连接,但是使用持久连接的话,这种模拟socket的形式使用起来还是很不方便的,比如只有一个唯一的 OnReceived方法来处理业务逻辑,如下图: protected ...
- 配置 Docker 加速器(Docker Hub Mirror)
Docker 加速器是什么,我需要使用吗? 使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验.因此 DaoCl ...
- hub config
@echo off title Selenium_Hub cd /d %~dp0 java -jar selenium-server-standalone-2.48.2.jar -role hub - ...
- Windows Azure Service Bus Notification Hub推送通知
前言 随着Windows Azure 在中国的正式落地,相信越来越多的人会体验到Windows Azure带来的强大和便利.在上一篇文章中, 我们介绍了如何利用Windows Azure中的Servi ...
- SignalR入门之从外部访问持久性连接或Hub
有的时候,需要从外部访问持久性连接或Hub服务. 比如,假设A和B两个客户端正在聊天,那么系统或第三方在不参与聊天的情况需要为他们发送系统消息,那么此时,就需要独立来访问持久性连接或Hub服务. 之前 ...
- 项目总结笔记系列 Social Hub KT Session2
KT Session2: 主要是代码的实现(KT is knowledge Transfer) 如图所示,在整个Social Hub项目中,我们的项目Data Feed Service处于承上启下的作 ...
随机推荐
- LinuxK8S集群搭建三(部署dashboard)
系统环境: CentOS 7 64位 准备工作: 通过虚拟机创建三台CentOS服务器,可参照之前的文章192.168.28.128 --master192.168.28.130 --node0119 ...
- DotNetCore2.1使用GitLab通过阿里云自动构建镜像上传阿里云仓库在Docker运行
操作步骤: 1.安装GitLab并添加项目(此处省略安装过程) 2.获取GitLab的Access Tokens 3.创建空的DotNetCore2.1 Api项目 4.项目添加Docker支持,文件 ...
- golang 数组(array)
1. 概念 golang中的数组是具有固定长度及相同数据类型的序列集合 2. 初始化数组 var 数组名 [数组大小]数据类型 package main import "fmt" ...
- 初学银河麒麟linux笔记 第四章 windows中开发的QT程序适配linux的修改——error: ‘QT_WARNING_DISABLE_DEPRECATED’ does not name a type
QT程序本身在windows中进行开发的,移植到linux系统上进行编译后发现了不少问题,需要一一进行修改 1.系统时间修改 首先是系统时间问题 SYSTEMTIME current_date_tim ...
- 01_Node的版本管理
Node的版本管理工具 常见的node的版本管理工具有两种N.NVM 但是他们有一个致命的问题就是不支持Windwos 但是NVM延申了一个nvm-windows的版本,他就可以很好的支持window ...
- supervisord and pm2 进程守护工具
目录 安装 pm2 config pm2是一个带有负载均衡功能的应用进程管理器,类似有Supervisor,forever supervisor 特点: 代码修改,实时重启 安装 npm instal ...
- 【数据库数据恢复】Oracle数据库数据恢复案例
数据库故障:Oracle数据库的ASM磁盘组掉线,ASM实例不能挂载.管理员尝试修复数据库但是没有成功. 数据库数据恢复方案:数据库数据恢复工程师通过分析组成ASM磁盘组的磁盘底层数据,将ASM元数据 ...
- Install Chia Blockchain on Ubuntu
Install Chia Blockchain on Ubuntu Posted on May 4, 2021 Chia is a new kinda of Crypto Currency that ...
- 尝试在virtualbox虚拟机中fedora30中实现文件夹共享
$ sudo dnf install gcc kernel-devel kernel-headers dkms make bzip2 perl $ rpm -qa|grep kernel|sort 确 ...
- Fiddler功能详解
编写完成日期:2021-11-22 一.原理以及注意事项 Fiddler工作原理:Fiddler 本质是一个Web代理服务器,Web 代理(Proxy Server)服务器是网络的中间实体.如上图所示 ...