gradle 中添加依赖,引入websocket支持

    compile("org.springframework.boot:spring-boot-starter-websocket:${springBootVersion}")

启用websocket

package cn.xiaojf.today.ws.configuration;

import cn.xiaojf.today.ws.handler.CountWebSocketHandler;
import cn.xiaojf.today.ws.interceptor.HandshakeInterceptor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.server.standard.ServerEndpointExporter; /**
* websocket 配置
* @author xiaojf 2017/3/2 9:50.
*/
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer { @Bean
public ServerEndpointExporter serverEndpointExporter(ApplicationContext context) {
return new ServerEndpointExporter();
} @Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new CountWebSocketHandler(), "/web/count").addInterceptors(new HandshakeInterceptor());
}
}

消息拦截处理

package cn.xiaojf.today.ws.interceptor;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; import java.util.Map; /**
* 消息拦截处理类
* @author xiaojf 2017/3/2 10:36.
*/
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception { //解决The extension [x-webkit-deflate-frame] is not supported问题
if (request.getHeaders().containsKey("Sec-WebSocket-Extensions")) {
request.getHeaders().set("Sec-WebSocket-Extensions", "permessage-deflate");
} System.out.println("Before Handshake");
return super.beforeHandshake(request, response, wsHandler, attributes);
} @Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Exception ex) { System.out.println("After Handshake");
super.afterHandshake(request, response, wsHandler, ex);
}
}

消息处理相应类

package cn.xiaojf.today.ws.handler;

import com.alibaba.druid.support.json.JSONUtils;
import org.apache.commons.collections.map.HashedMap;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler; import java.io.IOException;
import java.util.*; /**
* @author xiaojf 2017/3/2 9:55.
*/
@Component
public class CountWebSocketHandler extends TextWebSocketHandler {
private static long count = 0;
private static Map<String,WebSocketSession> sessionMap = new HashedMap(); @Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
// session.sendMessage(new TextMessage(session.getPrincipal().getName()+",你是第" + (sessionMap.size()) + "位访客")); //p2p Object parse = JSONUtils.parse(message.getPayload()); Collection<WebSocketSession> sessions = sessionMap.values();
for (WebSocketSession ws : sessions) {//广播
ws.sendMessage(message);
} sendMessage(sessionMap.keySet(),"你好");
} @Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessionMap.put(session.getPrincipal().getName(),session);
super.afterConnectionEstablished(session);
} @Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessionMap.remove(session.getPrincipal().getName());
super.afterConnectionClosed(session, status);
} /**
* 发送消息
* @author xiaojf 2017/3/2 11:43
*/
public static void sendMessage(String username,String message) throws IOException {
sendMessage(Arrays.asList(username),Arrays.asList(message));
} /**
* 发送消息
* @author xiaojf 2017/3/2 11:43
*/
public static void sendMessage(Collection<String> acceptorList,String message) throws IOException {
sendMessage(acceptorList,Arrays.asList(message));
} /**
* 发送消息,p2p 群发都支持
* @author xiaojf 2017/3/2 11:43
*/
public static void sendMessage(Collection<String> acceptorList, Collection<String> msgList) throws IOException {
if (acceptorList != null && msgList != null) {
for (String acceptor : acceptorList) {
WebSocketSession session = sessionMap.get(acceptor);
if (session != null) {
for (String msg : msgList) {
session.sendMessage(new TextMessage(msg.getBytes()));
}
}
}
}
}
}

前端js,需要依赖jquery

require(["jquery","formUtil"], function ($) {

    var url = 'ws://'+window.location.host+'/web/count';
var ws = new WebSocket(url);
ws.onopen = function(e)
{
// ws.send('hello');
}; ws.onmessage = function(e) {
alert(e.data);
}; ws.onerror = function(e) {
alert(e);
}; $('body').one('DOMNodeRemoved','#start-help',function (e) {//执行一次以后,自动销毁监听事件
ws.close();
}); $('#help-submit').on('click',function () {
var formData = $('#help-form').serializeJson();
ws.send(JSON.stringify(formData));
}) ; });

