SpingBoot使用webSocket(二)---给指定人发消息

本案例将session的id模拟为用户id,将session保存到ConcurrentHashMap中,用来获取到指定人的session,并向其发送消息。

一、引入依赖


     org.springframework.boot
     spring-boot-starter-websocket

二、添加ServerEndpointExporter配置bean

@Configuration
public class WebSocketConfig {

    /**
     * 注入一个serverEndPointExporter,该Bean会自动注册使用@serverEndpoint注解声明的websocket endpoint
     * @return
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}

 三、建立连接、收发消息

@ServerEndpoint("/clientToClient")
@Component
public class ClientToClient {

    //用来存储所有连接到服务的客户端信息
    //ConcurrentHashMap使用了synchronized,是线程安全的
    private static ConcurrentHashMap clients = new ConcurrentHashMap();
    //线程安全的
    private static AtomicInteger onlineClient = new AtomicInteger(0);

    @OnOpen
    public void OnOpen(Session session){
        //在线人数加1
        onlineClient.incrementAndGet();
        System.out.println("有新连接["+session.getId()+"]加入,当前在线总人数为:"+onlineClient+"个");
        clients.put(session.getId(),session);
    }

     @OnClose
    public void OnClose(Session session){
        onlineClient.decrementAndGet();
        clients.remove(session.getId());
        System.out.println(session.getId()+"离线...");
    }

    public void sendMessageToClent(ClientMessage message){
        try {
            if(clients.get(message.getUserid())!=null) {
                clients.get(message.getUserid()).getBasicRemote().sendText(message.getMessage());
            }else{
                System.out.println("指定的用户已离线,数据存入数据库,当他上线时再行通知!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

四、前端向后端发送请求,后端处理后再发消息出去

@RestController
@RequestMapping("/chat")
public class SendMessageController {
    @Autowired
    ClientToClient clientToClient;
    @RequestMapping("/sendMsg")
    public void sendMessage(@RequestBody Map map){
        clientToClient.sendMessageToClent(new ClientMessage(map.get("userId").toString(),map.get("message").toString()));
    }

}

五、前端代码




    
    WebSocket聊天室
    


WebSocket聊天室

六、运行效果

SpingBoot使用webSocket(二)---给指定人发消息_第1张图片

 

 

 

 

你可能感兴趣的:(java,SpringBoot,websocket,websocket,java,ajax)