mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - TCP ソケット通信!

[ プログラミング ] [ Ruby ]

こんにちは。

よく Java の入門編でやるソケット通信を Ruby でやってみました。

非常に簡単な実装例です。

0. 前提条件

  • Linux Mint 17.1(64bit) での作業を想定。
  • Ruby 2.2.1-p85 での作業を想定。

1. Ruby スクリプト(サーバ側)の作成

以下のような(非常に)簡単なスクリプトを作成する。
(shebang ストリングは環境に合わせて変更すること。ちなみに、env を使用しても環境に依存することが多々あるため、当方は最初からフルパスで指定する方針)

socket_server.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#! /usr/local/bin/ruby
# coding: utf-8
#********************************************************
# Ruby script to test for socket connection.(Server-side)
#********************************************************
#
require 'socket'

# サーバ接続 OPEN
serv = TCPServer.new(20000)

loop do
  # ソケット OPEN (クライアントからの接続待ち)
  sock = serv.accept

  while str = sock.gets.chomp
    # クライアントから受信した文字列を出力
    puts "RECV : #{str}"

    # クライアントへ文字列返却
    sock.puts "SERVER received '#{str}' from CLIENT."
  end

  # ソケット CLOSE
  sock.close
end

2. 接続テスト(telnet 使用)

とりあえず、サーバ側 Ruby スクリプトが機能するかテストしてみる。

まず、コンソール上でサーバ側 Ruby スクリプトの起動。

1
$ ./socket_server.rb

そして、別コンソール上で telnet コマンドで接続後、対話してみる。

1
2
3
4
5
6
7
8
9
10
11
12
$ telnet localhost 20000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello!
SERVER received 'Hello!' from CLIENT.
Ruby!
SERVER received 'Ruby!' from CLIENT.
^]

telnet> quit
Connection closed.

このとき、サーバ側は以下のような出力がされる。

1
2
3
$ ./socket_server.rb
RECV : Hello!
RECV : Ruby!

終了は、 CTRL-] で Telnet のプロンプトに戻って quit を入力すればよい。サーバ側はソケットが切断されて終了する。

3. Ruby スクリプト(クライアント側)の作成

以下のような(非常に)簡単なスクリプトを作成する。

socket_client.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#! /usr/local/bin/ruby
# coding: utf-8
#********************************************************
# Ruby script to test for socket connection.(Client-side)
#********************************************************
#
require 'socket'

# サーバ接続 OPEN
sock = TCPSocket.open("localhost", 20000)

while line = $stdin.gets
  # ソケットに入力文字列を渡す
  sock.puts line
  sock.flush

  # サーバから返却された文字列を出力
  puts sock.gets
end

# ソケット CLOSE
sock.close

4. 接続テスト(クライアント側も Ruby スクリプト使用)

クライアント側も Ruby スクリプトにして正常に機能するかテストしてみる。

まず、コンソール上でサーバ側 Ruby スクリプトの起動。

1
$ ./socket_server.rb

そして、別コンソール上でクライアント側 Ruby スクリプトを起動後、対話してみる。

1
2
3
4
5
$ ./socket_client.rb
Hello!
SERVER received 'Hello!' from CLIENT.
Ruby!
SERVER received 'Ruby!' from CLIENT.

このとき、サーバ側は以下のような出力がされる。

1
2
3
./socket_server.rb
RECV : Hello!
RECV : Ruby!

終了は、クライアント側で CTRL-C すればよい。サーバ側はソケットが切断されて終了する。

5. 参考サイト


ふと、 Java でやったことのあることが Ruby でもできるのかと思い、試してみた次第です。

簡単でした。ソケットを使用したアプリを作成する際に役立ちそうです。

以上。

Comments