首页 > 其他分享 >sb+websocket实例

sb+websocket实例

时间:2022-12-16 12:00:57浏览次数:44  
标签:websocket log 实例 getId session import sb message

1、pom.xml
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.9</version>
  </dependency>
</dependencies>

 

 

2、application.properties
server.port=2045

# FreeeMarker 模板引擎配置

#指定HttpServletRequest的属性是否可以覆盖controller的model的同名项
spring.freemarker.allow-request-override=false
#是否开启template caching.
spring.freemarker.cache=false
#是否检查templates路径是否存在.
spring.freemarker.check-template-location=true
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
# 设定所有request的属性在merge到模板的时候,是否要都添加到model中.
spring.freemarker.expose-request-attributes=false
# 设定所有HttpSession的属性在merge到模板的时候,是否要都添加到model中.
spring.freemarker.expose-session-attributes=false
#设定是否以springMacroRequestContext的形式暴露RequestContext给Spring’s macro library使用
spring.freemarker.expose-spring-macro-helpers=false
#spring.freemarker.request-context-attribute=
#spring.freemarker.settings.*=
#设定模板的前缀.
#spring.freemarker.prefix=
#设定模板的后缀.
spring.freemarker.suffix=.ftl
#设定模板的加载路径,多个以逗号分隔,默认: [“classpath:/templates/”]
spring.freemarker.template-loader-path=classpath:/templates/
#spring.freemarker.view-names= # whitelist of view names that can be resolved


3、index.ftl
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8"/>
<title>$Tital$</title>
</head>
<body>
<input id="text" type="text">
<button onclick="send()">Send</button>
<button onclick="closeWebSocket()">Close</button>
<div id="message"></div>
</body>


<script type="text/javascript">
var websocket = null;
//判断当前浏览器是否支持WebSocket, 主要此处要更换为自己的地址
if ('WebSocket' in window) {
//websocket = new WebSocket("ws://localhost:2045/test/one");//自己发给自己
websocket = new WebSocket("ws://localhost:2045/test/oneToMany");//自己发给所有人(不包括自己)
} else {
alert('Not support websocket')
}

//连接发生错误的回调方法
websocket.onerror = function() {
setMessageInnerHTML("error");
};

//连接成功建立的回调方法
websocket.onopen = function(event) {
setMessageInnerHTML("open");
}

//接收到消息的回调方法
websocket.onmessage = function(event) {
setMessageInnerHTML(event.data);
}

//连接关闭的回调方法
websocket.onclose = function() {
setMessageInnerHTML("close");
}

//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function() {
websocket.close();
}

//将消息显示在网页上
function setMessageInnerHTML(innerHTML) {
document.getElementById('message').innerHTML += innerHTML + '<br/>';
}

//关闭连接
function closeWebSocket() {
websocket.close();
}

//发送消息
function send() {
var message = document.getElementById('text').value;
websocket.send(message);
}
</script>
</html>


4、ControlIndex
package com.sc.websocket2045;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("web")
public class ControlIndex {

  @RequestMapping("index")
  public String index(){
    return "index";
  }
}

 

5、WebSocketConfig
package com.sc.websocket2045;

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

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

6、MyMessage
package com.sc.websocket2045;
import lombok.Data;

@Data
public class MyMessage {
  String message;
  String userId;
}

 

 

 

 


7、OneWebSocket
package com.sc.websocket2045;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.atomic.AtomicInteger;

/**
* 前后端交互的类实现消息的接收推送(自己发送给自己)
*
* @ServerEndpoint(value = "/test/one") 前端通过此URI和后端交互,建立连接
*/
@Slf4j
@ServerEndpoint(value = "/test/one")
@Component
public class OneWebSocket {
  /**
  * 记录当前在线连接数
  */
  private static AtomicInteger onlineCount = new AtomicInteger(0);

  /**
  * 连接建立成功调用的方法
  */
  @OnOpen
  public void onOpen(Session session) {
    onlineCount.incrementAndGet(); // 在线数加1
    log.info("有新连接加入:{},当前在线人数为:{}", session.getId(), onlineCount.get());
  }

  /**
  * 连接关闭调用的方法
  */
  @OnClose
  public void onClose(Session session) {
    onlineCount.decrementAndGet(); // 在线数减1
    log.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get());
  }

  /**
  * 收到客户端消息后调用的方法
  *
  * @param message 客户端发送过来的消息
  */
  @OnMessage
  public void onMessage(String message, Session session) {
    log.info("服务端收到客户端[{}]的消息:{}", session.getId(), message);
    this.sendMessage("Hello, " + message, session);
  }

@OnError
public void one rror(Session session, Throwable error) {
log.error("发生错误");
error.printStackTrace();
}

/**
* 服务端发送消息给客户端
*/
private void sendMessage(String message, Session toSession) {
try {
log.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message);
toSession.getBasicRemote().sendText(message);
} catch (Exception e) {
log.error("服务端发送消息给客户端失败:{}", e);
}
}
}

 

 

 

 

8、OneToOneWebSocket
package com.sc.websocket2045;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

/**
* 前后端交互的类实现消息的接收推送(自己发送给另一个人)
*
* @ServerEndpoint(value = "/test/oneToOne") 前端通过此URI 和后端交互,建立连接
*/
@Slf4j
@ServerEndpoint(value = "/test/oneToOne")
@Component
public class OneToOneWebSocket {

/** 记录当前在线连接数 */
private static AtomicInteger onlineCount = new AtomicInteger(0);

/** 存放所有在线的客户端 */
private static Map<String, Session> clients = new ConcurrentHashMap<>();

/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session) {
onlineCount.incrementAndGet(); // 在线数加1
clients.put(session.getId(), session);
log.info("有新连接加入:{},当前在线人数为:{}", session.getId(), onlineCount.get());
}

