カナデKanade

ソケットで会話しよう

ほかのプログラムと文字列をやり取りする【ソケット】モジュールを知りましょう。

【ソケット】モジュールは、ネットワークを通してほかのプログラムと文字列をやり取りします。【ファイル】と同じでブラウザでは使えず、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】が「この実行ではネットワークアクセスが無効になっています。」というエラーを出します。

プレイグラウンド
結果
コードを書いて「実行」ボタンを押してください。