🌊

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