Http持久连接(Persisten
Connection)对象:用来解决长时间连接的功能。还可以由客户端主动向服务器要求数据,而服务器端不需要实现太多细节,只需要处理PersistentConnection
内所提供的五个事件:OnConnected, OnReconnected, OnReceived, OnError 和
OnDisconnect 即可。
Hub(集线器)对象:用来解决实时(realtime)信息交换的功能,服务端可以利用URL来注册一个或多个Hub,只要连接到这个Hub,就能与所有的客户端共享发送到服务器上的信息,同时服务端可以调用客户端的脚本。
SignalR将整个信息的交换封装起来,客户端和服务器都是使用JSON来沟通的,在服务端声明的所有Hub信息,都会生成JavaScript输出到客户端,.NET则依赖Proxy来生成代理对象,而Proxy的内部则是将JSON转换成对象。
消息提醒也就是当客户有新消息来时,在客户端的右下角进行d框提醒。要实现这个功能的思路是:
SignalR服务端推送消息到客户端的实现方式为调用客户端的receiveMessage方法来将消息附加到聊天记录内,所以我们可以在客户端的receiveMessage方法中实现d框的逻辑。
找好了方法定义的位置后,自然是去找一个比较好的d框效果JS类库了,这里使用的是iNotify库来实现的。该库的github地址为:,在线测试地址为:
你看QQ或者微信的消息提醒,消息提醒一般是在你不在聊天的当前Tab页面才会d出,我们可以利用Html5 visibilitychange事件来实现,不过我这里是通过失焦点的方式,也就是focus事件。
笔者在近期使用signalr开发一个即时Web聊天应用,为了以后打基础,使用Redis做了一个简单的消息队列。但是当signalr服务器进行集群化的时候,由于使用了两个以及以上的集群, 在初步实验的时候,在JS连接客户端的时候出现了一下的客户端报错。由于在一开始的单例服务中, 使用反向代理是完全可行的。所以,排除掉了服务器端编写的错误。之后,笔者在服务器端查看了有关SignalR服务的日志。在对比日志后发现, 在用户的一次连接中, 两个服务端同时生成一个Connection Id 。并在握手失败后,又移除的Connection Id 。
经过对比后,笔者进一步猜想,可能是由于负载均衡的时候将JS客户端的请求分发到多个signalr实例,所以造成了,虽然客户端的连接到服务端,由于消息包接受的并不完整而导致,握手流程的失败。
而后,笔者将Nginx的服务器中的负载均衡方式由默认配置,改为了 ip_hash ,而后一次通过了握手,连接建立成功。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)