springboot 中使用websocket简单例子的更多相关文章

  1. Java中死锁的简单例子及其避免

    死锁:当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞.比如,线程1已经持有了A锁并想要获得B锁的同时,线程2持有B锁并尝试获取A锁,那么这两个线程将永远地等待下去. ...

  2. Websocket简单例子

    websocket是Html5的一个协议,也就是说距离我们2016年就几年时间,其他原理我就不说了,直接讲例子 一.准备材料:1.一个开发工具必须支持javaEE7的,原因是javaEE6或以下不支持 ...

  3. 关于Solr6.0中solrj使用简单例子

    solr6.0的solrJ接口有部分变化,下面列出了简单的使用实例,有需要的朋友可以参考下. package com.ailk.solr6; import java.io.IOException; i ...

  4. Oracle中的存储过程简单例子

    --创建表create table TESTTABLE(  id1  VARCHAR2(12),  name VARCHAR2(32))select t.id1,t.name from TESTTAB ...

  5. ios 使用Starscream实现websocket简单例子

    调试了半天,出现 websocket is disconnected: Invalid HTTP upgrade 的错误 居然是 URL 地址写错了的原因,端口号之后还有一堆地址没有写上. 另外wss ...

  6. Springboot中定时器的简单使用

    在定时器的类上添加注解: @Component@EnableAsync@EnableScheduling 一.普通的定时器: 每天15:10执行的定时器 @Scheduled(cron="0 ...

  7. SpringBoot中使用Websocket进行消息推送

    WebsocketConfig.java @Configuration public class WebSocketConfig { @Bean public ServerEndpointExport ...

  8. Spring-Boot 中 Redis 的简单使用以及简单模糊匹配删除

    https://yulaiz.com/spring-boot-redis-simple/

  9. C# 中的正则简单例子

    public static void Main() { Regex rgx = new Regex(@"[S|s]et-[C|c]ookie: (?<cookieName>\w+ ...

随机推荐

  1. [编织消息框架][JAVA核心技术]动态代理应用8-IRpcReceive实现

    private static Map<Short, Map<Byte, Method>> RECEIVE_METHOD_INFO = new HashMap<>() ...

  2. JavaScript高级内容:原型链、继承、执行上下文、作用域链、闭包

    了解这些问题,我先一步步来看,先从基础说起,然后引出这些概念. 本文只用实例验证结果,并做简要说明,给大家增加些印象,因为单独一项拿出来都需要大篇幅讲解. 1.值类型 & 引用类型 funct ...

  3. maven私服搭建nexus介绍(二)

    1.各个仓库介绍 Hosted:宿主仓库 主要放本公司开发的SNAPSHOTS测试版本,RELEASES正式发行版.合作公司第三方的jar包. Proxy:代理仓库 代理中央仓库:代理Apache下测 ...

  4. Azure IoT 技术研究系列3-设备到云、云到设备通信

    上篇博文中我们将模拟设备注册到Azure IoT Hub中:我们得到了设备的唯一标识. Azure IoT 技术研究系列2-设备注册到Azure IoT Hub 本文中我们继续深入研究,设备到云.云到 ...

  5. linux 线程编程详解

    1.线程的概念: 线程和进程有一定的相似性,通常称为轻量级的进程 同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等.但同一进程中的多个线程都有自身控制流 (它 ...

  6. Mac下安装BeautifulSoup

    1.输入命令su,输入root密码,进入root用户 2.执行命令安装pip: sudo easy_install pip 详细pip介绍:http://blog.csdn.net/olanlanxi ...

  7. 使用vs2015搭建Asp.net Core

    准备工具    1.首先得安装vs2015 并且升级至 update3及以上  2.安装.net core sdk.附上官网下载地址 http://www.microsoft.com/net/down ...

  8. Spring + Mybatis 项目实现动态切换数据源

    项目背景:项目开发中数据库使用了读写分离,所有查询语句走从库,除此之外走主库. 最简单的办法其实就是建两个包,把之前数据源那一套配置copy一份,指向另外的包,但是这样扩展很有限,所有采用下面的办法. ...

  9. NODEJS环境搭建 第一篇 安装和部署NODEJS

    一.下载安装文件 根据自己当前系统环境,下载相对应的安装文件 https://nodejs.org/en/download/ 二.双击安装 都傻瓜式的安装步骤,一步一步安装就好了. 三.检查安装结果 ...

  10. nginx源码分析——configure脚本

    源码:nginx 1.13.0-release   一.前言      在分析源码时,经常可以看到类似 #if (NGX_PCRE) .... #endif 这样的代码段,这样的设计可以在不改动源码的 ...