ホームページ  >  記事  >  ウェブフロントエンド  >  Spring WebSocket の詳細な紹介

Spring WebSocket の詳細な紹介

零下一度
零下一度オリジナル
2017-07-03 15:18:281804ブラウズ

シナリオ

Websocket は、HTML5 の新機能の 1 つで、ブラウザとサーバー間の全二重通信方式を確立し、http リクエストとレスポンスによる過剰なリソース消費を解決することを目的としています。チャット、株取引、ゲームなど、高いリアルタイム性が求められる特殊なシナリオの実装方法に新しいソリューションを提供します。

バックグラウンド

Comet はブラウザの http を介して一方向通信のみを実現できますが、効率は低く、サーバーからの適切なサポートが必要です。 flash 本物の双方向通信を実現できます。 flex ajax ブリッジを介して、これら 2 つの機能を javascript で使用できます。websocket がブラウザに実装されれば、上記 2 つのテクノロジーに代わって広く使用されることが予想されます。このような状況に直面して、HTML5 では WebSocket プロトコルを定義しています。これにより、サーバーのリソースと帯域幅を節約し、リアルタイム通信を実現できます。現在、主要な主流ブラウザはすべて WebSocket をサポートしています。IE ブラウザ には IE10+ が必要です

1. POM 依存関係

POM 依存関係、spring4.1.4.RELEASE、以下は WebSocket 関連の 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>
です。

2. 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. WebSocketConfigurer インターフェイスを実装し、 registerWebSocketHandlers メソッドをオーバーライドします。これは、WebSocket 入口、許可されたアクセス ドメイン、登録済みハンドラー、SockJ サポートおよびインターセプターを構成するコア実装メソッドです。

  2. registry.addHandler には登録機能とルーティング機能があり、クライアントが WebSocket 接続を開始すると、/path は特定のビジネス ロジックを実装せずに、対応するハンドラーに渡されて処理されます。これは、収集およびタスク配布センターとして理解できます。

  3. setAllowedOrigins(String[] Domains) は、指定したドメイン名または IP (ポート番号を含む) で長い接続を確立できるようにします。自分のドメイン名へのアクセスのみを許可する場合は、ここで簡単に設定できます。 「*」記号を期限なしで使用する場合、ドメイン名を指定する場合は、http または https で始める必要があります。

  4. addInterceptors は、名前が示すように、ハンドラーを呼び出す前と後に独自のロジック コードをハンドラーに追加します。

  5. spring websocket も STOMP プロトコルをサポートしています。それについては次回共有します。

3. インターセプターの実装

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、ハンドラーを呼び出す前の処理メソッド。ハンドラー内でユーザー情報を登録し、WebSocketSessionをバインドし、ユーザー情報に基づいてWebSocketSessionを取得してメッセージを送信するためによく使用されます。

4. ハンドラー処理クラス

public class ChatWebSocketHandler extends TextWebSocketHandler{
    
    private final static List<WebSocketSession> sessions = Collections.synchronizedList(new ArrayList<WebSocketSession>());
    //接收文本消息,并发送出去
    @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);
    }
    //连接关闭后处理
    @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;
    }
}

5. クライアント接続

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关闭");
}

ここではWebSocket.jsを使用し、再接続、接続タイムアウト、再接続失敗間隔、接続試行などの拡張機能を追加します。時間など
プロジェクトホームページ:WebSocketの再接続

以上がSpring WebSocket の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。