Ruby は、ネットワークへの 2 つのレベルのアクセスを提供します。最下位レベルではオペレーティング システムにアクセスでき、これにより、コネクション型プロトコルとコネクションレス型プロトコルの基本的なソケット サポートを備えたクライアントとサーバーを実装できます。
Ruby は、FTP、HTTP などのアプリケーション ネットワーク プロトコルを均一にサポートします。
それが高レベルであろうと低レベルであろうと。 Ruby は、ネットワーク層に固執することなく、TCP、UDP、SOCKS、およびその他の多くのプロトコルを使用して対話できるようにするいくつかの基本クラスを提供します。これらのクラスは、サーバーへの読み取りと書き込みを簡単に行うためのヘルパー クラスも提供します。
次に、Ruby Socket のプログラミング方法を学びましょう
ソケットとは何ですか
アプリケーション層がトランスポート層を介してデータを通信するとき、TCP と UDP は複数のアプリケーション プロセスに並行サービスを同時に提供するという問題に遭遇します。複数の TCP 接続または複数のアプリケーション プロセスは、同じ TCP プロトコル ポートを介してデータを送信する必要がある場合があります。さまざまなアプリケーション プロセスと接続を区別するために、多くのコンピュータ オペレーティング システムは、アプリケーションと TCP/IP プロトコル間の対話用にソケットと呼ばれるインターフェイスを提供し、さまざまなアプリケーション プロセス間のネットワーク通信と接続を区別します。
3 つの主なパラメータを使用してソケットを生成します: 通信の宛先 IP アドレス、使用されるトランスポート層プロトコル (TCP または UDP)、および使用されるポート番号。ソケットの本来の意味は「ソケット」です。これら 3 つのパラメータを組み合わせて「ソケット」ソケットにバインドすることにより、アプリケーション層はソケット インターフェイスを介してトランスポート層と通信し、さまざまなアプリケーション プロセスまたはネットワーク接続からの通信を区別し、データ送信のための同時サービスを実装できます。
ソケット語彙分析:
オプション | 説明 |
---|
domain | は、使用されるプロトコル ファミリ (通常は PF_INET、PF_UNIX、PF_X25 など) を示します。 |
type | ソケットのタイプを指定します: SOCK_STREAM または SOCK_DGRAM。Socket インターフェイスは元のソケット (SOCK_RAW) も定義し、プログラムが低レベル プロトコル |
protocol | の値を使用できるようにします。 0. |
ホスト名 | ネットワークインターフェースの識別子: - 文字列、ホスト名またはIPアドレスにすることができます。
- 文字列「<broadcast>」は、INADDR_BROADCASTアドレスを指定します。
- 0 の長さの文字列。INADDR_ANY
- を指定します。ホストのバイトオーダーでバイナリアドレスとして解釈される整数です。
|
port | port は、クライアント接続用に 1 つ以上のポート番号をリッスンするポート番号です。ポート番号には、サーバー名とポートが含まれます。 。 |
単純なクライアント
以下では、指定されたホストとポートを使用して単純なクライアント インスタンスを作成します。Ruby TCPSocket クラスは、ソケットを開くための open メソッドを提供します。
TCPSocket.open(ホスト名, ポート) TCP 接続を開きます。
ソケット接続を開いたら、IO オブジェクトのようにそれを読み取ることができ、完了したら、ファイルのように接続を閉じる必要があります。
次の例は、指定されたホストに接続し、ソケットからデータを読み取り、最後にソケットを閉じる方法を示しています:
require 'socket' # Sockets 是标准库
hostname = 'localhost'
port = 2000
s = TCPSocket.open(hostname, port)
while line = s.gets # 从 socket 中读取每行数据
puts line.chop # 打印到终端
end
s.close # 关闭 socket
単純なサービス
Ruby の TCPServer クラスを使用して、単純なサービスを作成できます。 TCPServer オブジェクトは、TCPSocket のファクトリ オブジェクトです。
ここで、TCPServer.open(hostname, port) を使用して TCPServer オブジェクトを作成します。
次に、TCPServer の accept メソッドを呼び出します。このメソッドは、クライアントが指定されたポートに接続するまで待機し、クライアントに接続を示す TCPSocket オブジェクトを返します。
require 'socket' # 获取socket标准库
server = TCPServer.open(2000) # Socket 监听端口为 2000
loop { # 永久运行服务
client = server.accept # 等待客户端连接
client.puts(Time.now.ctime) # 发送时间到客户端
client.puts "Closing the connection. Bye!"
client.close # 关闭客户端连接
}
次に、サーバー上で上記のコードを実行して、効果を確認してください。
マルチクライアント TCP サービス
インターネットでは、ほとんどのサービスで多数のクライアント接続が行われます。
Ruby の Thread クラスを使用すると、メインスレッドが追加の接続を待機している間に 1 つのスレッドがクライアント接続を実行するマルチスレッド サービスを簡単に作成できます。
require 'socket' # 获取socket标准库
server = TCPServer.open(2000) # Socket 监听端口为 2000
loop { # 永久运行服务
Thread.start(server.accept) do |client|
client.puts(Time.now.ctime) # 发送时间到客户端
client.puts "Closing the connection. Bye!"
client.close # 关闭客户端连接
end
}
この例では、ソケットは永久に実行され、server.accept がクライアントから接続を受け取ると、新しいスレッドが作成され、すぐにリクエストの処理を開始します。メイン プログラムはすぐにループバックし、新しい接続を待ちます。
小さな Web ブラウザ
ソケット ライブラリを使用して、任意のインターネット プロトコルを実装できます。次のコードは、Web ページのコンテンツを取得する方法を示しています:
require 'socket'
host = 'www.w3cschool.cc' # web服务器
port = 80 # 默认 HTTP 端口
path = "/index.htm" # 想要获取的文件地址
# 这是个 HTTP 请求
request = "GET #{path} HTTP/1.0\r\n\r\n"
socket = TCPSocket.open(host,port) # 连接服务器
socket.print(request) # 发送请求
response = socket.read # 读取完整的响应
# Split response at first blank line into headers and body
headers,body = response.split("\r\n\r\n", 2)
print body # 输出结果
Web のようなクライアントを実装するには、Net::HTTP などの HTTP 用の事前に構築されたライブラリを使用できます。
次のコードは前のコードと同等です:
require 'net/http' # 我们需要的库
host = 'www.w3cschool.cc' # 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 ソケット ライブラリとクラス メソッド」を参照してください。