zhangLiGang

前言:

  最近工作中有一个需求,就是服务端要主动推送消息给客户端,而我们平常的Http请求只能一请求一响应,为此学习了webScokset通讯技术,以下介绍的是java 通过SpringBoot集成webScoket搭建服务端。


1.引入webScoket依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>

2.bean注入

  • ServerEndpointExporter 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

3.创建scoket的Server服务

  创建一个java类 WebScoketServer,以下为我自己写的一个小demo,实现的就是服务端和客户端一个对话(客户端没有搭建用的网页测试),效果我会在下面测试演示。
  其他具体业务逻辑在连接成功或者收到信息后方法里进行处理

@ServerEndpoint("/webSocket/{username}")
@Component
@Slf4j
public class WebScoketServer {

    //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
    private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();

    private static Map<Session, List<String>> map =new HashMap<>();

    //发送消息
    public void sendMessage(Session session, String message) throws IOException {
            synchronized (session) {
                System.out.println("发送数据:" + message);
                session.getBasicRemote().sendText(message);
            }

    }


    //建立连接成功调用
    @OnOpen
    public void onOpen(Session session, @PathParam(value = "username") String userName){
        log.info("连接建立 userName是{}",userName);
        sessionPools.put(userName,session);
        List<String> list =new ArrayList<>();
        list.add("服务端--》哈哈哈建立连接后的回复         ");
        map.put(session,list);
        try {
            sendMessage(session,list.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("连接建立");
    }

    //关闭连接时调用
    @OnClose
    public void onClose(@PathParam(value = "username") String userName){
        log.info("连接关闭 userName是{}",userName);
        System.out.println("连接关闭");
    }

    //收到客户端信息后
    @OnMessage
    public void onMessage(String message,@PathParam(value = "username") String userName) throws IOException{
        log.info("收到消息 message是{}",message);
        try {
            Session session = sessionPools.get(userName);
            List<String> list = map.get(session);
            list.add("客户端--》"+message+"                        ");
            list.add("服务端--》我收到消息:"+message+"                        ");
            map.put(session,list);


            sendMessage(session,list.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("收到消息");
    }

    //错误时调用
    @OnError
    public void onError(Session session, Throwable throwable){
        log.info("连接错误");
        System.out.println("连接错误");
    }
}

4.测试

image

相关文章: