SSE(服务器推送事件)的介绍
所谓SSE(Sever-Sent Event),就是浏览器向服务器发送一个HTTP请求,保持长连接,服务器不断单向地向浏览器推送“信息”(message),这么做是为了节约网络资源,不用一直发请求,建立新连接。
在网页端的例子不少,都是现成的代码复制,但是我这因为想在Okhttp3中使用的,发现使用情况几乎没有,没办法只能坑头自己研究,终于还是研究出使用方法了。
这边先给出调用方的代码,后面有时间再整理服务端代码。
Okhttp3中的使用
首先是依赖包 okhttp3依赖包不可少,还有okhttp-sse包也少不了
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp-sse</artifactId>
<version>4.2.0</version>
</dependency>
实例代码
直接上代码,注释已给
// 定义see接口
Request request = new Request.Builder().url("http://127.0.0.1:8080/sse/2").build();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(1, TimeUnit.DAYS)
.readTimeout(1, TimeUnit.DAYS)//这边需要将超时显示设置长一点,不然刚连上就断开,之前以为调用方式错误被坑了半天
.build();
// 实例化EventSource,注册EventSource监听器
RealEventSource realEventSource = new RealEventSource(request, new EventSourceListener() {
private long callStartNanos;
private void printEvent(String name) {
long nowNanos = System.nanoTime();
if (name.equals("callStart")) {
callStartNanos = nowNanos;
}
long elapsedNanos = nowNanos - callStartNanos;
System.out.printf("=====> %.3f %s%n", elapsedNanos / 1000000000d, name);
}
@Override
public void onOpen(EventSource eventSource, Response response) {
printEvent("onOpen");
}
@Override
public void onEvent(EventSource eventSource, String id, String type, String data) {
printEvent("onEvent");
System.out.println(data);//请求到的数据
}
@Override
public void onClosed(EventSource eventSource) {
printEvent("onClosed");
}
@Override
public void onFailure(EventSource eventSource, Throwable t, Response response) {
printEvent("onFailure");//这边可以监听并重新打开
}
});
realEventSource.connect(okHttpClient);//真正开始请求的一步