エーシーのブログ

備忘録中心の自己ブログ

【Ruby】TCPクライアント/サーバプログラム

本日の自己啓発。

rubyで簡単なTCPクライアント/サーバプログラムを書いてみた。

 

●tcp_client.rb

*******************************************

#!/usr/bin/ruby

 

require "socket"

 

# localhostの20000番へ接続

sock = TCPSocket.open("localhost", 20000)

 

if sock.closed?

  print("can not open TCPSocket")

  exit(1)

end

 

begin

  # サーバに文字列を送付

  # サーバ側の作りの問題だが、改行を含む文字列でないと処理が継続されない。

  sock.write("hello\n")

 

  # 相手からの文字列を出力

  print(sock.gets)

 

ensure # 例外が発生しても実行

  # ソケットを閉じる。

  sock.close

end

 

exit(0)

*******************************************

 

●tcp_server.rb

*******************************************

#!/usr/bin/ruby

 

require "socket"

 

# ポート番号20000番で開く。

server = TCPServer.open(20000)

 

# 処理中に例外が発生しても待ちうけソケットは必ず閉じる。

begin

  # 複数のクライアントからの接続を受け付けるため無限ループ

  loop {

      # クライアントからの接続を許可する。

      # クライアントからの同時接続にも対応できるようにスレッド化しておく。

      Thread.start(server.accept) { |sock|

        begin

          # クライアントからデータ表示する。

          puts(sock.gets)

          # クライアントに応答を返す。

          sock.puts("OK")

        ensure

          # 接続ソケットを閉じる。

          sock.close

        end

      }

  }

ensure

  # 待ちうけソケットを閉じる。

  server.close

end

 

*******************************************

実行結果

クライアント側ターミナル

$ ruby tcp_client.rb

OK

$ ruby tcp_client.rb

OK

$

 

サーバ側ターミナル

$ ruby tcp_server.rb

hello

hello

*******************************************

例外処理のキャッチがかなり甘い気がするが、まぁ動いたか良いか。