A un livello elevato, questa è la mia comprensione della differenza tra un client e un server:
- un server ascolta su un host e una porta, riceve richieste (ad esempio attraverso una connessione socket), quindi invia una risposta al client che ha avviato la connessione socket.
- Il client è ciò che invia una richiesta al socket di quel server e attende una risposta.
La definizione è un po 'ampia e vaga. Ecco due situazioni in cui entrambi i client si iscrivono alla definizione di cui sopra, ma si comportano in modo diverso:
1) Nel primo esempio, il programma presuppone che un socket server sia in ascolto sulla porta 2000. Questo client effettua una connessione TCP al socket server, attende la risposta, quindi stampa la risposta allo stdout del processo attualmente in esecuzione e chiude connessione. Di per sé non scrive nulla sul server:
require 'socket'
host, port = ARGV
s = TCPSocket.open(host, port)
while line = s.gets
puts "the data is #{line.chop}"
end
s.close
Il socket server parla per accettare le connessioni TCP sulla porta 2000. Una volta stabilita una connessione, invia i dati al client, quindi chiude il socket terminando quindi la connessione con il client:
require 'socket'
server = TCPServer.open(2000)
loop {
client = server.accept
client.puts(Time.now.ctime)
client.close
}
Ok, quindi il programma client nell'esempio precedente si abbona alla definizione originale delineata per il client.
Ma nel prossimo esempio, il client si comporta diversamente. I client stabiliscono una connessione TCP ad un'istanza in esecuzione di un server socket redis. Il client crea una connessione socket TCP su redis-server sulla porta 6379 (la porta redis predefinita), oltre a stabilire il nuovo protocollo di richiesta unificato (specifica del protocollo redis) - consentendo alla connessione di comunicare utilizzando il messaging in formato specifico redis (es. Multi-bulk risposte). Proprio come l'altro client, questo client invia una richiesta al socket del server per una connessione TCP e attende una risposta.
Tuttavia, a differenza dell'altro esempio, questo client scrive i dati sul server. Redis implementa il paradigma di messaggistica di pubblicazione / sottoscrizione. Il client viene pubblicato su un canale che è memorizzato nell'archivio chiavi / valori sulla memoria principale supportata da redis. Quindi questo client si comporta in modo significativamente diverso dall'altro in quanto non aspetta semplicemente un qualche tipo di risposta, scrive sul server e fa sì che il server faccia cose, come spingere i dati ai client sottoscritti.
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
Quindi mi chiedo se qualcuno potrebbe darmi una definizione più completa di client e server.