rontolisp:tcp-connect
(rontolisp:tcp-connect host port)
host/port へブロッキングの TCP 接続を開き、双方向のストリームハンドルを
返します。このハンドルはファイルストリームと同じハンドル空間に属するため、標準の
ストリーム関数がそのまま使えます: read-line、
write-line、read-byte、
write-byte、close。バッファリングされる
ファイル出力と異なり、ソケットへの書き込みは即時に送信されます(write-line は
行ごとにフラッシュ)。相手側が接続を閉じると read-line は nil を返します。
以下の例は自己完結しています:
rontolisp:tcp-listen でエフェメラルポートを
listen し、ループバック経由で自分自身へ接続して、
rontolisp:tcp-accept を通して 1 行をエコーします:
典型的なクライアントは固定のホストとポートへ接続し、サーバーが閉じるまで行を やり取りします:
(let ((sock (rontolisp:tcp-connect "127.0.0.1" 7777)))
(write-line "hello" sock)
(print (read-line sock)) ; the server's reply
(close sock))
バックエンドごとの対応
- インタープリタと JVM: JDK の
java.net.Socketを使用し、hostには ホスト名と IP リテラルのどちらも指定できます。接続失敗(接続拒否など)は エラーを通知します。 - WASM: コンポーネント専用で、
wasi:sockets@0.3.0上で動作します (rontolisp:fetchと違い WASI 0.3 ネイティブで、0.2 ハイブリッドは不要)。hostは"127.0.0.1"のような IPv4 リテラルである必要があります (wasi:sockets/ip-name-lookupによるホスト名解決は未対応)。--componentでコンパイルし、非同期フラグに加えて-S tcp=y -S inherit-network=yを付けて 実行します。接続失敗はハンドルの代わりにnilを返します (rontolisp:fetchと同じ nil-on-failure 規約)。-Sフラグなしでも コンポーネントは起動しますが、すべてのソケット操作が失敗してnilになります。 tcp 系関数は Preview 1(コアモジュール)モードではコンパイルエラーです。 - ブラウザプレイグラウンド: 非対応 — ブラウザのサンドボックスには生の TCP ソケットが存在しないため、すべての tcp 関数はエラーを通知します。
制限事項
- TCP のみ(UDP は未対応): 通信は平文です。暗号化されたクライアント接続には
rontolisp:tls-connectを使ってください (インタープリタ/JVM のみ)。 - WASM コンポーネントバックエンドは IPv4 リテラルのみを受け付け、1 つの
--componentバイナリでrontolisp:fetchと tcp 関数を併用することは まだできません。 read(S 式リーダー)はソケットハンドルでは動作しません。行またはバイトを 読み込み、明示的にパースしてください(例:read-from-string)。