*/
@RestController
public class TestController {
/**
* HTTP 流 用于在Http相应中同时推送多个事件
* 该对象可以被用于发送多个对象,
* 通常我们使用到的@ResponseBody只能返回一个对象
* 访问http://127.0.0.1:8886/get6 客户端等待,
* 直到访问http://127.0.0.1:8886/get5中执行emitter.complete()才一次性返回
*/
private ResponseBodyEmitter emitter;
@GetMapping(value = "/get6")
public ResponseBodyEmitter get6() {
ResponseBodyEmitter emitter = new ResponseBodyEmitter();
this.emitter = emitter;
return emitter;
}
@GetMapping(value = "/get5")
public void get5() throws IOException {
if (Objects.nonNull(emitter)) {
/**
* 写入流
*/
emitter.send(" hello world");
emitter.send(" fang qi ming");
/**
* 此方法被调用后,一次性返回
*/
emitter.complete();
}
}
/**
* 使用服务发送事件的Http流
* SseEmitter是ResponseBodyEmitter的一个子类,
* 提供了对服务端事件推送的技术支持,但是InternetExplorer(IE)
* 并不支持这种服务端的事件推送技术,在在线游戏,在线协作,金融应用
* 来说,使用WebSocket STOMP是更好的选择
*/
private SseEmitter sseEmitter;
@GetMapping(value = "/get7")
public SseEmitter get7() {
SseEmitter sseEmitter = new SseEmitter();
this.sseEmitter = sseEmitter;
return sseEmitter;
}
@GetMapping(value = "/get8")
public void get8() throws IOException {
if (Objects.nonNull(sseEmitter)) {
/**
* 写入流并发送,此时客户端收到消息,但仍旧等待消息
*/
sseEmitter.send(" hello world");
/**
* 写入流并发送,此时客户端再次收到消息,但仍旧等待消息
*/
sseEmitter.send(" fang qi ming");
/**
* 客户端接受到服务端消息发送完毕,连接断开
*/
sseEmitter.complete();
}
}
/**
* 有时候,跳过消息转换的阶段,直接把数据写回响应的输出流OutputStream可能更有效
* 比如文件下载 这是可以通过返回一个StreamingResponseBody类型的对象来实现
*
* @return
*/
@GetMapping(value = "/download")
public StreamingResponseBody get9(){
return outputStream -> {
//write...
};
}
}
Spring Http流 (服务端推送技术)
最新推荐文章于 2024-07-31 17:58:52 发布