首页 > 编程语言 >SignalR循序渐进(一)简单的聊天程序

SignalR循序渐进(一)简单的聊天程序

时间:2022-12-02 22:46:35浏览次数:58  
标签:Console name url SignalR 聊天 循序渐进 var 服务端 客户端

前阵子把玩了一下SignalR,起初以为只是个real-time的web通讯组件。研究了几天后发现,这玩意简直屌炸天,它完全就是个.net的双向异步通讯框架,用它能做很多不可思议的东西。它基于Owin,可以脱离繁重的System.Web,随意寄宿在IIS,WindowsService,或者一个控制台程序,这样它即能用于b/s的Web应用,也能用在客户端程序或者服务之间的通讯上。对它的介绍网上早已铺天盖地,这而就不再啰嗦了,先来个小例子,一个聊天室程序。

服务端


image

新建一个叫SignalRDemo的工程,注意一定要选择.net Framework4.5及以上。

image

为了让服务端可以自寄宿,安装signalr self host组件。

复制代码
public class ChatHub : Hub
    {
        public void Send(string name, string message)
        {
            Console.WriteLine("ConnectionId:{0}, InvokeMethod:{1}", Context.ConnectionId, "Send");
            Clients.AllExcept(Context.ConnectionId).broadcast(name, message);
        }
    }
复制代码

新建一个ChatHub,创建一个行为叫Send,里面包含了一条控制台调用记录以及让所有除了发起者外的链接Hub的客户端执行客户端方法broadcast。

复制代码
[assembly: OwinStartup(typeof(Host.Startup))]

namespace Host
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}
复制代码

创建一个启动类,将所有的Hub映射。

复制代码
class Program
    {
        static void Main(string[] args)
        {
            var url = "localhost:10086";
            WebApp.Start<Startup>(url);
            Console.WriteLine("Server started,url is {0}", url);
            Console.ReadLine();
        }
    }
复制代码

在Main中写上url和端口,直接用WebApp启动。

image

控制台启动后的输出。

image

用浏览器访问

好了,到这儿服务端代码就全部完成了。接下来创建客户端来调用。客户端暂时不采用website,同样用控制台程序来承载。

客户端


image

创建一个Client的控制台工程,添加SignalR的Client包。

复制代码
var url = "http://localhost:10086/";
            var connection = new HubConnection(url);
            var chatHub = connection.CreateHubProxy("ChatHub");
            connection.Start().ContinueWith(t =>
            {
                if (t.IsFaulted)
                {
                    Console.WriteLine("Connection fault.");
                }
            });
复制代码

在客户端的Main中创建一个HubConnection,创建ChatHub的代理,通过connection.Start启动连接。

var broadcastHandler = chatHub.On<string, string>("broadcast", (name, message) =>
            {
                Console.WriteLine("[{0}]{1}: {2}", DateTime.Now.ToString("HH:mm:ss"), name, message);
            });

定义客户端方法,之前在服务端用Clients.All.broadcast的就是在这边定义的方法。

复制代码
Console.WriteLine("Please input your name:");
            var _name = Console.ReadLine();
            Console.WriteLine("Start chat!");
            while (true)
            {
                var _message = Console.ReadLine();
                chatHub.Invoke("Send", _name, _message).ContinueWith(t => {
                    if (t.IsFaulted)
                    {
                        Console.WriteLine("Connection error!");
                    }
                });
            }
复制代码

最后,写上一个简单的聊天逻辑。当输入名字后,在while的循环内,每输入一行文本,hub就调用服务端的Send方法。同时服务端在执行Send的过程后又会回掉客户端方法。这种通讯方式在以前的C#代码中是很不可思议的,因为同样的客户端方法还可以写在js里!

 

执行效果


image

执行效果如图。

好了,一个基于SignalR的简单的控制台聊天程序就完成了,强大的SignalR让开发者不需要关心Socket的一堆烦人的问题。

 

问题


上面的那个聊天程序看似很方便很强大,但似乎哪儿有一些奇怪?

比如说,服务端调用客户端的方法用的是dynamic的,客户端调用服务端的方法传入的都是string类型的,这样首先就不具备扩展性和进行一些规则约束。

  1. 能不能让客户端声明一个强类型的方法列表呢?这样首先不容易写错。
  2. 同样的,能不能让服务端声明一个强类型的方法列表给客户端调用呢?

下一篇将对上面的2个问题进行思考,并给出解决方案。

     

标签:Console,name,url,SignalR,聊天,循序渐进,var,服务端,客户端
From: https://www.cnblogs.com/webenh/p/16945877.html

相关文章

  • SignalR循序渐进(二)泛型Hub
    接上一篇,文章末尾抛出了2个问题:能不能让客户端声明一个强类型的方法列表呢?这样首先不容易写错。同样的,能不能让服务端声明一个强类型的方法列表给客户端调用呢?如果要......
  • SignalR 循序渐进(四) Hub的生命周期以及IoC
    有阵子没更新这个系列了,最近太忙了。本篇带来的是Hub的生命周期以及IoC。首先,Hub的生命周期,我们用一个Demo来看看:publicclassTestHub:Hub{publicTe......
  • SignalR循序渐进(三)简易的集群通讯组件
    上一篇演示了泛型Hub的实现,微软于6月17日更新了SignalR2.1.0,然后自带了泛型Hub,于是就不需要自己去实现了…(微软你为啥不早一个月自带啊…)。不过没关系,SignalR出彩之处不在......
  • SignalR 循序渐进(五)多个Hub服务器下的消息订阅
    SignalR的通讯方式决定了其高性能,但是即便如此,当消息的并发量上来以后,单节点的Hub服务器依然可能无法承载总的消息吞吐量,那么如何对Hub服务器做水平扩展呢?从微软官方的文......
  • 一些相当不错的php开源 AJAX聊天工具
    一些相当不错的php开源AJAX聊天工具,详细的可以看到​​​http://roshanbh.com.np/2008/09/free-ajax-chat-applications-php.html​​下了几个来看,相当好,改了下就可以用了......
  • 如何去掉browserLinkSignalR功能、VS2013、VS2015
    在使用VS2013、VS2015时,运行网站,浏览器页面都会自动加载如下代码(BrowserLink ):<!--VisualStudioBrowserLink--><scripttype="application/json"id="__browserLink_i......
  • 实现div元素滚动条默认滚动到最底部 - 使用场景 - 聊天信息框
    实现div元素滚动条默认滚动到最底端使用场景:聊天信息框需要了解几个属性和方法:scrollHeight:元素高度-包含滚动条隐藏部分clientHeight:元素可视高度-不包含滚动条隐......
  • 【NLP开发】Python实现聊天机器人
    文章目录​​1、简介​​​​2、ELIZA​​​​2.1ElizaTest(java)​​​​2.2wadetb/eliza(python)​​​​2.3eliza-py(python)​​​​2.4nltk.chat.eliza(python)​​​​2.......
  • netty实现聊天和rpc
    title:netty实现聊天和rpcdate:2022-11-2914:40:13tags:项目地址https://gitee.com/hslxy/learn-netty用netty实现rpc的思路首先自定义协议,不用http的原因就是比......
  • iOS开发之模仿语音聊天时,显示的音量图
    因为项目中有涉及到语音的内容,所以在这里实现一下说话时语音的音量图的展示具体内容查看代码,有注释语音内容的工具类:staticidinstance;#pragmamark-单例+(instancetyp......