第一步: 添加Spring WebSocket的依赖jar

打开pom.xml 先引入jar

    <dependency>

         <groupId>org.springframework</groupId>

        <artifactId>spring-websocket</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-messaging</artifactId>
        <version>${spring.version}</version>

    </dependency>

第二步: 创建握手类MyWebSocketInterceptor ,继承HttpSessionHandshakeInterceptor

import java.util.Map;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;


public class MyWebSocketInterceptor extends HttpSessionHandshakeInterceptor{
@Override  
    public boolean beforeHandshake(ServerHttpRequest request,  
            ServerHttpResponse response, WebSocketHandler wsHandler,  
            Map<String, Object> attributes) throws Exception {  
        System.out.println("Before Handshake");  
        return super.beforeHandshake(request, response, wsHandler, attributes);  
    }  
  
    @Override  
    public void afterHandshake(ServerHttpRequest request,  
            ServerHttpResponse response, WebSocketHandler wsHandler,  
            Exception ex) {  
        System.out.println("After Handshake");  
        super.afterHandshake(request, response, wsHandler, ex);  
    }  
}

第三步: 创建WebSocketConfig 路径搜索

@Configuration
@EnableWebSocket
@Component
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer{
 
  public static WebsocketEndPoint gameHandler =new WebsocketEndPoint();
 
 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {    
    registry.addHandler(gameHandler,"/appwebsocket")
        .addInterceptors(new MyWebSocketInterceptor())
        .setAllowedOrigins("*");
    }

第四步: 创建websocket处理类
   
 //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int sum = 0;

    private static final ArrayList<WebSocketSession> users = new ArrayList<WebSocketSession>();
     /**
     * 连接建立成功调用的方法
     * */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
     System.out.println("sessionId:" + session.getId());
     //连接进来的用户添加到用户集合中方便以后发送消息
     users.add(session);
     session.sendMessage(new TextMessage("第"+users.size()+"次进来,有点紧张!")); 
    session.sendMessage(new TextMessage("当前在线人数"+users.size()));
    }

   /**
     * 关闭
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
        users.remove(session);
        System.out.println("关闭WebSocket" + closeStatus.getReason());
  }

 /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息*/
  
    public void handleTextMessage(WebSocketSession session, TextMessage message) {
   
    System.out.println("来自客户端的消息:" + message);
    System.out.println(users.size()+"号说:"+message.getPayload()+".................");
        //群发消息
        for (WebSocketSession user : users) {       
            try {
            user.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

public TextMessage sendMessage(String message) throws IOException {

    return new TextMessage(message);

     }

最后一步:创建测试类


<!DOCTYPE HTML>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<html>
<head>
    <title>My WebSocket</title>
</head>


<body>
Welcome<br/>
<input id="text1" type="text" /><button onclick="reset()">重连</button><br/>
<input id="text" type="text" /><button onclick="send()">开始发送</button>   
 <button onclick="closeWebSocket()">关闭连接</button>
<!--<input id="text3" type="text" /><button onclick="sendJson()">获取数据</button> -->
<div id="message">
</div>
</body>


<script type="text/javascript">
    var websocket = null;
var url ="ws://localhost:8088/appwebsocket";
   
connectionWebSocket();
function connectionWebSocket(){
//判断当前浏览器是否支持WebSocket
if('WebSocket' in window){
websocket = new WebSocket(url);
}else if('MOzWebSocket' in window){
websocket = new MozWebSocket(url);
}else{
alert('Not support websocket')
}
//连接发生错误的回调方法
websocket.onerror = function(){
setMessageInnerHTML("error");
};


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


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


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


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


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


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


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

function sendJson(){
        var message = "{'startTime':'2018-01-10 15:18:41','filedNames':'waterFrequency,pressureFeedback','deviceName':'thing'}";
        websocket.send(message);
    }

</script>

</html>




sping+WebSocket实现消息推送sping+WebSocket实现消息推送


相关文章: