Ruby 資料一覧

ネットワーク

2007/11/7更新

対応バージョン: 1.8

簡単なTCPサーバを作成する

TCPServerクラスを使用する。

例) daytimeサーバのように現在日時を返す

require 'socket'

s_port = 8888                         # 待ち受けポート

s = TCPServer.new(s_port)             # サーバ側ソケット生成

loop {                                # 処理ループ
  c = s.accept                        # 接続受付

  Thread.start {                      # 入出力(スレッド内)
    c.print Time.now.strftime("%c")   # 現在日時出力 
    c.close                           # 接続終了
  }
}

簡単なHTTPクライアントを作成する

HTTPクライアントを作成するには'net/http'を使うと便利だが、'socket'を使うことで、より汎用的なTCP/IPクライアントが作成できる。

require 'socket'

s = TCPSocket.new("foo.bar.com", 80)  # ソケットを開く

s.print "GET / HTTP/1.0\r\n\r\n"      # ソケットにGETリクエスト送信

print s.read                          # ソケットからメッセージを読み込み出力

s.close                               # ソケットを閉じる

Proxy経由でHTTPリクエストを送信する

Net::HTTP::Proxyを使用して以下のようにする。

require 'net/http'

to_host = "foo.bar.com"
req = "/index.html"

Net::HTTP::Proxy(proxy_host,proxy_port).start(to_host) {|http|
  response = http.get(req)
  print response.body
}

proxy_hostがnilの場合はNet::HTTPそのものを返すのでProxy環境以外でも正常に動作する。

例えばproxy_host,proxy_portを環境変数HTTP_PROXY等から取得するようにしておけば、Proxy有/無のどちらの環境でも同一ソースで動作する。

トラックバックを送信する

トラックバック送信は送信元データに関する以下の情報をHTTPのPOSTメソッドに載せて送信先URLに送ることで可能となる。

title

記事タイトル

excerpt

記事要約

url

記事URL

blog_name

ブログタイトル

以下にRubyによりトラックバック送信機能の実装例を示す。

require 'net/http'
require 'cgi'

#
# パラメータ設定
#
title   = "XXXについて"                 # 記事タイトル
excerpt = "XXXは本来こういうもので..."  # 記事要約
url     = "http://www.from.net/item/12" # 記事URL
name    = "Myブログ"                    # ブログタイトル

to_host = "www.to.net"                  # 送信先ホスト
to_path = "/recv.cgi/45"                # 送信先パス

#
# トラックバック送信
#
req = "title=#{title}&" \               # 送信パラメータ生成
    + "excerpt=#{excerpt}&" \
    + "url=#{url}&" \
    + "blog_name=#{name}"

req = CGI.escape(req)                   # URLエンコード

Net::HTTP.start(to_host) {|http|        # トラックバック送信
  response = http.post(to_path, req)
}

英文メールを送信する

英文メールを送信するには'net/smtp'を使うと便利である。

require 'net/smtp'
require 'time'

#
# 各種設定
#
smtp_server = "<SMTPサーバ>"
helo_domain = "<HELOドメイン>"
from_addr   = "<Fromアドレス>"
to_addr     = "<Toアドレス>"
subject     = "<件名>"
date        = Time.now.rfc2822
msg_id      = "<メッセージID>"
msg         = "<本文>"

#
# メールデータ作成
#
mail_data = <<EOD
From: #{from_addr}
To: #{to_addr}
Subject: #{subject}
Date: #{date}
Message-Id: #{msg_id}

#{msg}
EOD

#
# メール送信
#
Net::SMTP.start(smtp_server, 25, helo_domain) {|smtp|
  smtp.send_mail mail_data, from_addr, to_addr
}