English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Rubyは、ネットワークアクセスを2つのレベルで提供しており、基本的なセットコネクションとディーコネクションプロトコルのサポートを実現するためのクライアントとサーバーの両方を提供するオペレーティングシステムにアクセスできます。
Rubyは、FTP、HTTPなどのアプリケーションプロトコルを統一してサポートしています。
レベルに関わらず、高層的または低層的。RubyはTCP、UDP、SOCKSなどの多くのプロトコルを使用してインタラクションを行うための基本的なクラスを提供しており、ネットワークレベルに拘束せずに使用できます。これらのクラスは、サーバーに対して読み書きを行うことができる補助クラスも提供しています。
次に、Ruby Socket プログラミングの方法を学びましょう
アプリケーションレベルがトランスポートレベルを通じてデータ通信を行う際、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に割り当てられます。 |
ホスト名 | ネットワークインターフェースの識別子:
|
ポート | ポートはポート番号で、各サーバーは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 # クライアント接続を閉じる }
今、上記のコードをサーバー上で実行し、効果を確認してください。
インターネット上では、多くのサービスが大量のクライアント接続を持っています。
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 ソケット ライブラリとクラスメソッド