ソケットで会話しよう
ほかのプログラムと文字列をやり取りする【ソケット】モジュールを知りましょう。
【ソケット】モジュールは、ネットワークを通してほかのプログラムと文字列をやり取りします。【ファイル】と同じでブラウザでは使えず、Hanaランタイムで実行するときだけ使えます。このドキュメントの実行ボタンで持ってくると「『ソケット』モジュールはブラウザでは使えません。」というエラーになりますが、それが正常です。以下の例は、自分のコンピューターのHanaランタイムで.kndファイルを作って動かしてみてください。
ソケットは番号で扱います。接続したり待ち受けを始めたりするとソケット番号(数字)が返るので、それ以降はその番号を道具に渡します。
| 道具 | できること |
|---|---|
〈接続〉(アドレス, ポート) |
ほかのプログラムに接続してソケット番号を返します(3つ目の値で待つ最大時間(秒)を指定できます) |
〈待ち受け〉(ポート) |
接続の待ち受けを始めてソケット番号を返します(自分のコンピューターからだけ入れます。2つ目の値に「0.0.0.0」を渡すと、ほかのコンピューターからも入れます。ポート0は空いているポートを自動で選びます) |
〈受け入れ〉(待ち受けソケット) |
お客さんが来るまで待って、そのお客さんとのソケット番号を返します |
〈送信〉(ソケット, 文字列) |
文字列を送ります |
〈受信〉(ソケット, 最大文字数) |
届いた文字列を最大その数だけ返します。何もなければ届くまで待ち、相手が接続を切っていれば空の文字列です |
〈行受信〉(ソケット) |
1行を(改行を除いて)返します。相手が接続を切って残りがなければ空っぽです |
〈タイムアウト〉(ソケット, 秒) |
このソケットの待つ処理(受信、受け入れ、送信)が最大で何秒まで待つかを決めます(0なら最後まで待ちます) |
〈アドレス〉(ソケット) |
待ち受けソケットなら自分のアドレス、接続済みソケットなら相手のアドレスをアドレス:ポートの形で返します |
〈閉じる〉(ソケット) |
ソケットを閉じます |
文字列はUTF-8です。〈受信〉は、文字が半分に切れないように文字単位で返します。
サーバーに接続して話しかける
【ソケット】から〈接続〉と〈送信〉と〈行受信〉と〈閉じる〉を持ってこよう
『通路』を【数字】の〈接続〉(「127.0.0.1」, 9000)にしよう
〈送信〉(『通路』, 「こんにちは\n」)を実行しよう
〈行受信〉(『通路』)を出力しよう
〈閉じる〉(『通路』)を実行しよう
お客さんを受け入れるサーバーを作る
【ソケット】から〈待ち受け〉と〈受け入れ〉と〈行受信〉と〈送信〉と〈閉じる〉を持ってこよう
『サーバー』を【数字】の〈待ち受け〉(9000)にしよう
「お客さんを待っています...」を出力しよう
『お客さん』を【数字】の〈受け入れ〉(『サーバー』)にしよう
『受け取り』を【文字列】の〈行受信〉(『お客さん』)にしよう
〈送信〉(『お客さん』, 枠「こだま: {『受け取り』}\n」)を実行しよう
〈閉じる〉(『お客さん』)を実行しよう
〈閉じる〉(『サーバー』)を実行しよう
〈受け入れ〉は、お客さんが来るまで止まって待ちます。お客さんを何人も受け入れるには、繰り返そうの中で〈受け入れ〉を呼び、1人との会話が終わったら〈閉じる〉でそのソケットを閉じます。
待つ時間を決める
相手が何も言わないと、〈行受信〉や〈受信〉はいつまでも待ちます。〈タイムアウト〉を指定すると、その時間が過ぎたときにエラーになります。とりあえずやってみようで囲めば、時間切れの場合を処理できます。
【ソケット】から〈接続〉と〈タイムアウト〉と〈行受信〉を持ってこよう
『通路』を【数字】の〈接続〉(「127.0.0.1」, 9000)にしよう
〈タイムアウト〉(『通路』, 3)を実行しよう
とりあえずやってみよう:
〈行受信〉(『通路』)を出力しよう
発生したら:
「3秒以内に返事がありません。」を出力しよう
ネットワークアクセスを止める
Hanaランタイムは、標準でネットワークアクセスを許可します。信用できないスクリプトを動かすときは、実行時に--allow-net=falseオプションを付けて止められます。止めると【ソケット】と【HTTP】が「この実行ではネットワークアクセスが無効になっています。」というエラーを出します。