包依赖:

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

配置类 WebSocketConfig.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; import javax.websocket.server.ServerEndpointConfig; @Configuration
public class WebSocketConfig extends ServerEndpointConfig.Configurator { public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myHandler(), "")
.setAllowedOrigins("*");
} public WebSocketHandler myHandler() {
return new AlarmWebSocket();
} @Bean
public ServerEndpointExporter serverEndpointExporter() {
ServerEndpointExporter serverEndpointExporter = new ServerEndpointExporter();
return serverEndpointExporter;
}
}

WebSocketTest.java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.handler.TextWebSocketHandler; import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet; @ServerEndpoint(value = "/websocketOne",configurator = WebSocketConfig.class)
@Component
public class AlarmWebSocket extends TextWebSocketHandler {
public final static Logger logger = LoggerFactory.getLogger(AlarmWebSocket.class); private static int onlineCount = 0; //用来存放每个客户端对应的MyWebSocket对象。
private static CopyOnWriteArraySet<AlarmWebSocket> webSocketMap = new CopyOnWriteArraySet<AlarmWebSocket>();
private Session session; @OnOpen
public void onOpen(Session session) throws IOException {
this.session = session;
webSocketMap.add(this);
addOnlineCount(); this.sendMessage(""); // TODO: 建立连接推送到前端的数据
logger.info("create new webSocket connect!now WebSocket Client number is " + getOnlineCount());
} @OnClose
public void onClose(){ webSocketMap.remove(this);
subOnlineCount();
System.out.println("close one webSocket connect!now WebSocket Client is " + getOnlineCount()); } /**
* 收到客户端消息后调用的方法
* @param message 客户端发送过来的消息
* @param session 可选的参数
*/
@OnMessage
public void onMessage(String message, Session session) throws IOException {
System.out.println(7777); //发送的用户号就是session.hashcode(),可以再加个map继续映射
/* int pos=message.indexOf("#*#*");
String realmessage=message.substring(0,pos);
String realuser=message.substring(pos+4,message.length());*/
System.out.println("来自客户端的消息:" + message);
//
/* WebSocketTest item=webSocketMap.get(realuser);
item.sendMessage(realmessage);*/
sendMessage(message); } /**
* 群发自定义消息
*/
public static void sendInfo(String message) {
System.out.println(66666); //log.info(message); for (AlarmWebSocket item : webSocketMap) {
try {
item.sendMessage(message);
} catch (IOException e) {
//log.error("向客户端发送数据失败!", e);
//continue;
}
}
} /**
* 发生错误时调用
* @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{ this.session.getBasicRemote().sendText(message);
//this.session.getAsyncRemote().sendText(message);
} public static synchronized int getOnlineCount() {
return onlineCount;
} public static synchronized void addOnlineCount() {
AlarmWebSocket.onlineCount++;
} public static synchronized void subOnlineCount() {
AlarmWebSocket.onlineCount--;
} }

html

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>RevealWebSocket</title>

    <script src="js/vue.js"></script>

</head>

<body>

接受数据<br/><br/>

    <div id="ws">

    <input id="text" type="text"/>

    <button onclick="sendMsg()">Send</button>

    <button onclick="closeWS()" :disabled="!opened">Close</button>

    <button onclick="openWS()"  :disabled="opened">Open</button>

    <div v-html="msg"></div>

    </div>

</body>

<script type="text/javascript">

    var websocket = null;

    var wsVue = new Vue({

        el: '#ws',

        data: {

            msg: "welcome to my websocket...<br/>",

            opened: false

        },

        mounted: function(){

            initWs();

        }

    });

    function initWs() {

        //check if your browser supports WebSocket

        if ('WebSocket' in window) {

            //websocket = new WebSocket("ws://124.207.211.211:85/monitor/monitor/socket");
websocket = new WebSocket("ws://localhost:9001/websocketOne");
//websocket = new WebSocket("ws://192.168.1.53:9100/monitor/websocketOne");
} else { alert('Sorry, websocket not supported by your browser.') } //Error callback websocket.onerror = function () { setMessageContent("error!"); wsVue.opened = false; }; //socket opened callback websocket.onopen = function (event) { setMessageContent("websocket opened"); wsVue.opened = true; } //message received callback websocket.onmessage = function (event) { setMessageContent(event.data); } //socket closed callback websocket.onclose = function () { setMessageContent("websocket closed"); wsVue.opened = false; } //when browser window closed, close the socket, to prevent server exception window.onbeforeunload = function () { websocket.close(); } } //update message to vue and then in div function setMessageContent(content) { wsVue.msg = content; } //click to close the websocket function closeWS() { websocket.close(); wsVue.opened = false; } //click to open the websocket function openWS() { initWs(); } //click to send message function sendMsg() { var message = document.getElementById('text').value; websocket.send(message); } </script> </body> </html>

sprint boot websocket 服务端+html5 示例测试的更多相关文章

  1. C# WebSocket 服务端示例代码 + HTML5客户端示例代码

    WebSocket服务端 C#示例代码 using System; using System.Collections.Generic; using System.Linq; using System. ...

  2. 用nodejs快速实现websocket服务端(带SSL证书生成)

    有不少公司将nodejs的socket.io作为websocket的解决方案,很遗憾的是socket.io是对websocket的封装,并不支持html5原始的websocket协议,微信小程序使用的 ...

  3. asp.net网站作为websocket服务端的应用该如何写

    最近被websocket的一个问题困扰了很久,有一个需求是在web网站中搭建websocket服务.客户端通过网页与服务器建立连接,然后服务器根据ip给客户端网页发送信息. 其实,这个需求并不难,只是 ...

  4. Netty 搭建 WebSocket 服务端

    一.编码器.解码器 ... ... @Autowired private HttpRequestHandler httpRequestHandler; @Autowired private TextW ...

  5. nodejs搭建简单的websocket服务端

    创建websocket服务端使用了nodejs-websocket ,首先要安装nodejs-websocket,在项目的目录下: npm install nodejs-websocket 1.搭建w ...

  6. WebSocket服务端

    http://blog.csdn.net/qq_20282263/article/details/54310737 C# 实现WebSocket服务端 原创 2017年01月10日 09:22:50 ...

  7. socket服务端开发之测试使用threading和gevent框架

    socket服务端开发之测试使用threading和gevent框架 话题是测试下多线程和gevent在socket服务端的小包表现能力,测试的方法不太严谨,也没有用event loop + pool ...

  8. Netty搭建WebSocket服务端

    Netty服务端 1.引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=& ...

  9. websocket服务端开发

    基于http请求以拉的方式去做服务器的推送,无论是实时性和有效字节都是差强人意的效果. 公司的im系统在与客户端的交互上实际上借助了websocket来实现服务器与客户端的事实消息推送,今天就来简单了 ...

随机推荐

  1. 原理分析dubbo分布式应用中使用zipkin做链路追踪(转)

    作者:@nele本文为作者原创,转载请注明出处:https://www.cnblogs.com/nele/p/10171794.html 目录 zipkin是什么为什么使用Zipkinzipkin架构 ...

  2. Maltego更新到4.2.6

    Maltego更新到4.2.6   此次更新包含以下两处修改: (1)在服务管理中,允许用户修改OAuth回调协议的端口. (2)修复启动画面溢出错误.

  3. ArrayAdapter和ListView

    利用ArrayAdapter向ListView中添加数据 <?xml version="1.0" encoding="utf-8"?> <Li ...

  4. ISO/IEC 9899:2011 条款5——5.1 概念模型

    5.1 概念模型 5.1.1 翻译环境 5.1.2 执行环境

  5. Win10 x64 pnglib Release

    Win10 x64 pnglib Release >------ 已启动生成: 项目: ZERO_CHECK, 配置: Release x64 ------ > Checking Buil ...

  6. bootstrap 输入框只能数字和字母等其他限制

    --输入中文.数字.英文: <input οnkeyup="value=value.replace(/[^\w\u4E00-\u9FA5]/g, '')"> --输入数 ...

  7. OpenLDAP配置坎坷路

    https://segmentfault.com/a/1190000014683418 轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDA ...

  8. List和List的区别?

    List<T>和List<?>的区别,这问的有点含糊.我想题主是想问类型参数“<T>”和无界通配符“<?>”的区别吧? 讨论“<T>&quo ...

  9. vs2010 出错:error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏(转)

    “LNK1123:转换到 COFF期间失败:文件无效或损坏”的解决方法 一.错误描述 之前写的程序隔段时间使用VS2010再次运行时出现如下错误: LINK fatal error LNK1123转换 ...

  10. Redis常用数据类型及各种数据类型应用和实现方式

    Redis常用数据类型: StringHashListSetSorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的: 首先Red ...