由于公司项目中使用到websocket, 所以本人利用空余时间学习一番,如果本文中有说错的地方,还望指出!
首先要知道websocket 是什么 ?
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。
websocket的使用场景:
如弹幕,网页聊天系统,实时监控,股票行情推送等
websocket中的一些概念:
- 单播: 点对点 私聊的方式
- 广播: 所有人 游戏公告
- 组播(多播):多人聊天 比如QQ或者微信的群聊
广播技术应用 简单websocket游戏公告系统
常规操作: 第一步 搭建springboot 环境 (此过程省略),并导入相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>webjars-locator-core</artifactId>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>sockjs-client</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>stomp-websocket</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>3.3.7</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.1.1-1</version>
</dependency>
创建相关实体类,用于传递消息
@Data
@NoArgsConstructor
@AllArgsConstructor
//管理员发送的消息
public class InMessage {
private String from;//来源
private String to; //去向
private String content; //内容
private Date date; //时间戳
public InMessage(String content) {
this.content = content;
}
}
@Data
@NoArgsConstructor
//客户端接收的消息
public class OutMessage {
private String from ;
private String content;
private Date date = new Date(); // 直接返回给客户端
public OutMessage(String content,Date date) {
this.content = content;
this.date = date;
}
}
第三步: 编写Controller接口
@Controller
public class GameInfoController {
/**
* MessageMapping 消息映射 :服务器路径 类似与RequestMapping
* SendTo : 客户端的路径
* @param inMessage
* @param date
* @return
*/
@MessageMapping("/v1/chat")
@SendTo("/topic/game_chat")
public OutMessage gameInfo(InMessage inMessage, Date date) {
return new OutMessage(inMessage.getContent(), date);
}
}
第四步:编写配置文件,配置websocket,这一步很重要
@Configuration
@EnableWebSocketMessageBroker //websocket消息代理
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
/**
* 配置消息代理 enableSimpleBroker(...) 参数是数组类型,可以配多个
* setApplicationDestinationPrefixes: 设置前缀
* @param registry
*/
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic","chat");
registry.setApplicationDestinationPrefixes("/app");
}
/**
* 注册端点
* @param registry
*/
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/endpoint-websocket").setAllowedOrigins("*").withSockJS();
}
}