欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring WebSocket示例詳解

 更新時間:2017年01月23日 16:33:09   作者:瘋狂的貓  
websocket是Html5新增加特性之一,目的是瀏覽器與服務(wù)端建立全雙工的通信方式,本篇文章主要介紹了spring WebSocket示例詳解 ,有興趣的可以了解一下。

場景

websocket是Html5新增加特性之一,目的是瀏覽器與服務(wù)端建立全雙工的通信方式,解決http請求-響應(yīng)帶來過多的資源消耗,同時對特殊場景應(yīng)用提供了全新的實現(xiàn)方式,比如聊天、股票交易、游戲等對對實時性要求較高的行業(yè)領(lǐng)域。

背景

在瀏覽器中通過http僅能實現(xiàn)單向的通信,comet可以一定程度上模擬雙向通信,但效率較低,并需要服務(wù)器有較好的支持; flash中的socket和xmlsocket可以實現(xiàn)真正的雙向通信,通過 flex ajax bridge,可以在javascript中使用這兩項功能. 可以預見,如果websocket一旦在瀏覽器中得到實現(xiàn),將會替代上面兩項技術(shù),得到廣泛的使用.面對這種狀況,HTML5定義了WebSocket協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬并達到實時通訊。目前各大主流瀏覽器都支持websocket,IE瀏覽器要IE10+

一、POM依賴

POM依賴,spring4.1.4.RELEASE,spring核心依賴請自行添加,下面是websocket相關(guān)jar

<dependency>
  <groupId>javax.websocket</groupId>
  <artifactId>javax.websocket-api</artifactId>
  <version>1.0</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-websocket</artifactId>
  <version>4.1.4.RELEASE</version>
</dependency>

二、WebSocket入口

@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
  @Override
  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    //允許連接的域,只能以http或https開頭
    String[] allowsOrigins = {"http://www.xxx.com"};
    
    //WebIM WebSocket通道
    registry.addHandler(chatWebSocketHandler(),"/      webSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor());
    registry.addHandler(chatWebSocketHandler(), "/sockjs/w     ebSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()).withSockJS();
  }
  @Bean
  public ChatWebSocketHandler chatWebSocketHandler() {
    return new ChatWebSocketHandler();
  }
  @Bean
  public WebSocketHandshakeInterceptor myInterceptor(){
    return new WebSocketHandshakeInterceptor();
  }
}

1.實現(xiàn)WebSocketConfigurer接口,重寫registerWebSocketHandlers方法,這是一個核心實現(xiàn)方法,配置websocket入口,允許訪問的域、注冊Handler、SockJs支持和攔截器。

2.registry.addHandler注冊和路由的功能,當客戶端發(fā)起websocket連接,把/path交給對應(yīng)的handler處理,而不實現(xiàn)具體的業(yè)務(wù)邏輯,可以理解為收集和任務(wù)分發(fā)中心。

3.setAllowedOrigins(String[] domains),允許指定的域名或IP(含端口號)建立長連接,如果只允許自家域名訪問,這里輕松設(shè)置。如果不限時使用"*"號,如果指定了域名,則必須要以http或https開頭。

4.addInterceptors,顧名思義就是為handler添加攔截器,可以在調(diào)用handler前后加入我們自己的邏輯代碼。

5.spring websocket也支持STOMP協(xié)議,下回再分享。

三、攔截器實現(xiàn)

public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {

  @Override
  public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object
        > attributes) throws Exception {
    if (request instanceof ServletServerHttpRequest) {
      attributes.put("username",userName);
    }
    return true;
  }

  @Override
  public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {

  }
}

beforeHandshake,在調(diào)用handler前處理方法。常用在注冊用戶信息,綁定WebSocketSession,在handler里根據(jù)用戶信息獲取WebSocketSession發(fā)送消息。

四、Handler處理類

public class ChatWebSocketHandler extends TextWebSocketHandler{
  
  private final static List<WebSocketSession> sessions = Collections.synchronizedList(new ArrayList<WebSocketSession>());
  //接收文本消息,并發(fā)送出去
  @Override
  protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    chatTextMessageHandler(message.getPayload());
    super.handleTextMessage(session, message);
  }
  //連接建立后處理
  @SuppressWarnings("unchecked")
  @Override
  public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    logger.debug("connect to the websocket chat success......");
    sessions.add(session);
    //處理離線消息
  }
  //拋出異常時處理
  @Override
  public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
    if(session.isOpen()){
      session.close();
    }
    logger.debug("websocket chat connection closed......");
    sessions.remove(session);
  }
  //連接關(guān)閉后處理
  @Override
  public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
    logger.debug("websocket chat connection closed......");
    sessions.remove(session);
  }

  @Override
  public boolean supportsPartialMessages() {
    return false;
  }
}

