SpringBoot整合WebSocket简单实战案例前⾔
这个简单实战案例主要⽬的是让⼤家了解websocket的⼀些简单使⽤.
另外使⽤stomp⽅式的:
《Springboot 整合 WebSocket ,使⽤STOMP协议+Redis 解决负载场景问题(⼆)》
像稍微再深⼊⼀下,可以看这篇,
但是如果你是第⼀次尝试整合websocket,我还是建议你把当前这篇看⼀看,跟着做下实战案例。
正⽂
先看看这次实践的⽬录结构:
两个页⾯分别模拟不同⽤户接⼊websocket。
------接下来,我们开始整合WebSocket------
先是l添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
PS:application.properties不需要添加任何配置 ,我只设置了⼀下服务server.port=8083
接着,创建节点配置类WebSocketStompConfig.java:
import t.annotation.Bean;
import t.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketStompConfig {
//这个bean的注册,⽤于扫描带有@ServerEndpoint的注解成为websocket  ,如果你使⽤外置的tomcat就不需要该配置⽂件
@Bean
public ServerEndpointExporter serverEndpointExporter()
{
return new ServerEndpointExporter();
}
}
然后是WebSocket配置类,WebSocket.java:
(这⾥⾯包含这单独发送消息,发,监听上下线等等⽅法)
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import urrent.ConcurrentHashMap;
import urrent.CopyOnWriteArraySet;
import urrent.atomic.AtomicInteger;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
llect.Maps;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* @Author:JCccc
* @Description:
* @Date: created in 15:56 2019/5/13
*/
@Component
@ServerEndpoint(value = "/connectWebSocket/{userId}")
public class WebSocket {
private Logger logger = Class());
/
**
* 在线⼈数
*/
public static int onlineNumber = 0;
/**
* 以⽤户的姓名为key,WebSocket为对象保存起来
*/
private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>();    /**
* 会话
*/
private Session session;
/
**
* ⽤户名称
*/
private String userId;
/**
* 建⽴连接
*
* @param session
*/
@OnOpen
public void onOpen(@PathParam("userId") String userId, Session session)
websocket和socket
{
onlineNumber++;
logger.info("现在来连接的客户id:"+Id()+"⽤户名:"+userId);
this.userId = userId;
this.session = session;
//  logger.info("有新连接加⼊!当前在线⼈数" + onlineNumber);
//messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息            //先给所有⼈发送通知,说我上线了
Map<String,Object> map1 = wHashMap();
map1.put("messageType",1);
map1.put("userId",userId);
JSONString(map1),userId);
//把⾃⼰的信息加⼊到map当中去
clients.put(userId, this);
logger.info("有连接关闭!当前在线⼈数" + clients.size());
//给⾃⼰发⼀条消息:告诉⾃⼰现在都有谁在线
Map<String,Object> map2 = wHashMap();
map2.put("messageType",3);
//移除掉⾃⼰
Set<String> set = clients.keySet();
map2.put("onlineUsers",set);
JSONString(map2),userId);
}
catch (IOException e){
logger.info(userId+"上线的时候通知所有⼈发⽣了错误");
}
}
@OnError
public void onError(Session session, Throwable error) {
logger.info("服务端发⽣了错误"+Message());
//error.printStackTrace();
}
/**
* 连接关闭
*/
@OnClose
public void onClose()
{
onlineNumber--;
//ve(this);
try {
//messageType 1代表上线 2代表下线 3代表在线名单  4代表普通消息            Map<String,Object> map1 = wHashMap();
map1.put("messageType",2);
map1.put("onlineUsers",clients.keySet());
map1.put("userId",userId);
JSONString(map1),userId);
}
catch (IOException e){
logger.info(userId+"下线的时候通知所有⼈发⽣了错误");
}
//logger.info("有连接关闭!当前在线⼈数" + onlineNumber);
logger.info("有连接关闭!当前在线⼈数" + clients.size());
}
/**
* 收到客户端的消息
*
* @param message 消息
* @param session 会话
*/
@OnMessage
public void onMessage(String message, Session session)
{
logger.info("来⾃客户端消息:" + message+"客户端的id是:"+Id());
System.out.println("------------  :"+message);
JSONObject jsonObject = JSON.parseObject(message);
String textMessage = String("message");
String fromuserId = String("userId");
String touserId = String("to");
//如果不是发给所有,那么就发给某⼀个⼈
//messageType 1代表上线 2代表下线 3代表在线名单  4代表普通消息
Map<String,Object> map1 = wHashMap();
map1.put("messageType",4);
map1.put("textMessage",textMessage);
map1.put("fromuserId",fromuserId);
if(touserId.equals("All")){
map1.put("touserId","所有⼈");
JSONString(map1),fromuserId);
}
else{
map1.put("touserId",touserId);
System.out.println("开始推送消息给"+touserId);
JSONString(map1),touserId);
}
}
catch (Exception e){
e.printStackTrace();
logger.info("发⽣了错误了");
}
}
public void sendMessageTo(String message, String TouserId) throws IOException {
for (WebSocket item : clients.values()) {
//    System.out.println("在线⼈员名单:"+String());
if (item.userId.equals(TouserId) ) {
AsyncRemote().sendText(message);
break;
}
}
}
public void sendMessageAll(String message,String FromuserId) throws IOException {
for (WebSocket item : clients.values()) {
AsyncRemote().sendText(message);
}
}
public static synchronized int getOnlineCount() {
return onlineNumber;
}
}
接下来⽤⼀个HTML5 页⾯ index.html,连接当前的WebSocket节点,接/发消息, index.html:<!DOCTYPE HTML>
<head>
<title>Test My WebSocket</title>
</head>
<body>
TestWebSocket
<input  id="text" type="text" />
<button onclick="send()">SEND MESSAGE</button>
<button onclick="closeWebSocket()">CLOSE</button>
<div id="message"></div>
</body>
<script type="text/javascript">
var websocket = null;
//判断当前浏览器是否⽀持WebSocket
if('WebSocket' in window){
//连接WebSocket节点
websocket = new WebSocket("ws://localhost:8083/connectWebSocket/001");
}
else{
alert('Not support websocket')
}
//连接发⽣错误的回调⽅法
setMessageInnerHTML("error");
};
/
/连接成功建⽴的回调⽅法
setMessageInnerHTML("open");
}
//接收到消息的回调⽅法
setMessageInnerHTML(event.data);
}
//连接关闭的回调⽅法
setMessageInnerHTML("close");
}
//监听窗⼝关闭事件,当窗⼝关闭时,主动去关闭websocket连接,防⽌连接还没断开就关闭窗⼝,server端会抛异常。    beforeunload = function(){
websocket.close();
}
//将消息显⽰在⽹页上
function setMessageInnerHTML(innerHTML){
}
//关闭连接

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。