English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby ソケットプログラミング

Rubyは、ネットワークアクセスを2つのレベルで提供しており、基本的なセットコネクションとディーコネクションプロトコルのサポートを実現するためのクライアントとサーバーの両方を提供するオペレーティングシステムにアクセスできます。

Rubyは、FTP、HTTPなどのアプリケーションプロトコルを統一してサポートしています。

レベルに関わらず、高層的または低層的。RubyはTCP、UDP、SOCKSなどの多くのプロトコルを使用してインタラクションを行うための基本的なクラスを提供しており、ネットワークレベルに拘束せずに使用できます。これらのクラスは、サーバーに対して読み書きを行うことができる補助クラスも提供しています。

次に、Ruby Socket プログラミングの方法を学びましょう

Sockets とは何か

アプリケーションレベルがトランスポートレベルを通じてデータ通信を行う際、TCPとUDPは同時に複数のアプリケーションプロセスに対して並行サービスを提供する問題に直面します。複数のTCP接続や複数のアプリケーションプロセスが同じTCPプロトコルポートを通じてデータを転送する必要がある場合があります。異なるアプリケーションプロセスや接続を区別するために、多くのコンピュータオペレーティングシステムは、アプリケーションとTCP/IPプロトコルとのインタラクションに「ソケット」と呼ばれるインターフェースを提供し、異なるアプリケーションプロセス間のネットワーク通信と接続を区別します。

ソケットを生成する主な方法は、3これらのパラメータ:通信先の IP アドレス、使用するトランスポートレベルプロトコル(TCPまたはUDP)および使用するポート番号。3これらのパラメータを組み合わせて、"プラグ"としてのソケットにバインドし、アプリケーションレベルがトランスポートレベルを通じてソケットインターフェースを通じて異なるアプリケーションプロセスやネットワーク接続からの通信を区別し、データの並行サービスを実現できます。

Sockets 词汇解析:

オプション説明
ドメイン使用するプロトコル族を指定します。通常は PF_INET、PF_UNIX、PF_X です。25など。
タイプソケットのタイプを指定します:SOCK_STREAM または SOCK_DGRAM、ソケットインターフェースは原始ソケット(SOCK_RAW)も定義しており、プログラムが低層プロトコルを使用できるようにします。
プロトコル通常0に割り当てられます。
ホスト名ネットワークインターフェースの識別子:
  • 文字列で、ホスト名または IP アドレスができます。

  • 文字列 "<broadcast>" で、INADDR_BROADCAST アドレスを指定します。

  • 0 長さの文字列で、INADDR_ANYを指定します。

  • 整数で、ホストバイトオーダーのバイナリアドレスを意味します。

ポートポートはポート番号で、各サーバーは1つまたは複数のポート番号をクライアントの接続を監視します。ポート番号は Fixnum のポート番号で、サーバー名とポートを含んでいます。

簡単なクライアント

以下、指定のホストとポートを使用して簡単なクライアントサンプルを書きました。Ruby TCPSocket クラスは open メソッドを提供してソケットを開くことができます。

TCPSocket.open(hosname, port) は TCP 接続を開きます。

ソケット接続を開けると、IOオブジェクトのように読み取ることができます。完了したら、ファイルを閉じるように接続を閉じる必要があります。

以下の例では、指定されたホストに接続し、ソケットからデータを読み取る方法、最後にソケットを閉じる方法を示します:

オンラインサンプル

require 'socket' # Sockets は標準ライブラリ
 
hostname = 'localhost'
port = 2000
 
s = TCPSocket.open(hostname, port)
 
while line = s.gets # ソケットから各行データを読み取る
  puts line.chop # 端末に打印
end
s.close # ソケットを閉じる

簡単なサービス

Rubyでは TCPServer クラスを使用して簡単なサービスを作成できます。TCPServer オブジェクトは TCPSocket のファクトリオブジェクトです。

今、TCPServer.open(hostname, port) を使用して TCPServer オブジェクトを作成します。

次に TCPServer の accept メソッドを呼び出します。このメソッドは、指定されたポートにクライアントが接続するまで待ち受け、そのクライアントを表す TCPSocket オブジェクトを返します。

オンラインサンプル

require 'socket' # ソケット標準ライブラリを取得
 
server = TCPServer.open(2000) # ソケットのリスニングポートは 2000
loop {} # サービスを永遠に実行
  client = server.accept # クライアント接続を待ち受け
  client.puts(Time.now.ctime) # 時間をクライアントに送信
  client.puts "接続を閉じます。拜啓!"
  client.close # クライアント接続を閉じる
}

今、上記のコードをサーバー上で実行し、効果を確認してください。

マルチクライアントTCPサービス

インターネット上では、多くのサービスが大量のクライアント接続を持っています。

RubyのThreadクラスは、簡単にマルチスレッドサービスを作成できます。一つのスレッドがクライアントの接続を実行し、メインスレッドがさらに接続を待機します。

オンラインサンプル

require 'socket' # ソケット標準ライブラリを取得
 
server = TCPServer.open(2000)   # Socketのリスニングポート 2000
loop {                          # 永続的に運行するサービス
  Thread.start(server.accept) do |client|
    client.puts(Time.now.ctime) # 時間をクライアントに送信
    client.puts "接続を閉じます。拜啓!"
    client.close               # クライアント接続を閉じる
  end
}

この例では、socketは恒久的に実行され、server.acceptがクライアントの接続を受け取ると、新しいスレッドが作成され、即座にリクエストを処理し始めます。その後、メインプログラムはループに戻り、新しい接続を待ちます。

ミニウェブブラウザ

socketライブラリを使用して、どのようなインターネットプロトコルでも実現できます。以下のコードは、ウェブページの内容を取得する方法を示しています:

オンラインサンプル

require 'socket'
 
host = 'ja.oldtoolbag.com'     # ウェブサーバー
port = 80                           # デフォルトのHTTPポート
path = "/index.htm"                 # 取得したいファイルのURL
 
# これはHTTPリクエストです
request = "GET #{path} HTTP/1.0\r\n\r\n"
 
socket = TCPSocket.open(host,port)  # サーバーに接続
socket.print(request)               # リクエストを送信
response = socket.read              # 完全なレスポンスを読み込む
# responseを最初の空白行で分割し、ヘッダとボディに分ける
headers,body = response.split("\r\n\r\n", 2) 
print body                          # 出力結果

ウェブクライアントを実現するには、Net::HTTPなどのHTTPを事前に構築したライブラリを使用できます。

以下のコードは前のコードと等価です:

オンラインサンプル

require 'net/http'                  # 必要なライブラリ
host = 'ja.oldtoolbag.com'           # Web サーバー
path = '"/index.htm'                 # 望むファイル 
 
http = Net::HTTP.new(host)          # 接続の作成
headers, body = http.get(path)      # ファイルのリクエスト
if headers.code == "200"            # ステータスコードの検出
  print body                        
else                                
  puts "#{headers.code} #{headers.message}" 
end

以上で、Ruby 中のソケットの使用法について簡単に紹介しました。詳細なドキュメントは以下を参照してください:Ruby ソケット ライブラリとクラスメソッド