Request / Response
Request / Response est la plus simple des combinaisons pour les socket NetMQ. Cela ne veut pas dire que RequestSocket/ResponseSocket
doivent toujours être utilisées ensembles, il y a d'autres combinaisons possibles. Mais c'est une pattern qui est souvent utilisée.
Vous pouvez trouver les différentes combinaisons de socket dans le guide ZeroMQ. Bien qu'il soit très simple de vous dire d'aller lire de la documentation ailleurs, la raison est qu'il n y a pas meilleur documentation que le guide.
Mais continuons sur les Request/Response...
Qu'est ce que Request/Response
La pattern Request / Response est la plus simple. Elle s'apparente à une requete web : vous faite une requete, vous recevez une réponse.
RequestSocket / ResponseSocket
sont synchrones, et donc bloquantes, vous génèrerez une exception si vous essayer de lire plus de message qu'il y en a.
La manière de travailler avec RequestSocket/ResponseSocket
est la suivante :
- Envoyez un message avec
RequestSocket
- Une
ResponseSocket
lit le message. - Cette même
ResponseSocket
envoi le message de réponse - La
RequestSocket
de l'étape 1 reçoie la réponse.
Voici un exemple ou les RequestSocket/ResponseSocket
sont dans un même processus, mais cela est facilement découpable en module client/serveur.
Exemple:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NetMQ;
namespace RequestResponse
{
class Program
{
static void Main(string[] args)
{
using (var context = NetMQContext.Create())
{
using (var responseSocket = context.CreateResponseSocket())
{
responseSocket.Bind("tcp://*:5555");
using (var requestSocket = context.CreateRequestSocket())
{
requestSocket.Connect("tcp://localhost:5555");
Console.WriteLine("requestSocket : Sending 'Hello'");
requestSocket.Send("Hello");
var message = responseSocket.ReceiveString();
Console.WriteLine("responseSocket : Server Received '{0}'", message);
Console.WriteLine("responseSocket Sending 'World'");
responseSocket.Send("World");
message = requestSocket.ReceiveString();
Console.WriteLine("requestSocket : Received '{0}'", message);
Console.ReadLine();
}
}
}
}
}
}
Si vous lancez le code vous devriez obtenir le résultat suivant :
Request/Response sont bloquante
Comme vu précedemment, RequestSocket/ResponseSocket
sont bloquantes, ce qui veut dire que des appels inattendus SendXXXX()
/ ReceiveXXXX()
vont générer des exceptions.
Dans cet exemple , nous appelons deux fois Send()
dans la RequestSocket
Dans cet exemple, nous appelons deux fois RecieveString()
mais il n y a eu qu'un message envoyé par RequestSocket
Il faut donc faire attention à la manière d'utiliser la pattern Request/Response.