/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(Session session) {
onlineCount.decrementAndGet(); // 在线数减1
clients.remove(session.getId());
log.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get());
}

/**
* 收到客户端消息后调用的方法
*
* @param message
* 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, Session session) {
log.info("服务端收到客户端[{}]的消息[{}]", session.getId(), message);
try {
MyMessage myMessage = JSON.parseObject(message, MyMessage.class);
if (myMessage != null) {
Session toSession = clients.get(myMessage.getUserId());
if (toSession != null) {
this.sendMessage(myMessage.getMessage(), toSession);
}
}
} catch (Exception e) {
log.error("解析失败:{}", e);
}
}

@OnError
public void one rror(Session session, Throwable error) {
log.error("发生错误");
error.printStackTrace();
}

/**
* 服务端发送消息给客户端
*/
private void sendMessage(String message, Session toSession) {
try {
log.info("服务端给客户端[{}]发送消息[{}]", toSession.getId(), message);
toSession.getBasicRemote().sendText(message);
} catch (Exception e) {
log.error("服务端发送消息给客户端失败:{}", e);
}
}

}

 

 

 

 

9、OneToManyWebSocket
package com.sc.websocket2045;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

/**
*
* 前后端交互的类实现消息的接收推送(自己发送给所有人(不包括自己))
*
* @ServerEndpoint(value = "/test/oneToMany") 前端通过此URI 和后端交互,建立连接
*/
@Slf4j
@ServerEndpoint(value = "/test/oneToMany")
@Component
public class OneToManyWebSocket {

/** 记录当前在线连接数 */
private static AtomicInteger onlineCount = new AtomicInteger(0);

/** 存放所有在线的客户端 */
private static Map<String, Session> clients = new ConcurrentHashMap<>();

/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session) {
onlineCount.incrementAndGet(); // 在线数加1
clients.put(session.getId(), session);
log.info("有新连接加入:{},当前在线人数为:{}", session.getId(), onlineCount.get());
}

/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(Session session) {
onlineCount.decrementAndGet(); // 在线数减1
clients.remove(session.getId());
log.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get());
}

/**
* 收到客户端消息后调用的方法
*
* @param message
* 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, Session session) {
log.info("服务端收到客户端[{}]的消息:{}", session.getId(), message);
this.sendMessage(message, session);
}

@OnError
public void one rror(Session session, Throwable error) {
log.error("发生错误");
error.printStackTrace();
}

/**
* 群发消息
*
* @param message
* 消息内容
*/
private void sendMessage(String message, Session fromSession) {
for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
Session toSession = sessionEntry.getValue();
// 排除掉自己
if (!fromSession.getId().equals(toSession.getId())) {
log.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message);
toSession.getAsyncRemote().sendText(message);
}
}
}}

 

 

 

 

 

 

参考https://www.cnblogs.com/xuwenjin/p/12664650.html

标签:websocket,log,实例,getId,session,import,sb,message
From: https://www.cnblogs.com/smallfa/p/16986965.html

相关文章

  • vivo 在虚拟机linux下插入USB报错 no permission (user in plugdev group)
    https://www.cnblogs.com/lili414/p/16892573.html网上找的解决方法:1. sudovim/etc/udev/rules.d/51-android.rules 创建一个规则文件2.文件中输入如下内容SUBS......
  • VUE的实例的生命周期
    3.Vue实例的生命周期3.1什么是Vue实例的生命周期Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载DOM、渲染→更新→渲染、卸载等一系......
  • unreal engine 4 生成Actor及实例化UObject对象
    UWorld::SpawnActor()方法生成一个我们想要的物体对象。除了这个方法,还有几个更方便的模板方法可以使用。同样的UObject类也有一些模板方法来实例化对象。Onthi......
  • 图形用户界面(GUI)编程可以学习C++ Builder,多图、实例、书籍
    个人觉得SDK纯API方式编写Windows程序已经过时了,效率太低,了解一下原理就可以了,主要是消息机制。图形用户界面(GUI)编程可以学习C++Builder,架构先进(和C#一样拖控件),入门比较......
  • .netCore 使用 Quartz 实例
    一、参考源文链接 1、https://www.likecs.com/show-897836.html2、https://blog.csdn.net/weixin_43614067/article/details/115373776二、Quartz基本使用publiccla......
  • ThingsBoard前端项目的安装与启动
    前言ThingsBoard是目前Github上最流行的开源物联网平台(12.8kStar),可以实现物联网项目的快速开发、管理和扩展,是中小微企业物联网平台的不二之选。本文介绍在Windows环......
  • ThingsBoard前端项目的安装与启动
    前言ThingsBoard是目前Github上最流行的开源物联网平台(12.8kStar),可以实现物联网项目的快速开发、管理和扩展,是中小微企业物联网平台的不二之选。本文介绍在Windows环......
  • 让QT只运行一个实例
         目前使QT运行一个实例有三种方式:1.QSharedMemory     使用共享内存,当第二个进程启动时,判断内存区数据是否建立,如有,则退出;这种方式有弊端,在程序发......
  • ECharts系列 - 柱状图(条形图)实例一
    原文链接:https://blog.csdn.net/zou128865/article/details/42802671/ECharts主页:http://echarts.baidu.com/index.htmlECharts-2.1.8下载地址:http://echarts.baidu.co......
  • JMeter学习-011-JMeter 后置处理器实例之 - 正则表达式提取器(三)多参数获取进阶引用篇
     前两篇文章分表讲述了后置处理器-正则表达式提取器概述及简单实例、多参数获取,相应博文敬请参阅 ​​简单实例​​、​​多参数获取​​。此文主要讲述如何引用正则表......