WebSocket-发送对象-自定义Encoder

因最近要交前端结课作业,需要连数据库并一起打包太麻烦! 用Vue写前后端分离又稍显复杂,所以准备在我自己的服务器上放一个 WebSocket 再通过 前端 来建立连接获取 数据 就行了

概述:

    Websocket发送对象,通过Encoder 自定义规则(转换为JSON字符串),前端收到后再转换为JSON对象 如果不实现并指定Encoder,直接通过 session.getBasicRemote().sendObject(Object object); 发送对象报异常 javax.websocket.EncodeException: No encoder specified for object of class xxxx

场景:

    可以单独写一个WebSocket来提供服务,统一返回JSON格式; websocket不存在跨域问题,通过请求参数来权限验证控制;

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.68</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.10.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.3</version>
</dependency>

自定义Encoder

package com.live.config;

import com.alibaba.fastjson.JSON;
import com.live.model.User;

import javax.websocket.Encoder;
import javax.websocket.EndpointConfig;

public class WebSocketCustomEncoding implements Encoder.Text<User> {
          
   
    @Override
    public String encode(User user) {
          
   
        assert user!=null;
        return JSON.toJSONString(user);
    }

    @Override
    public void init(EndpointConfig endpointConfig) {
          
   

    }

    @Override
    public void destroy() {
          
   

    }
}

Websocket发送自定义对象

如果不在 @ServerEndpoint 指定endocers,直接通过sendObject(Object o)发送对象,

会报javax.websocket.EncodeException: No encoder specified for object of class xxxx异常

@Service
//encoders指定自定义的Encoder类文件
@ServerEndpoint(value = "/websocketService",encoders = WebSocketCustomEncoding.class)
public class WebSocketService {
          
   

    @OnOpen
    public void open(Session session) throws IOException, EncodeException {
          
   
        System.out.println("连接打开了");
        
        User user = new User();
        user.setId(1);
        user.setPassword("081420");
        user.setName("DeadAndLive");
        //发送自定义对象
        session.getBasicRemote().sendObject(user);
    }

}

前端

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
	<script src="js/jquery-3.4.1.min.js"></script>
	<script>
		let websocket = new WebSocket("ws://localhost:8080/websocketService");
		    $(document).ready(function() {
           
    
		        // 指定websocket路径
		        websocket.onopen = function(event) {
           
    
		           console.log("连接打开");
					// websocket.send("this is client send message!")
					websocket.onmessage = function(e) {
           
    
                        //收到的字符串消息
						console.log(e.data);
                        //将字符串转为JSON对象
						var json = JSON.parse(e.data);
						console.log(json);
					}
		        };
		    });
		window.onbeforeunload = function(){
           
    
		    if (websocket!=null) {
           
    
		        websocket.close();
		    }
		}
	</script>
</html>

打印结果

经验分享 程序员 微信小程序 职场和发展