Android で QUIC ストリームを使う
以前 Android で QUIC を使おう! という記事で、 Android での QUIC 使用法を書いたのですが、この方法だと HTTP アクセスでは確かに QUIC が使えるのですが、生の QUIC ストリームは使えませんでした。
今回、 Android で生の QUIC ストリームを扱うことが出来たので、記事にしておきたいと思います。
と言っても、 kwik という外部ライブラリを使用します。ライブラリだけで追加できるのは、 QUIC の利点ですね。
で、そのライブラリの Usage 通りに使えばいいのですが、少し注意点があります。
サンプルでは使用方法として以下のように記載があります。
String applicationProtocolId = "....";
QuicClientConnection connection =
QuicClientConnection.newBuilder()
.uri(URI.create("https://sample.com:443"))
.applicationProtocol(applicationProtocolId)
.build();
applicationProtocolId は ALPN を指定するのですが、 HTTP とは関係のない QUIC ストリームの場合には uri に何を指定すればいいのか分からなくなります。
調べたところ、以下のようにするとうまくいきました。
val connection =
QuicClientConnection
.newBuilder()
.host("example.com").port(443)
.noServerCertificateCheck()
.applicationProtocol(protocol)
.build();
※ Kotlin で書いています。
noServerCertificateCheck() でサーバー証明書を無視しています。今回サーバー側には Go言語による QUIC 実装である quic-go を使用しているのですが、多くのサンプルコードがやっているダミーデータによる証明書では証明書エラーが出て通信できませんでした。オレオレ証明書でもいいと思うので、ちゃんとした証明書を使用する必要がありそうです。
あとは以下のようにすると通信を開始し、 inputStream と outputStream で通信できるようになります。
connection.connect();
val quicStream = connection.createStream(true)
val inputStream = quicStream.inputStream
val outputStream = quicStream.outputStream
HTTP/3 で QUIC は有名になってきたんですが、何ができるのかあまり浸透しておらず、こういったサンプルが見当たらないので、記事にしてみました。是非利用してみて下さい。
Discussion