Latest web development tutorials

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

Rubyはネットワークサービスへのアクセスの2種類のレベルがあり、あなたは基礎となるオペレーティング・システムにアクセスすることができ、それはあなたが基本的なソケット接続指向とコネクションレス型プロトコルのために、クライアントとサーバーのサポートを実現することができます。

このようなFTP、HTTPなどのRubyの統合アプリケーション・サポート・ネットワーク・プロトコル、。

上部または下部かどうか。 あなたはネットワーク層で手続きなしでインタラクティブなTCP、UDP、SOCKS、および他の多くのプロトコルを使用することができるようにルビーは、いくつかの基本的なクラスを提供します。 これらのクラスはまた、補習授業を提供するので、あなたは簡単に読み取りおよびサーバーに書き込むことができます。

次に、私たちはどのようにRubyのソケットプログラミングを学習させます


ソケットは何ですか

時トランスポート層、TCPと複数の同時アプリケーションプロセスの問題のためにサービスを提供しながら、UDP経験を通してアプリケーション層データ通信。 同じプロセスを介して複数のTCP接続または複数のアプリケーションがデータを転送するためにTCPプロトコルのポートを必要とし得ます。 異なるアプリケーションプロセス、および接続を区別するために、多くのコンピュータのオペレーティングシステムは、アプリケーションのTCP IP /プロトコルと相互作用し、ソケット(ソケット)に対する異なるアプリケーションプロセス間のネットワーク通信との接続の区別と呼ばれるインタフェースを提供します。

トラフィックの宛先IPアドレス、トランスポート層プロトコル(TCPまたはUDP)を使用し、ポート番号:ソケットを生成し、三つの主要なパラメータがあります。 ソケットに意図されている「ソケット」。 これらの3つのパラメータと「ソケット」ソケットのバインドを組み合わせることにより、アプリケーション層およびトランスポート層は、ソケットインタフェース、別のアプリケーションまたはネットワーク接続、同時データ送信サービスから通信処理の区別を介し得ます。

ソケットの語彙分析:

オプション 説明
ドメイン 指定されたプロトコルファミリは、というように、通常PF_INET、PF_UNIX、PF_X25、そして、使用されています。
タイプ ソケットインタフェースは、プログラムが低レベルのプロトコルの使用を可能にする、生ソケット(SOCK_RAW)を定義し、SOCK_STREAMまたはSOCK_DGRAM:ソケットのタイプを指定します
プロトコル 通常は0を割り当て。
ホスト名 ネットワークインタフェース識別子:
  • 文字列は、ホスト名またはIPアドレスを指定できます
  • "<放送>"という文字列は、INADDR_BROADCASTアドレスを指定します。
  • INADDR_ANYを指定する長さゼロの文字列
  • 整数は、バイナリアドレスのホストバイトオーダーと解釈します。
ポート portはポート番号、および各サーバがクライアント接続のための1つまたは複数のポート番号をリッスンし、ポート番号がFixnumかのポート番号を指定でき、それは、サーバー名とポートが含まれています。

単純なクライアント

指定されたホストとポートを介して、我々は単純なクライアントのインスタンスを記述するために、次の、ルビーTCPSocketオープンクラスはsockeを開くための方法を提供します。

TCPSocket.open(hosname、ポート)の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のオブジェクトを作成するためにTCPServer.open(ホスト名、ポート)を使用します。

この方法を受け入れるtcpserverの次の呼び出しは、クライアントが指定したポートに接続するまで待機し、クライアントへの接続を表す1 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クラスは、簡単に、マルチスレッドクライアント接続のための実行スレッドを作成することができ、メインスレッドが複数の接続を待っています。

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ブラウザ

我々は、任意のインターネット・プロトコルを実装するためのソケットライブラリを使用することができます。 次のコードは、ページのコンテンツを取得する方法を示しています。

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クライアントを実現するには、このようなネット:: 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ライブラリとSocketクラスのメソッド