如何使用signalr实现离线聊天

Python016

如何使用signalr实现离线聊天,第1张

SignalR内部有两类对象

Http持久连接(Persisten

Connection)对象:用来解决长时间连接的功能。还可以由客户端主动向服务器要求数据,而服务器端不需要实现太多细节,只需要处理PersistentConnection

内所提供的五个事件:OnConnected, OnReconnected, OnReceived, OnError 和

OnDisconnect 即可。

Hub(集线器)对象:用来解决实时(realtime)信息交换的功能,服务端可以利用URL来注册一个或多个Hub,只要连接到这个Hub,就能与所有的客户端共享发送到服务器上的信息,同时服务端可以调用客户端的脚本。

SignalR将整个信息的交换封装起来,客户端和服务器都是使用JSON来沟通的,在服务端声明的所有Hub信息,都会生成JavaScript输出到客户端,.NET则依赖Proxy来生成代理对象,而Proxy的内部则是将JSON转换成对象。

消息提醒也就是当客户有新消息来时,在客户端的右下角进行弹框提醒。要实现这个功能的思路是:

SignalR服务端推送消息到客户端的实现方式为调用客户端的receiveMessage方法来将消息附加到聊天记录内,所以我们可以在客户端的receiveMessage方法中实现弹框的逻辑。

找好了方法定义的位置后,自然是去找一个比较好的弹框效果JS类库了,这里使用的是iNotify库来实现的。该库的github地址为:,在线测试地址为:

你看QQ或者微信的消息提醒,消息提醒一般是在你不在聊天的当前Tab页面才会弹出,我们可以利用Html5 visibilitychange事件来实现,不过我这里是通过失焦点的方式,也就是focus事件。

为什么SignalR启动类的配置方法调用两次

在web.xml中配置的servlet节点,只有设置了start-up属性才会被容器启动,调用其init方法。如果你不需要容器启动时调用servlet,就把start-up属性注掉。spring配置在listener节点中,在容器启动时会首先初始化spring,其次是filter,最后才是serv

new

使用java的关键字new来创建对象实例。构造函数链中的所有构造函数都会被自动调用。

1

2

Java代码:

CreateInstance instance = new CreateInstance ()

2、clone

构造函数不被自动调用。

1

2

3

4

5

6

7

Java代码:

 public class CreateInstance implements Cloneable{

public CreateInstance getInstance() throws CloneNotSupportedException{

 return (CreateInstance) this.clone()

}

}

如果需要复制上面的那个obj指向的对象实例时,调用new CreateInstance().getInstance()方法就ok了。

JDK中Object# clone()方法的原型是:protected native Object clone() throws  CloneNotSupportedException方法修饰符是protected,而不是public。

这种访问的不可见性使得对Object#clone()方法不可见。所以,必需重写Object的clone方法后才能使用。

1

2

3

4

5

6

7

Java代码:

 public class CreateInstance implements Cloneable{

public CreateInstance clone throws CloneNotSupportedException{

 return (CreateInstance) super.clone()

}

}

值得注意的是 :如果需要使用clone方法,必需实现java.lang.Cloneable接口,否则会抛出java.lang.CloneNotSupportedException。

另外clone方法所做的的操作是直接复制字段的内容,换句话说,这个操作并不管该字段对应的对象实例内容。

像这样字段对字段的拷贝(field to field copy)就成为"浅拷贝",clone方法所做的正是"浅拷贝"。

$.connection.hub.url =另外项目的url

Startup.cs加跨域支持。

app.UseCors(CorsOptions.AllowAll)//跨域支持

app.MapSignalR()

http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client#crossdomain 跨域的详细的说明