前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring boot 使用websocket

spring boot 使用websocket

作者头像
路过君
发布2020-07-10 11:24:01
8850
发布2020-07-10 11:24:01
举报

依赖

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

配置

代码语言:javascript
复制
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

websocket服务端点

代码语言:javascript
复制
@ServerEndpoint("/ws/test/{username}")
@Component
public class TestEndpoint {

    static final Logger loggger = LoggerFactory.getLogger(TestEndpoint.class);
    private static int onlineCount = 0;
    // 用来存放每个客户端对应的MyWebSocket对象。
    private static ConcurrentHashMap<String, TestEndpoint> webSocketMap = new ConcurrentHashMap<>();
    // 与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;
    // 接收username
    private String username = "";

    // 发送自定义消息
    public static void sendInfo(String message, String username) {
        loggger.info("发送消息到:" + username + ",报文:" + message);
        if (StringUtils.isNotBlank(username) && webSocketMap.containsKey(username)) {
            try {
                webSocketMap.get(username).sendMessage(message);
            } catch (Exception e) {
                loggger.error(e.getMessage(), e);
            }
        } else {
            loggger.error("用户" + username + ",不在线!");
        }
    }

    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        TestEndpoint.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
        TestEndpoint.onlineCount--;
    }

    // 打开连接
    @OnOpen
    public void onOpen(Session session, @PathParam("username") String username) {
        this.session = session;
        this.username = username;
        if (webSocketMap.containsKey(username)) {
            webSocketMap.remove(username);
            webSocketMap.put(username, this);
        } else {
            webSocketMap.put(username, this);
            addOnlineCount();
        }

        loggger.info("用户连接:" + username + ",当前在线人数为:" + getOnlineCount());

        try {
            sendMessage("连接成功");
        } catch (IOException e) {
            loggger.error("用户:" + username + ",网络异常!!!!!!");
        }
    }

    // 关闭连接
    @OnClose
    public void onClose() {
        if (webSocketMap.containsKey(username)) {
            webSocketMap.remove(username);
            subOnlineCount();
        }
        loggger.info("用户退出:" + username + ",当前在线人数为:" + getOnlineCount());
    }

    // 接收消息
    @OnMessage
    public void onMessage(String message, Session session) {
        loggger.info("用户消息:" + username + ",报文:" + message);
    }

    @OnError
    public void onError(Session session, Throwable error) {
        loggger.error("用户错误:" + this.username + ",原因:" + error.getMessage());
        error.printStackTrace();
    }

    // 推送消息
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }
}

客户端

代码语言:javascript
复制
var webSocket = null;
if ('WebSocket' in window) {
    webSocket = new WebSocket('ws://serverhost/ws/test/username');
	// 接收消息
	webSocket.onmessage = function (event) {
	    // event.data;
	}	
	// 关闭连接
	webSocket.onclose = function () {
	}
	webSocket.onerror = function () {    
	}
	// 打开连接
	webSocket.onopen = function () {
		// 发送消息
	    var message = "msgfromclient";
	    webSocket.send(message);
	}
} else {
    alert('Not support websocket')
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 依赖
  • 配置
  • websocket服务端点
  • 客户端
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档