1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rubihuru で簡易的なTCP鯖を作ってみよう

1
Last updated at Posted at 2026-07-20

 みなさんお久しぶりです。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 を公開したので、皆さんの手で試すことができます。もしよければ公式ページなどを読んでくださるとうれしいです。それでは、さようなら。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?