好久没更新博客了,太懒了,写了一段时间的WebScoket,简单写下我的理解
项目采用springBoot+WebScoket
通过springBoot快速生成一个gradle项目,打开 https://start.spring.io/
把下载的zip包解压并导入到idea中
#新建MyWebScoketConfig implements WebSocketConfigurer
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(getMyWebSocketHandler(),"/chat")
            .addInterceptors(new HttpSessionHandshakeInterceptor(){
        @Override
        public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
                                       WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
            ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
            HttpServletRequest httpServletRequest = servletRequest.getServletRequest();
            String mid = "1";//httpServletRequest.getHeader("mid");
            if(!StringUtils.isEmpty(mid)){
                attributes.put("mid",Long.valueOf(mid));
                return true;
            }
            return false;
        }
    }).setAllowedOrigins("*");
}
@Bean
public MyWebSocketHandler getMyWebSocketHandler(){
    return new MyWebSocketHandler();
}
#MyWebSocketHandler extends TextWebSocketHandler
static final Logger log = LoggerFactory.getLogger(MyWebSocketHandler.class);
static final Map<Long, WebSocketSession> sessions = new ConcurrentHashMap<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    Long mid = getMid(session);
    log.info("connection "+mid);
    sessions.put(mid,session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
    Long mid = getMid(session);
    log.info("close "+mid);
    sessions.remove(mid);
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
    try {
        log.info("handleTransportError",exception);
        Long mid = getMid(session);
        session.close();
        sessions.remove(mid);
        log.info("websocket error: " + mid);
    } catch (Exception e) {
        log.error("handleTransportError error",e);
    }
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    log.info("接收到客户端消息:"+message.getPayload());
    session.sendMessage(new TextMessage("服务器回复消息:"+message.getPayload()));
}
public Long getMid(WebSocketSession session){
    return  (Long) session.getAttributes().getOrDefault("mid", null);
}
#配置文件采用yml方式
server:
  port: 8888
  session-timeout: 30
  tomcat.max-threads: 0
  tomcat.uri-encoding: UTF-8
spring:
  application:
    name: webscoket
logging:
  level:
    root: INFO
    com:
      jackfree:
        webscoket: INFO
#build 配置
buildscript {
    ext {
        springBootVersion = ‘2.0.6.RELEASE’
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath(“org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}”)
    }
}
apply plugin: ‘java’
apply plugin: ‘eclipse’
apply plugin: ‘org.springframework.boot’
apply plugin: ‘io.spring.dependency-management’
group = ‘com.jackfree’
version = ‘0.0.1-SNAPSHOT’
sourceCompatibility = 1.8
repositories {
    mavenCentral()
}
dependencies {
    implementation(‘org.springframework.boot:spring-boot-starter-websocket’)
    testImplementation(‘org.springframework.boot:spring-boot-starter-test’)
}
#到这里简单的WebScoket就编写完成了
#js测试方法
ws = new WebSocket(“ws://localhost:8888/chat”);
// 建立 web socket 连接成功触发事件
ws.onopen = function () {
    // 使用 send() 方法发送数据
    ws.send(“client发送数据”);
};
// 接收服务端数据时触发事件
ws.onmessage = function (evt) { var received_msg = evt.data; alert(received_msg); };
// 断开 web socket 连接成功触发事件 ws.onclose = function () { alert(“连接已关闭…”); };