最近要开发关于摄像头的一个项目,对拍摄的视频进行实时分析并进行相关操作
首先先来个灵魂三问
一、websocket是什么?
就是一个协议,和http相似,可以说http是单向的,而websocket则是双向的,就是(二、2)中的意思
二、为什么要使用websocket?
1、有时候我们需要频繁地去调用一个API,就会发送一些无关的信息比如像header里面的信息、效率降低了;使用websocket只需要连接一次,除非你客户端或者是服务端挂了,它才结束 2、使用http就只能是客户端像服务端发起调用,如果客户端像要服务端多次响应就只能多发送几次请求了,使用websocket客户端可以像服务端发送消息,服务端也可以像客户端发送消息
三、怎么使用websocket?
1、springboot也是最近使用websocket的形式
@Controller
public class DemoService implements ApplicationListener<SessionDisconnectEvent> {
private static final Logger log = LoggerFactory.getLogger(DemoService.class);
private final SimpMessageSendingOperations messagingTemplate;
public DemoService(SimpMessageSendingOperations messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
/**
* 客户端向/app/topic/activity路径发送消息,然后后端处理后 sendto 向/topic/tracker地址响应消息
*/
//客户端发送的topic; 路径为 : /app/topic/activity
@MessageMapping("/topic/activity")
@SendTo("/topic/tracker")
public ActivityDTO sendActivity(@Payload ActivityDTO activityDTO, StompHeaderAccessor stompHeaderAccessor, Principal principal) {
activityDTO.setUserLogin(principal.getName());
activityDTO.setSessionId(stompHeaderAccessor.getSessionId());
activityDTO.setIpAddress(stompHeaderAccessor.getSessionAttributes().get(IP_ADDRESS).toString());
activityDTO.setTime(Instant.now());
log.debug("Sending user tracking data {}", activityDTO);
return activityDTO;
}
@Override
public void onApplicationEvent(SessionDisconnectEvent event) {
ActivityDTO activityDTO = new ActivityDTO();
activityDTO.setSessionId(event.getSessionId());
activityDTO.setPage("logout");
messagingTemplate.convertAndSend("/topic/tracker", activityDTO);
}
}
其中messagingTemplate.convertAndSend("/topic/tracker", activityDTO);的作用就是向前端的/topic/tracker路径发送消息,前端肯定要监听这个路径
这种方法了解@MessageMapping、@SendTo、 messagingTemplate.convertAndSend("/topic/tracker", activityDTO);这三个就行了
2、未完待续
|