本文へ移動
Hikari リファレンス

std:net リファレンス

import net := "std:net" で取得する TCP クライアントモジュール。connect / connect_tls で Conn ハンドルを得て read / read_exact / write / close する。

Conn

ExactlyOnce(Conn)

TCP 接続のハンドル。ExactlyOnce の多重度型で、close が Consuming メソッドである。
閉じ忘れはソケットの漏れなので消費義務を課す。read / write は受け手を借用する。

>>> import net := "std:net"
>>> c := net.connect("example.com", 80)!.unwrap!
>>> c.close()!

connect

connect(host, port)
connect: { String, Int | Effect(Future(Result(Conn)), Net) }

平文 TCP で host:port へ接続し Conn ハンドルを得る。

効果ハンドラーの操作である。handle の操作スロットに connect と書いて横取りできる(language-spec.md §17.9)。

>>> c := net.connect("example.com", 80)!
>>> c.close()!

connect_tls

connect_tls(host, port)
connect_tls: { String, Int | Effect(Future(Result(Conn)), Net) }

TLS で host:port へ接続する (システムルート CA・ホスト名検証)。

効果ハンドラーの操作である。handle の操作スロットに connect_tls と書いて横取りできる(language-spec.md §17.9)。

>>> c := net.connect_tls("example.com", 443)!
>>> c.close()!

Conn メソッド

close

c.close()
close: Consuming({ Effect(Future(Result(Unit)), Net) })

切断して封印する。以降のメソッド呼び出しは Error。

効果ハンドラーの操作である。handle の操作スロットに close と書いて横取りできる(language-spec.md §17.9)。

>>> c := net.connect("example.com", 80)!
>>> c.close()!

read

c.read(n)
read: { Int | Effect(Future(Result(Bytes)), Net) }

最大 n bytes 読む。Ok の空 Bytes は EOF (相手が閉じた)。

効果ハンドラーの操作である。handle の操作スロットに read と書いて横取りできる(language-spec.md §17.9)。

>>> c := net.connect("example.com", 80)!
>>> data := c.read(1024)!
>>> print data

read_exact

c.read_exact(n)
read_exact: { Int | Effect(Future(Result(Bytes)), Net) }

ちょうど n bytes 読む。揃う前に EOF なら Err(eof)。

効果ハンドラーの操作である。handle の操作スロットに read_exact と書いて横取りできる(language-spec.md §17.9)。

>>> c := net.connect("example.com", 80)!
>>> head := c.read_exact(4)!
>>> print head

set_timeout

c.set_timeout(ms)
set_timeout: { Int | Effect(Unit, Mut) }

以降の read / write の期限をミリ秒で設定する (0 で解除)。同期・即値 ()。

効果ハンドラーの操作である。handle の操作スロットに set_timeout と書いて横取りできる(language-spec.md §17.9)。

>>> c := net.connect("example.com", 80)!
>>> c.set_timeout(5000)

write

c.write(bytes)
write: { Bytes | Effect(Future(Result(Unit)), Net) }

bytes を全量書く。

効果ハンドラーの操作である。handle の操作スロットに write と書いて横取りできる(language-spec.md §17.9)。

>>> c := net.connect("example.com", 80)!
>>> payload := fs.read_bytes("req.bin")!
>>> c.write(payload)!