高レベルでは、これはクライアントとサーバーの違いについての私の理解です:
定義は少し広くあいまいです。次の2つの状況では、両方のクライアントが上記の定義にサブスクライブしますが、動作が異なります。
1)最初の例では、プログラムはソケットサーバーがポート2000でリッスンしていると想定します。このクライアントはソケットサーバーへのtcp接続を作成し、応答を待ってから、現在実行中のプロセスのstdoutに応答を出力し、接続を閉じます。それ自体はサーバーに何も書き込みません:
require 'socket'
Host, port = ARGV
s = TCPSocket.open(Host, port)
while line = s.gets
puts "the data is #{line.chop}"
end
s.close
通信するソケットサーバーは、ポート2000でのtcp接続を受け入れます。接続が確立されると、クライアントにデータを送信し、ソケットを閉じて、クライアントとの接続を終了します。
require 'socket'
server = TCPServer.open(2000)
loop {
client = server.accept
client.puts(Time.now.ctime)
client.close
}
上記の例のクライアントプログラムは、クライアント用に記述された元の定義にサブスクライブします。
ただし、次の例では、クライアントの動作が異なります。クライアントは、redisソケットサーバーの実行中のインスタンスへのtcp接続を確立します。クライアントはTCPポート6379(デフォルトのredisポート)でredis-serverへのソケット接続を作成し、さらに新しい統合リクエストプロトコル(redisプロトコル仕様)を確立します-接続がredisを使用して通信できるようにします固有のフォーマットのメッセージング(例:一括返信)他のクライアントと同様に、このクライアントはtcp接続の要求をサーバーソケットに送信し、応答を待ちます。
ただし、他の例とは異なり、このクライアントはサーバーにデータを書き込みます。 Redisは、パブリッシュ/サブスクライブメッセージングパラダイムを実装しています。クライアントは、redisがサポートするメインメモリのキー/値ストアに格納されているチャネルにパブリッシュします。したがって、このクライアントは、ある種の応答を単に待つのではなく、サーバーに書き込み、サーバーがサブスクライブしたクライアントにデータをプッシュするなどの処理を実行するという点で、他のクライアントとは大きく異なります。
require 'rubygems'
require 'redis'
require 'json'
redis = Redis.new
data = {"user" => ARGV[1]}
loop do
msg = STDIN.gets
output = redis.publish ARGV[0], data.merge('msg' => msg.strip).to_json
puts "What output we get #{output}"
end
だから誰かがクライアントとサーバーのより包括的な定義を私に与えることができるかどうか疑問に思っています。
クライアントとサーバーは、基本的に分散コンピューティングモデルの2つの部分です。
このモデルでは、ユーザーはサーバーにリクエストを送信するクライアントコンピューターを使用します。次にサーバーは要求を処理し、適切な応答を作成してクライアントに送り返します。このモデルでは、多くの場合、サーバーではなくクライアントが対話を開始します。サーバーは、リクエストが処理されるのを待つだけです。
上記の2つの例では、
したがって、2番目の例では、応答を送信します。
それが役に立ったかどうか私に知らせてください。
サーバーは、1つ以上のクライアントまたは他のサーバーにサービスを提供するための専用の計算ユニットです。
クライアントは、1つ以上のサーバーまたは他のクライアントにサービスを要求します。
サーバーは、他のサーバーからのサービスを要求するクライアントとして機能できます。