KotlinでSpark Frameworkを使ってWebSocketのアプリケーションを構築する

公式を参考に下記のようにKotlinに書き換えます。接続があった時にわかるようにコメントの出力だけ追加しました。

import org.eclipse.jetty.websocket.api.*
import org.eclipse.jetty.websocket.api.annotations.*
import java.io.*
import java.util.*
import java.util.concurrent.*
@WebSocket
class Hoge {
companion object {
private val sessions = ConcurrentLinkedQueue<Any>()
}
@OnWebSocketConnect
fun connected(session: Session) {
println("connect")
sessions.add(session)
}
@OnWebSocketClose
fun closed(session: Session, statusCode: Int, reason: String) {
println("close")
sessions.remove(session)
}
@OnWebSocketMessage
@Throws(IOException::class)
fun message(session: Session, message: String) {
println("Got: $message")
session.remote.sendString(message)
}
}

パスの割当ですが下記のようにします。

webSocket("/websocket/path", Hoge::class.java)
init()

init()はそれ以降にGETとかPOSTが存在しない場合に書いてあげる必要があるだけで、以降に他のURLが割り当てられている場合は書く必要はありません。

webSocket("/websocket/path", Hoge::class.java)
get("/sample", RouteSample.App())

起動後に下記のようにcURLで接続確認ができます。下記のようにHTTP/1.1 101 Switching Protocolsが戻れば問題ありません。これが例えば他のURLとバッティングするなど(get("/*", RouteSample.App()))などように被る場合はGETが優先される)あると200が帰ってくるので調整しましょう。このデバッグ方法はこちらを参考にしました。

$ curl -v -i -N \
-H 'Sec-WebSocket-Version: 13' \
-H "Sec-WebSocket-Key: $(head -c 16 /dev/urandom | base64)" \
-H "Connection: Upgrade" \
-H "Upgrade: websocket" \
"http://localhost:8080/websocket/path"
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /websocket/path HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.54.0
> Accept: */*
> Sec-WebSocket-Version: 13
> Sec-WebSocket-Key: 3/1w68zRBAqj1/sszabdTw==
> Connection: Upgrade
> Upgrade: websocket
>
< HTTP/1.1 101 Switching Protocols
HTTP/1.1 101 Switching Protocols
< Date: Wed, 10 Oct 2018 06:59:41 GMT
Date: Wed, 10 Oct 2018 06:59:41 GMT
< Connection: Upgrade
Connection: Upgrade
< Sec-WebSocket-Accept: J/c6izErmiViW26aSwL9e0NxtKs=
Sec-WebSocket-Accept: J/c6izErmiViW26aSwL9e0NxtKs=
< Server: Jetty(9.4.4.v20170414)
Server: Jetty(9.4.4.v20170414)
< Upgrade: WebSocket
Upgrade: WebSocket

あとはJavaScriptでこんな感じで接続できると思います。これはTypeScriptなんで、TypeScriptわからない人はこちらを参考にJavaScriptで書き換えてあげてください。

let socket = new WebSocket('http://localhost:8080/websocket/path');
socket.addEventListener('open', () => {
socket.send('Hello Server!');
});
socket.addEventListener('message', (event: any) => {
console.log('Message from server ', event.data);
});

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA