淡语

导航

若依springboot集成websocket

①pom.xml添加

<!--websocket -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

 

②添加WebSocketConfig类,开启WebSocket支持

package com.danyu.framework.config;

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

/**
 * 开启WebSocket支持
 * Created by danyu on 2019/12/26.
 */
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

③添加DemoWebsocketController控制器类
package com.demo.project.websocket.controller;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.demo.project.websocket.server.WebSocketServer;
import com.ruoyi.framework.web.controller.BaseController;

/**
 * 
 * 
 * @author danyu
 * @date 2019-09-30
 */
@Controller
@RequestMapping("/demo/websocket")
public class DemoWebsocketController extends BaseController
{
    private String prefix = "demo/websocket";


    @RequiresPermissions("demo:websocket:view")
    @GetMapping()
    public String socket()
    {
        return prefix + "/websocket";
    }
    
    @RequiresPermissions("demo:websocket:edit")
  //推送数据接口
    @ResponseBody
    @RequestMapping("/push/{cid}")
    public Map pushToWeb(@PathVariable String cid, String message) {
    	if(message==null){
    		message = "我是消息44";
    	}
        Map result = new HashMap();
        try {
            WebSocketServer.sendInfo(message,cid);
            result.put("code", 200);
            result.put("msg", "success");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;

    }
    
    
    
}

④添加WebSocketServer类
package com.demo.project.websocket.server;

import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

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 org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@ServerEndpoint("/WebSocketServer/{sid}")
@Component
@Slf4j
public class WebSocketServer {
	// 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
	private static int onlineCount = 0;
	// concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
	private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
	//private static ConcurrentHashMap<String,WebSocketServer> websocketList = new ConcurrentHashMap<>();
	// 与某个客户端的连接会话,需要通过它来给客户端发送数据
	private Session session;

	// 接收sid
	private String sid = "";

	// * 连接建立成功调用的方法*
	@OnOpen
	public void onOpen(Session session, @PathParam("sid") String sid) {
		this.session = session;
		webSocketSet.add(this); // 加入set中
		addOnlineCount(); // 在线数加1
		log.info("有新窗口开始监听:" + sid + ",当前在线人数为" + getOnlineCount());
		this.sid = sid;
		try {
			sendMessage("连接成功");
		} catch (IOException e) {
			log.error("websocket IO异常");
		}
	}

	// * 连接关闭调用的方法

	@OnClose
	public void onClose() {
		webSocketSet.remove(this); // 从set中删除
		subOnlineCount(); // 在线数减1
		log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
	}

	// */
	/// **
	// * 收到客户端消息后调用的方法
	// *
	// * @param message 客户端发送过来的消息*//*
	@OnMessage
	public void onMessage(String message, Session session) {
		log.info("收到来自窗口" + sid + "的信息:" + message);
		// 群发消息
		for (WebSocketServer item : webSocketSet) {
			try {
				item.sendMessage(message);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 *
	 * @param session
	 * @param error
	 */
	@OnError
	public void onError(Session session, Throwable error) {
		log.error("发生错误");
		error.printStackTrace();
	}

	/**
	 * 实现服务器主动推送
	 */
	public void sendMessage(String message) throws IOException {
		log.info("服务器消息推送:"+message);
		this.session.getBasicRemote().sendText(message);
	}

	/**
	 * 群发自定义消息
	 */
	public static void sendInfo(String message, @PathParam("sid") String sid) throws IOException {
		log.info("推送消息到窗口" + sid + ",推送内容:" + message);
		for (WebSocketServer item : webSocketSet) {
			try {
				// 这里可以设定只推送给这个sid的,为null则全部推送
				if (sid == null) {
					item.sendMessage(message);
				} else if (item.sid.equals(sid)) {
					item.sendMessage(message);
				}
			} catch (IOException e) {
				continue;
			}
		}
	}
	
	
	

	public static synchronized int getOnlineCount() {
		return onlineCount;
	}

	public static synchronized void addOnlineCount() {
		WebSocketServer.onlineCount++;
	}

	public static synchronized void subOnlineCount() {
		WebSocketServer.onlineCount--;
	}

	public static CopyOnWriteArraySet<WebSocketServer> getWebSocketSet() {
		return webSocketSet;
	}
}

⑤添加websocket.html。路径:resources/templates/demo/websocket

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"></meta>
    <title>Title</title>
    <script type="text/javascript" src="/js/jquery.min.js"></script>
</head>
<body>
hello world!
<button onclick="onSendButtonClick()">发送</button>
<button onclick="onJhButtonClick()">交互</button>

</body>
<script>
    var index;
    if(typeof(WebSocket) == "undefined") {
        console.log("您的浏览器不支持WebSocket");
    }else{
        console.log("您的浏览器支持WebSocket");
        index = new WebSocket("ws://localhost:8888/WebSocketServer/2");
        //打开事件
        
        
        
        index.onopen = function() {
            console.log("Socket 已打开");
            //index.send("这是来自客户端的消息" + location.href + new Date());
        };
        //获得消息事件
        index.onmessage = function(msg) {
            console.log("获得消息:"+msg.data);
            //发现消息进入    开始处理前端触发逻辑
        };
        //关闭事件
        index.onclose = function() {
            console.log("Socket已关闭");
        };
        //发生了错误事件
        index.onerror = function() {
            alert("Socket发生了错误");
            //此时可以尝试刷新页面
        }
        
    }
    
    function onSendButtonClick(){
    	console.log("开始发送");
    	index.send("这是来自客户端的消息" + location.href + new Date());
    }
    
    function onJhButtonClick(){
    	$.ajax({
	        url: "/demo/websocket/push/2",
	        data: {"message":"我是消息"},
	        type: "post",
	        processData: false,
	        contentType: false,
	        success: function(result) {
	        	console.log(result);
	        	alert(result);
	        }
	    })
    }
    
</script>
</html>

 


 


 


 

posted on 2019-12-26 09:54  object360  阅读(5757)  评论(0编辑  收藏  举报