五、客戶端連接

var host = window.location.host;
var websocket;
if ('WebSocket' in window) {
  websocket = new ReconnectingWebSocket("ws://"
    + host + "/webSocketIMServer", null, {debug:true, maxReconnectAttempts:4});
} else if ('MozWebSocket' in window) {
  websocket = new MozWebSocket("ws://" + host
    + "/webSocketIMServer");
} else {
  websocket = new SockJS("http://" + host
      + "/sockjs/webSocketIMServer");
}
websocket.onopen = function(evnt) {
  console.log("websocket連接上");
};
websocket.onmessage = function(evnt) {
  messageHandler(evnt.data);
};
websocket.onerror = function(evnt) {
  console.log("websocket錯誤");
};
websocket.onclose = function(evnt) {
  console.log("websocket關(guān)閉");
}

這里用到了ReconnectingWebSocket.js,對瀏覽器自帶websocket添加了擴展,例如重連,連接超時時間,失敗重連間隔,嘗試連接最大次數(shù)等。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java之swing單選框用法實例分析

    java之swing單選框用法實例分析

    這篇文章主要介紹了java之swing單選框用法,以實例形式分析了swing圖形界面單選框的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • Java實現(xiàn)的properties文件動態(tài)修改并自動保存工具類

    Java實現(xiàn)的properties文件動態(tài)修改并自動保存工具類

    這篇文章主要介紹了Java實現(xiàn)的properties文件動態(tài)修改并自動保存工具類,可實現(xiàn)針對properties配置文件的相關(guān)修改與保存功能,需要的朋友可以參考下
    2017-11-11
  • Java用棧實現(xiàn)綜合計算器

    Java用棧實現(xiàn)綜合計算器

    棧(stack)又名堆棧,它是一種運算受限的線性表,下面看一下如何在Java中,利用數(shù)組實現(xiàn)模擬一個棧,感興趣的朋友跟隨小編一起看看吧
    2022-06-06
  • 巧妙的利用Mongodb做地理空間查詢

    巧妙的利用Mongodb做地理空間查詢

    本篇文章將會以Mongodb為數(shù)據(jù)庫,講述如何在數(shù)據(jù)庫層級進行定位查詢。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Java中的UrlDecoder 和 UrlEncoder_動力節(jié)點Java學院整理

    Java中的UrlDecoder 和 UrlEncoder_動力節(jié)點Java學院整理

    HTML 格式編碼的實用工具類。該類包含了將 String 轉(zhuǎn)換為 application/x-www-form-urlencoded MIME 格式的靜態(tài)方法。下文通過實例代碼給大家介紹Java中的UrlDecoder 和 UrlEncoder知識,感興趣的的朋友一起看看吧
    2017-07-07
  • Java基于直方圖應(yīng)用的相似圖片識別實例

    Java基于直方圖應(yīng)用的相似圖片識別實例

    這篇文章主要介紹了Java基于直方圖應(yīng)用的相似圖片識別實例,是非常實用的技巧,多見于圖形里游戲中,需要的朋友可以參考下
    2014-09-09
  • spring AOP的After增強實現(xiàn)方法實例分析

    spring AOP的After增強實現(xiàn)方法實例分析

    這篇文章主要介紹了spring AOP的After增強實現(xiàn)方法,結(jié)合實例形式分析了spring面向切面AOP的After增強實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01
  • Java的Lombok之@Builder使用總結(jié)

    Java的Lombok之@Builder使用總結(jié)

    這篇文章主要介紹了Java的Lombok之@Builder使用總結(jié),當不使用@Builder注解到類上,創(chuàng)建T1的有參構(gòu)造函數(shù),入?yún)⒉粌H包括T1中所有的參數(shù),還包括T中所有的參數(shù),T2的屬性由T1在有參構(gòu)造函數(shù)中通過調(diào)用父類構(gòu)造器的方式賦初值,需要的朋友可以參考下
    2023-12-12
  • spring Security的自定義用戶認證過程詳解

    spring Security的自定義用戶認證過程詳解

    這篇文章主要介紹了spring Security的自定義用戶認證過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • 親手教你IDEA2020.3創(chuàng)建Javaweb項目的步驟詳解

    親手教你IDEA2020.3創(chuàng)建Javaweb項目的步驟詳解

    這篇文章主要介紹了IDEA2020.3創(chuàng)建Javaweb項目的步驟詳解,本文是小編手把手教你,通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-03-03

最新評論