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处于承上启下的作 ...
随机推荐
- Codeforces 1281E
Link 题意:一棵$2n$个点的树让你分配$n$对居民在点上求每对居民之间路径和的最小值和最大值 思路:考虑一条边$(u, v)$ 1.若要使答案尽可能大,那么这条边应该取到尽可能多次.显然,如果$ ...
- windows搭建syncthing中继服务器和发现服务器
软件准备 1.stdiscosrv:发现服务器,下载地址 https://github.com/syncthing/discosrv/releases 2.strelaysrv:中继服务器,下载地址 ...
- RxJava2.x的理解与总结
RxJava2.x的理解与总结 RxJava是一个基于观察者设计模式将链式编程和异步结合在一起的开源库. 链式编程 通过查看GitHub开源项目的简介开源知道,RxJava有几个基类. 他们分别适用于 ...
- Angular 依赖注入的错误 NullInjectorError, No provider for XXX
一.在module的providers区域里,为pipe维护具体的实现类 二.如果不想改动module.ts,可选择直接在组件中注入
- linux下启动rabbitmq,redis,nginx
这只是其中一种启动方法,也是我自己安装好后试过多次可以用的, 1,启动rabbitmq rabbitmqctl start_app rabbitmq程序端口是5672,可视化界面入口端口是15672, ...
- vscode中配置代码片段
首先我们需要把要配置的代码复制一下,如: 然后我们进入https://snippet-generator.app/网站, 进入网站之后就把你复制的代码粘贴到左边的框里面,然后就是代码的类型和命名了 写 ...
- 判断python socket服务端有没有关闭的方法
通过 getattr(socket, '_closed') 的返回值可以判断服务端的运行状态. True 是关闭状态,False 是运行中. import socket ip = 'localhost ...
- 浅谈Atlassian产品搭建的敏捷管理体系(一)概述
准备把敏捷管理的专题在今年完成,主要谈一下Atlassian的实践,先做一下搬运工,讲去年写的两篇弄过来. Dream big, work smart, deliver fast 使用Atlassia ...
- 使用Android studio配置软件签名,并在车机安装
系统级APP,可在Androidmanifest.xml中配置属性,并使用系统级签名. 1. 签名方式 1.1 bulid.gradle(:app)中添加签名信息 1.2 使用Android stud ...
- 51电子-STC89C51开发板:开发包
全部内容,请点击: 51电子-STC89C51开发板:<目录> --------------------------- 正文开始 --------------------------- ...