最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring WebSocket示例詳解

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

場(chǎng)景

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

背景

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

一、POM依賴(lài)

POM依賴(lài),spring4.1.4.RELEASE,spring核心依賴(lài)請(qǐng)自行添加,下面是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開(kāi)頭
    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.實(shí)現(xiàn)WebSocketConfigurer接口,重寫(xiě)registerWebSocketHandlers方法,這是一個(gè)核心實(shí)現(xiàn)方法,配置websocket入口,允許訪(fǎng)問(wèn)的域、注冊(cè)Handler、SockJs支持和攔截器。

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

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

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

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

三、攔截器實(shí)現(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前處理方法。常用在注冊(cè)用戶(hù)信息,綁定WebSocketSession,在handler里根據(jù)用戶(hù)信息獲取WebSocketSession發(fā)送消息。

四、Handler處理類(lèi)

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);
    //處理離線(xiàn)消息
  }
  //拋出異常時(shí)處理
  @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;
  }
}

五、客戶(hù)端連接

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錯(cuò)誤");
};
websocket.onclose = function(evnt) {
  console.log("websocket關(guān)閉");
}

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java Long類(lèi)型轉(zhuǎn)為String類(lèi)型的兩種方式及區(qū)別說(shuō)明

    java Long類(lèi)型轉(zhuǎn)為String類(lèi)型的兩種方式及區(qū)別說(shuō)明

    這篇文章主要介紹了java Long類(lèi)型轉(zhuǎn)為String類(lèi)型的兩種方式及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • springboot2.5.2與 flowable6.6.0整合流程引擎應(yīng)用分析

    springboot2.5.2與 flowable6.6.0整合流程引擎應(yīng)用分析

    這篇文章主要介紹了springboot2.5.2與 flowable6.6.0整合流程引擎應(yīng)用分析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • Java數(shù)據(jù)脫敏的常用方式總結(jié)

    Java數(shù)據(jù)脫敏的常用方式總結(jié)

    大家好!今天我們要聊一聊數(shù)據(jù)脫敏,這個(gè)詞聽(tīng)起來(lái)像特工電影里的高科技武器,其實(shí)它就是給敏感數(shù)據(jù)穿上“偽裝衣”,防止“壞人”偷 窺,Java 提供了多種數(shù)據(jù)脫敏方式,今天咱們來(lái)聊幾種經(jīng)典實(shí)用的“偽裝術(shù)”,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2024-11-11
  • java文字轉(zhuǎn)語(yǔ)音播報(bào)功能的實(shí)現(xiàn)方法

    java文字轉(zhuǎn)語(yǔ)音播報(bào)功能的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于java文字轉(zhuǎn)語(yǔ)音播報(bào)功能的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Java中-Xms和-Xmx參數(shù)的使用與默認(rèn)內(nèi)存設(shè)置

    Java中-Xms和-Xmx參數(shù)的使用與默認(rèn)內(nèi)存設(shè)置

    在 Java 程序運(yùn)行時(shí),內(nèi)存的管理是影響程序性能的關(guān)鍵因素之一,Java 程序使用的內(nèi)存主要由兩部分組成:堆內(nèi)存和棧內(nèi)存,Java 提供了多個(gè)參數(shù)來(lái)控制堆內(nèi)存的大小,其中最常用的參數(shù)是 -Xms 和 -Xmx,本文將詳細(xì)介紹這些參數(shù),需要的朋友可以參考下
    2024-11-11
  • java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼

    java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java?實(shí)戰(zhàn)項(xiàng)目之學(xué)生信息管理系統(tǒng)的實(shí)現(xiàn)流程

    Java?實(shí)戰(zhàn)項(xiàng)目之學(xué)生信息管理系統(tǒng)的實(shí)現(xiàn)流程

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • SpringAOP如何修改請(qǐng)求參數(shù)列表

    SpringAOP如何修改請(qǐng)求參數(shù)列表

    這篇文章主要介紹了SpringAOP如何修改請(qǐng)求參數(shù)列表問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java如何判斷一個(gè)對(duì)象是否為空對(duì)象

    java如何判斷一個(gè)對(duì)象是否為空對(duì)象

    本文主要介紹了java如何判斷一個(gè)對(duì)象是否為空對(duì)象,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java的stream流多個(gè)字段排序的實(shí)現(xiàn)

    Java的stream流多個(gè)字段排序的實(shí)現(xiàn)

    本文主要介紹了Java的stream流多個(gè)字段排序的實(shí)現(xiàn),主要是兩種方法,第一種是固定多個(gè)字段排序和第二種動(dòng)態(tài)字段進(jìn)行排序,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10

最新評(píng)論

吉安县| 加查县| 奉新县| 香河县| 珲春市| 平湖市| 忻州市| 枞阳县| 阳原县| 油尖旺区| 汾阳市| 综艺| 谢通门县| 竹北市| 那曲县| 湖北省| 磐石市| 温宿县| 云安县| 庆阳市| 襄汾县| 惠州市| 元阳县| 图木舒克市| 新田县| 常熟市| 车致| 泰和县| 清新县| 乐昌市| 宝丰县| 江孜县| 浏阳市| 广南县| 年辖:市辖区| 喀喇沁旗| 赤水市| 齐齐哈尔市| 曲阳县| 屯留县| 和田县|