みなさんお久しぶりです。tukinyanです。結構な間、投稿が途切れていました。すいません。読んでる皆さんは、「まぁ結構な間書いていないから何かあったのだろう」と思っているかもしれません。 ええ、もちろん、何かあったに決まっています。
codeberg の利用規約改定により、公開が難しくなりました。申し訳ございません
本題
さて、前置きが長くなりましたが、今回は サイト開設と、公開 記念で、 TCP鯖 というものを作ってみましょう。 Rubihuru には、TCP鯖を操る TCPServer クラスのメソットが定義されています。
| 種類 | 説明 |
|---|---|
| read | 受信したリクエストを読み込む |
| write | 鯖側に書き込む |
| open(port) | portに指定された文字列番目のポートを待ち受け |
| accept | 鯖に接続する |
| close | 接続を切断 |
それでは、テキストの Hello World! を返すだけの TCP 鯖を書いてみましょう。
server = TCPServer.open("8080") # => TCP鯖を開設
while true
client = server.accept # => TCP鯖に接続する人を待ち受け
client.write("HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World!")
client.close
end
ただ、これだと、一人ずつしか接続することができません。こういう時は、Process クラスに定義されている fork() というメソットを使いましょう。( 正直言うと、 Thread より使い勝手がいいです。)
fork() は、今実行しているプロセス(=プログラム)を複製して fork() を呼び出した次の部分から実行を開始するものです。 Linux / Unix / MacOS などで動きますが、Windows は Unix 準拠ではないので、 使えません 。WSL などのシステムを使うことで使用可能です。
server = TCPServer.open("8080")
puts("Rubihuru Web Server listening with ear...")
active_forks = 0
while true
while active_forks >= 20
Process.wait
active_forks = active_forks - 1
end
client = server.accept
if Process.fork == 0
client.write("HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World!")
client.close
Process.exit(0)
else
client.close
active_forks = active_forks + 1
end
end
これで、20人が一気に接続しても対応することができるようになります。(※Rubihuru のリポジトリにこれと同じようなテストが載っていますので、試してみてください。)
fork() をしすぎると、メモリを圧迫して大変なことになります。最大20個くらいまでにしておきましょう。
終わりに
rubihuru を公開したので、皆さんの手で試すことができます。もしよければ公式ページなどを読んでくださるとうれしいです。それでは、さようなら。