springでwebsocketを使用するときにめっちゃ詰まった話(sendが動かない…)

アプリ制作関連

結論:ContextPathの部分を適切に設定しないといけなかった

まずは結論です

CONNECTION時にはContextPathは必要ですが

SENDとSUBSCRIBE時にはContextPathは必要ありませんでした

これいっぱい検索したのですが、どこにも記載なかったので

備忘録としてここで記載しておきます

websocketとは?

クライアントとサーバが双方向で通信することができるようになる

んだそうです

LINEとかって何もしてないのに勝手にメッセージが届きますよね

あれが双方向通信です、つまり、サーバー側からクライアント側に

勝手に通信しちゃうことができるってことですね

公式のやり方をマネしているはずなのになぜか動かない…

以下を参考にwebsocketの処理を追加したのです

Spring Boot WebSocket でインタラクティブ Web アプリケーション作成 - 公式サンプルコード
Spring Boot の概要から各機能の詳細までが網羅された公式リファレンスドキュメントです。開発者が最初に読むべきドキュメントです。

あと以下も参考にしました。こっちの方が色々書いてあるので参考になります。

26. WebSocket Support

私の陥った事象

stompでCONNECTEDになったのでSEND処理をしたのに

なぜか動かない…

tomcatが通信ブロックしているのか?とか

Spring Securityがなにか通信をブロックしているのか?

とか考えて本当に色々試してみましたが

結論、冒頭の通りContextPathを全てにおいて記載していたのが

間違いだったようです

参考:ContextPathとは?
ContextPathとは簡単にいうとURLの最初のところです…

ごめんなさい、上記はちゃんとした説明じゃないので

以下とか見るか自分で調べてみてください

コンテキストパス(contextpath)とは
コンテキストパス(contextpath)についてまとめています。

間違っていたパターンと正解のパターン

公式のスクリプトを用いて説明します

以下が間違っていた例です

var contextPath = '/aaa';  // ここにコンテキストパスを設定

function connect() {
    var socket = new SockJS(contextPath + '/gs-guide-websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe(contextPath + '/topic/greetings', function (greeting) {
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

function sendName() {
    stompClient.send(contextPath + "/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
}

で、以下が正常に動作したパターンです

var contextPath = '/aaa';  // ここにコンテキストパスを設定

function connect() {
    var socket = new SockJS(contextPath + '/gs-guide-websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/greetings', function (greeting) {
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

function sendName() {
    stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
}

stompClient.subscribe

stompClient.send

contextPathを取り除きました

これ必要なかったみたいです…

これだけで動作しました…

これを動かすためにほぼ一週間調査で仕事が終わりました…

動いた時マジで「よっしゃぁぁぁぁああー!!」

て叫びました

タイトルとURLをコピーしました