懒得修改了 直接附上满足我需求的代码:
java文件 很多方法我没用到
package com.example.demo.websocket;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import com.example.demo.controller.data_controller;
@ServerEndpoint(value = "/websocket")
@Component
public class websocket_demo {
public static String rantime;
public static int ranwendu; public static int ranshidu; public static int ranfengli; public static int ranpm;
public static int ranrenkou;
public static data_controller da=new data_controller();
public static int flag;//判断定时器是否开启的标志位 0为关闭 1开启
//统计在线人数
private static int onlineCount = 0;
//用本地线程保存session
private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();
//保存所有连接上的session
private static Map<String, Session> sessionMap = new ConcurrentHashMap<String, Session>();
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
onlineCount++;
}
public static synchronized void subOnlineCount() {
onlineCount--;
}
//连接
@OnOpen
public static void onOpen(Session session) {
sessions.set(session);
addOnlineCount();
sessionMap.put(session.getId(), session);
flag=1;
System.out.println("【" + session.getId() + "】连接上服务器======当前在线人数【" + getOnlineCount() + "】");
//连接上后给客户端一个消息
sendMsg(session, "连接服务器成功!");
timer(session);//定时器入口
}
//关闭
@OnClose
public static void onClose(Session session) {
subOnlineCount();
try {
if(session != null)
session.close();
} catch (Exception e) {
e.printStackTrace();
}
sessionMap.remove(session.getId());
System.out.println("【" + session.getId() + "】退出了连接======当前在线人数【" + getOnlineCount() + "】");
}
//接收消息 客户端发送过来的消息
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("【" + session.getId() + "】客户端的发送消息======内容【" + message + "】");
String[] split = message.split(",");
String sessionId = split[0];
Session ss = sessionMap.get(sessionId);
if (ss != null) {
String msgTo = "【" + session.getId() + "】发送给【您】的消息:\n【" + split[1] + "】";
String msgMe = "【我】发送消息给【"+ss.getId()+"】:\n"+split[1];
sendMsg(ss, msgTo);
sendMsg(session,msgMe);
}else {
for (Session s : sessionMap.values()) {
if (!s.getId().equals(session.getId())) {
sendMsg(s, "【" + session.getId() + "】发送给【您】的广播消息:\n【" + message + "】");
} else {
sendMsg(session,"【我】发送广播消息给大家\n"+message);
}
}
}
}
//异常
@OnError
public void onError(Session session, Throwable throwable) {
System.out.println("发生异常!");
throwable.printStackTrace();
}
//统一的发送消息方法
public static synchronized void sendMsg(Session session, String msg) {
try {
session.getBasicRemote().sendText(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
//产生随机数 动态更新excel表并重新读取
public static void addrandom(Session session){
Random ra =new Random();
da.wendu=ra.nextInt(50)+0;da.shidu=ra.nextInt(100)+0;da.fengli=ra.nextInt(12)+0;
da.pm=ra.nextInt(1000)+0;da.renkou=ra.nextInt(2000)+0;
da.insertRows();
sendMsg(session,"1");
}
public static void timer(Session session){
new Thread(new Runnable() {
@Override
public void run() {
while (flag==1&&session.isOpen()) {
addrandom(session);
try {
Thread.sleep(15000); //15s
} catch (InterruptedException e) {
// e.printStackTrace();
}
}
// onClose(session); 把这句话放出来就关闭了,用的方法比较笨
System.out.println(flag+"ttt");
}
}).start();
}
}
html里的部分js:
//监听是否开始产生随机数据
var startran=document.getElementById("randata");
startran.addEventListener('click', function(e) {
if (e.target.tagName.toLowerCase() != 'button') return;
if (!startran) return;
var rantext = startran.innerText;
var s1 ;
// if (socket.readyState === WebSocket.OPEN) {
// socket.close();
// }
if (rantext == "开启随机数据")
{
//判断当前浏览器是否支持WebSocket
if('WebSocket' in window){
var websocket = new WebSocket("ws://localhost:8080/websocket"); //对应的是value值
}
else{
alert('Dont support websocket');
}
//连接发生错误的回调方法
websocket.onerror = function(){
alert("error");
};
//连接成功建立的回调方法
websocket.onopen = function(event){
alert("已开启,连接成功");
}
//接收到消息的回调方法
websocket.onmessage = function(event){
this.s1=websocket;
trandata();
}
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function(){
websocket.close();
}
//关闭连接
function closeWebSocket(){
websocket.close();
}
startran.innerText = "关闭随机数据";
}
else{
$.ajax({
url: "/ranstatus",
data:{
},
dataType: "json",//数据格式
type: "post",//请求方式
async: false,//是否异步请求
success: function (data) { //如果请求成功,返回数据。
alert("关闭!");
alert(data.status);
},
error : function(data) {
alert("失败"+data.responseText);
}
})
alert("关闭成功!");
startran.innerText = "开启随机数据";
}
})
部分controller:
@RequestMapping("/ranstatus")
public Map<String,Object> ranstatus(){
Map<String,Object> map = new HashMap<String, Object>();
socket.flag=0;
map.put("status",200);
return map;
}
websocket的config
package com.example.demo.websocket.config;
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();
}
}