Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyネットワークプログラミング

Rubyでカスタムネットワーククライアントとサーバーを作成しますか?または、それがどのように機能するかを理解しますか?

次に、ソケットを処理する必要があります。

このルビーネットワークプログラミングのツアーに参加してください 基本を学び、Rubyを使用して他のサーバーやクライアントと会話を始めましょう!

では、ソケットとは何ですか ?

ソケットは通信チャネルのエンドポイントであり、クライアントとサーバーの両方がソケットを使用して通信します。

動作方法は非常にシンプルです

接続が確立されると、データをソケットに入れることができます。データはもう一方の端に送られ、そこで受信者はソケットから読み取り、着信データを処理します。

ソケットタイプ

使用できるソケットにはいくつかの種類がありますが、最も一般的なのはTCPソケットで、HTTPやFTPなどのTCPベースのサービスに接続できます。

UDPベースのプロトコルを使用する必要がある場合は、UDPソケットを使用できます。

他のタイプのソケットはもう少し難解です。Unixソケットを使用すると、完全なTCP接続のオーバーヘッドなしでUnixシステムでIPC(プロセス間通信)が可能になります。

Rubyでのソケットの使用

ソケットで何ができるかがわかったので、次はソケットの使用を開始します。

まず、プログラムにソケットライブラリを要求します:

require 'socket'

TCPソケットを作成するには、 TCPSocketを使用できます。 クラス、パラメータとして、宛先IPアドレスとポートが必要になります。

これにより、接続の確立が試みられます。接続を確立できない場合は、 Errno ::ECONNREFUSEDが表示されます。 エラー。

socket = TCPSocket.new('google.com', 80)

これで、ソケットを介してメッセージを送信できるようになります。相手が自分を理解できるようにするには、通信しているプロトコルに従う必要があります。

socket.write "GET / HTTP/1.1"
socket.write "\r\n\r\n"

使用するメソッドの多くは、TCPSocketの親クラスからのものです。 。

Rubyネットワークプログラミング

サーバーからの応答を読み取るには、recvメソッドを使用できます。

ソケットから読み取るバイト数をパラメータとして渡す必要があります:

puts socket.recv(100)

小さな問題があります。データが返されない可能性があり、アプリは何もしていないように見えます。

その理由は、読み取るのに十分なデータがない場合、プログラムが「ブロック」するためです。

これは、利用可能なデータがあるか、サーバーが接続を閉じるまで待機することを意味します 。

使用しているプロトコルに応じて、読み取るデータの量を増減することをお勧めします。

ブロッキングが問題になる場合は、IOクラスのreadpartialメソッドとread_nonblockメソッドを確認してください。

TCPサーバーの作成方法

サーバーを作ろう!プロセスはクライアントの作成に似ていますが、ソケットにバインドするように指示する必要があります インターフェイスに移動してから、聞く その上で、そして最後に受け入れる 着信接続。

TCPServerクラスはすでに最初の2つを実行しています。

ここに例があります

require 'socket'

socket = TCPServer.new('0.0.0.0', 8080)
client = socket.accept

puts "New client! #{client}"

client.write("Hello from server")
client.close

サンプルサーバーはポート8080でリッスンし、接続しているクライアントにメッセージを表示します。

1つのクライアントしか受け入れられないことに注意してください。 プログラムは終了します。

複数のクライアントを受け入れる

複数のクライアントを受け入れて応答できるようにするには、ループといくつかのスレッドが必要です。

require 'socket'

PORT   = 8081
socket = TCPServer.new('0.0.0.0', PORT)

def handle_connection(client)
  puts "New client! #{client}"

  client.write("Hello from server")
  client.close
end

puts "Listening on #{PORT}. Press CTRL+C to cancel."

loop do
  client = socket.accept

  Thread.new { handle_connection(client) }
end

これで、停止するまでリッスンし続ける新しいサーバーが起動するはずです。

これを次のレベルに引き上げ、RubyでWebサーバーを作成する方法を学びたい場合は、このブログ投稿を読んでください。

結論

TCPソケットとは何か、それらがどのように機能するか、TCPServerなどのRubyクラスをどのように使用できるかを学びました。 &TCPSocket インターネット上の他のマシンと対話できるRubyアプリケーションを作成します。

ルビーネットワークプログラミングで遊ぶのは楽しいです!

次に、クールなものを作成して全員と共有します コメントセクションで🙂

また、Rubyのスキルをさらに向上させたい場合は、私のニュースレターに参加することを忘れないでください!


  1. Rubyでの新しいプログラミング言語の構築:インタープリター

    Githubのフルソース Stoffleプログラミング言語の完全な実装は、GitHubで入手できます。バグを見つけたり質問がある場合は、遠慮なく問題を開いてください。 このブログ投稿では、完全にRubyで構築されたおもちゃのプログラミング言語であるStoffleのインタープリターの実装を開始します。このプロジェクトの詳細については、このシリーズの最初の部分をご覧ください。 これから作成するインタプリタは、一般にツリーウォークインタプリタと呼ばれます。このシリーズの前回の投稿では、トークンのフラットシーケンスをツリーデータ構造(抽象構文木、または略してAST)に変換するパーサーを構築しま

  2. Rubyでの関数型プログラミング(完全ガイド)

    関数型プログラミングについて聞いたばかりで、いくつか質問があるかもしれません。 いいね… 関数型プログラミングとは正確には何ですか? オブジェクト指向プログラミングと比較してどうですか? Rubyで関数型プログラミングを使用する必要がありますか? これらの質問に答えて、これがどのように機能するかをよりよく理解できるようにします。 関数型プログラミングとは これは単なる流行や派手な言葉ではなく、長い間存在していた実際のプログラミングパラダイムですが、最近人気を取り戻しています。 そして、このパラダイムの背後にある基本的な考え方は、あなたが思っているよりも理解しやすいです。 関数型