springboot2.0对WebSocket简单试用

一、pom.xml

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

二、配置类-开启WebSocket支持

package com.kf.config;

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

/**
 * 开启WebSocket支持
 */
@Configuration
public class WebSocketConfig {

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

}

三、写服务端

package com.kf.websocket;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.security.Principal;
import java.util.Date;
import java.util.Hashtable;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

//该注解用来指定一个URI,客户端可以通过这个URI来连接到WebSocket。
/**
 类似Servlet的注解mapping。无需在web.xml中配置。
 * configurator = SpringConfigurator.class是为了使该类可以通过Spring注入。
 */
@ServerEndpoint(value = "/websocket/echo")
@Component
public class WebsocketServer {
    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;

    //@Autowired
    //private ContentService contentService ;

    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
    // 若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
    //private static CopyOnWriteArraySet sessionSet = new CopyOnWriteArraySet<>();

    private static Hashtable sessionMap= new Hashtable<>();

    //与客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    /**
     * 连接建立成功调用的方法
     * @param session  可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(Session session){
        this.session = session;
        Principal principal = session.getUserPrincipal();
        if(sessionMap.get(principal.getName()) == null) {
            sessionMap.put(principal.getName(),session);
            //在线数加1
            addOnlineCount();
            System.out.println("有新连接加入!当前在线人数为:" + getOnlineCount());
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(){
        //从map中删除
        Session session = sessionMap.remove(this.session.getUserPrincipal().getName());
        if(session != null) {
            //在线数减1
            subOnlineCount();
            System.out.println("有一连接关闭!当前在线人数为:" + getOnlineCount());
        }
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        //获取用户发送的消息
        System.out.println("用户发送的消息为:"+message);

        String now = DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss");
        //群发消息
        for(String userName: sessionMap.keySet()){
            Session client = sessionMap.get(userName);
            client.getAsyncRemote().sendText(session.getUserPrincipal().getName()+" "+now+"
"+message); } } /** * 发生错误时调用 * @param session * @param error */ @OnError public void onError(Session session, Throwable error){ System.out.println("发生错误"); error.printStackTrace(); } /** * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。 * @param message * @throws IOException */ public void sendMessage(String message) throws IOException{ //保存数据到数据库 // Content content = new Content() ; // content.setContent(message); // SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd HH:mm:dd") ; // content.setCreateDate(sm.format(new Date())); // contentService.insertSelective(content) ; // // this.session.getBasicRemote().sendText(message); //this.session.getAsyncRemote().sendText(message); } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebsocketServer.onlineCount++; } public static synchronized void subOnlineCount() { WebsocketServer.onlineCount--; } }

四、写客户端-参照的是tomcat中内置的websocket例子




Apache Tomcat WebSocket Examples: Echo

五、测试结果

springboot2.0对WebSocket简单试用_第1张图片

你可能感兴趣的:(websocket)