我是靠谱客的博主 超帅眼睛,这篇文章主要介绍WebSocket整合SpringBoot并传输JSON数据进行操作WebSocket整合SpringBoot并传输JSON数据进行操作,现在分享给大家,希望可以做个参考。

WebSocket整合SpringBoot并传输JSON数据进行操作

文章目录

  • WebSocket整合SpringBoot并传输JSON数据进行操作
    • 1、引入依赖
    • 2、创建Configuration配置类注入WebSocket
    • 3、编写WebSocketServer服务类
    • 4、编写entity->json的编码类
    • 5、编写json->entity的解码类
    • 6、可能出现的疑问或错误

1、引入依赖

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <springboot.version>2.2.1.RELEASE</springboot.version> <java.version>1.8</java.version> <swagger.version>2.7.0</swagger.version> <lombok.version>1.18.10</lombok.version> </properties> <dependencies> <!--Springboot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger.version}</version> </dependency> <!--swagger ui--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger.version}</version> </dependency> <!--lombok用来简化实体类:需要安装lombok插件--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <!-- webSocket 集成 springboot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency> </dependencies>

2、创建Configuration配置类注入WebSocket

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfig { /** * 向spring容器中注入这个ServerEndpointExporter对象 * @return */ @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } }

3、编写WebSocketServer服务类

decoders = {OperatorDecoder.class},
encoders = {OperatorEncoder.class}
是进行webSocketMessage和实体类之间映射关系的类

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import com.camera.entity.LoginCamera; import com.camera.entity.Operator; import com.camera.entity.OperatorDecoder; import com.camera.entity.OperatorEncoder; import com.camera.service.CloudService; import com.camera.service.LoginService; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicInteger; @ServerEndpoint(value = "/ptzControl",decoders = {OperatorDecoder.class},encoders = {OperatorEncoder.class}) @Component public class WebSocketServer { //在WebSocket也是这样注入,因 SpringBoot+WebSocket 对每个客户端连接都会创建一个 WebSocketServer(@ServerEndpoint 注解对应的)对象, // Bean 注入操作会被直接略过,因而手动注入一个全局变量 private static final AtomicInteger OnlineCount = new AtomicInteger(0); // concurrent包的线程安全Set,用来存放每个客户端对应的Session对象。 private static CopyOnWriteArraySet<Session> SessionSet = new CopyOnWriteArraySet<Session>(); private static CloudService cloudService = new CloudServiceImpl(); @PostConstruct public void init(){ System.out.println("websocket loading"); } /** * 连接建立成功调用方法 * @param session */ @OnOpen public void onOpen(Session session){ SessionSet.add(session); OnlineCount.incrementAndGet(); // 在线数+1 SendMessage(session,"连接成功"); // 告知客户端连接成功 } /** * 连接关闭调用方法 */ @OnClose public void onClose(Session session){ loginService.logOutAndCleanUp(); SessionSet.remove(session); OnlineCount.decrementAndGet(); } /** * 收到客户端消息后调用的方法 * (这一部分有些丑啊 别骂 别骂) */ @OnMessage public void onMessage(Operator operator, Session session){ SendMessage(session,"接收到消息,消息内容:"+ operator); System.out.println(operator.toString()); if ("moveLeft".equals(operator.getOperate())) cloudService.moveLeft(operator.getNChannelID(), operator.getIparam2()); if ("moveRight".equals(operator.getOperate())) cloudService.moveRight(operator.getNChannelID(), operator.getIparam2()); if ("moveUp".equals(operator.getOperate())) cloudService.moveUp(operator.getNChannelID(), operator.getIparam2()); if ("moveDown".equals(operator.getOperate())) cloudService.moveDown(operator.getNChannelID(), operator.getIparam2()); } /** * 出现错误 */ @OnError public void onError(Session session,Throwable error){ error.printStackTrace(); } /** * 发送消息 实践表明 每次浏览器刷新 session会发生变化 */ public static void SendMessage(Session session,String message){ try { session.getBasicRemote().sendText(String.format("%s (From Server,Session ID=%s)",message,session.getId())); session.getBasicRemote().sendText(message); } catch (IOException e) { e.printStackTrace(); } } /** * 群发消息 */ public static void BroadCastInfo(String message) throws IOException { for (Session session : SessionSet) { if (session.isOpen()) SendMessage(session,message); } } /** * 指定Session发送消息 * @param sessionId * @param message * @throws IOException */ public static void SendMessage(String message,String sessionId) throws IOException { Session session = null; for (Session s : SessionSet) { if(s.getId().equals(sessionId)){ session = s; break; } } if(session!=null) SendMessage(session, message); } }

4、编写entity->json的编码类

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import com.alibaba.fastjson.JSON; import javax.websocket.EncodeException; import javax.websocket.Encoder; import javax.websocket.EndpointConfig; /** * 将JSON编码为entity */ public class OperatorEncoder implements Encoder.Text<Operator> { /** * 发送编码 entity->json * @param object * @return * @throws EncodeException */ @Override public String encode(Operator object) throws EncodeException { return JSON.toJSONString(object); } @Override public void init(EndpointConfig endpointConfig) { } @Override public void destroy() { } }

5、编写json->entity的解码类

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import com.alibaba.fastjson.JSON; import javax.websocket.Decoder; import javax.websocket.EndpointConfig; /** * 解码 json-> entity映射 */ public class OperatorDecoder implements Decoder.Text<Operator> { /** * 转换json->entity * @param move * @return */ @Override public Operator decode(String move) { return JSON.parseObject(move, Operator.class); } /** * 是否进行转换 * @param s * @return */ @Override public boolean willDecode(String s) { return true; } @Override public void init(EndpointConfig endpointConfig) { } @Override public void destroy() { } }

至此,即可使用

6、可能出现的疑问或错误

1、空指针

在WebSocket也是这样注入,因 SpringBoot+WebSocket
对每个客户端连接都会创建一个WebSocketServer对象,Bean
注入操作会被直接略过,因而手动注入一个全局变量

2、主动发送消息时如果需要发送entity类型的数据使用

session.getBasicRemote().sendObject();

3、解码时报错无法解析

willDecode()会在decode()之前执行,查看是否被拦截导致无法转换

最后

以上就是超帅眼睛最近收集整理的关于WebSocket整合SpringBoot并传输JSON数据进行操作WebSocket整合SpringBoot并传输JSON数据进行操作的全部内容,更多相关WebSocket整合SpringBoot并传输JSON数据进行操作WebSocket整合SpringBoot并传输JSON数据进行操作内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部