WebSocket是一种在单个TCP连接上进行全双工通信的协议,进行实时性通讯
<!-- websocket dependency -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
WebSocket通信过程中,客户端和服务端都可以主动向对方发送数据,而不像HTTP协议那样只能由客户端向服务端发送请求,服务端才能响应请求并返回数据。
在开发中遇到的问题:
问题1:用@Resource Service service;自动注入是会报空
问题2:向前端返回对象是报错No encoder specified for object
解决:
解决1:使用Spring.getBean("这里面写serviceImpl")就可以获得service
解决2:创建webSocket编码器,然后在webSocketServer中设置@ServerEndpoint(value = "/webSocket",encoders = ServerEncoder.class)
public class ServerEncoder implements Encoder.Text<Object> {
@Override
public String encode(Object object) throws EncodeException {
return JSONObject.toJSONString(object);
}
@Override
public void init(EndpointConfig endpointConfig) {
}
@Override
public void destroy() {
}
}
流程
前端:new一个webSocket
websocket = new WebSocket("//localhost:8080/webSocket/");
用websocket 调用OnoPen、OnClose、OnMessage和后端交互
后端开发流程:
首先建立一个WebScoket配置处理器
@Configuration
public class WebSocketConfig {
/**
* ServerEndpointExporter 作用是:会自动注册使用@ServerEndpoint注解声明的webSocket endpoint
*
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
再建立一个webSocketServer
@ServerEndpoint("/webSocket")
@Component
public class WebSocketServer {
//用来记录当前在线连接数
private static AtomicInteger onlineNum = new AtomicInteger();
//用来存放每个客户端连接的用户
private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
//建立连接成功调用
@OnOpen
public void onOpen(Session session, @PathParam(value = "username") String userName) {
}
//关闭连接时调用
@OnClose
public void onClose(@PathParam(value = "username") String userName) {
}
//和前端进行交互
@OnMessage
public void onMessage(String message) throws IOException {
}
//错误时调用
@OnError
public void onError(Session session, Throwable throwable) {
}
}
- THE END -
最后修改:2023年4月12日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://jiaheming.cn/2023/03/%e5%af%b9websochet%e7%9a%84%e7%90%86%e8%a7%a3/

共有 0 条评论