Question

J'ai une application. qui se compose de « gestionnaire » et « travailleur ». À l'heure actuelle, le travailleur est toujours initié la connexion, dit quelque chose au gestionnaire, et le gestionnaire envoie la réponse.

Comme il y a beaucoup de communication entre le gestionnaire et le travailleur, j'envisage d'avoir une prise ouverte entre les deux et faire la communication. Je suis aussi l'espoir d'initier l'interaction des deux côtés - permettant au gestionnaire de dire quelque chose au travailleur chaque fois qu'il veut.

Cependant, je suis un peu confus quant à la façon de traiter les « collisions ». Dites, le directeur décide de dire quelque chose au travailleur, et en même temps le travailleur décide de dire quelque chose au gestionnaire. Qu'est-ce qui va se passer? Comment cette situation est traitée?

P.S. Je prévois d'utiliser Netty pour la mise en œuvre effective.

Était-ce utile?

La solution

« Je suis aussi l'espoir d'initier l'interaction des deux côtés -., Permettant au gestionnaire de dire quelque chose au travailleur quand il le veut »

La réponse est simple. Ne pas.

Apprendre des protocoles existants: Avoir un client et un serveur. Les choses vont bien travailler. Travailleur peut être le serveur et le gestionnaire peut être un client. Manager peut faire de nombreuses demandes. Travailleurs répond aux demandes qu'ils arrivent.

Peer-to-peer peut être complexe sans valeur réelle de la complexité.

Autres conseils

Je passer pour un canal bidirectionnel persistant entre le serveur et le client.

Si tout ce que vous aurez est un serveur et un client, alors il n'y a pas de problème de collision ... Si le serveur accepte une connexion, il sait que c'est le client et vice versa. Les deux peuvent lire et écrire sur le même socket.

Maintenant, si vous avez plusieurs clients et vos besoins de serveur pour envoyer une demande spécifique au client X, alors vous avez besoin handshake

Lorsqu'un client démarre, il se connecte au serveur. Une fois que cette connexion est établie, le client lui-même identifie comme étant le client X (le message d'établissement de liaison). Le serveur sait maintenant qu'il a un socket ouvert au client X et chaque fois qu'il a besoin d'envoyer un message au client X, il réutilise socket.

Quelle chance, je viens d'écrire un tutoriel (exemple de projet inclus) sur ce problème précis. En utilisant Netty! :)

Voici le lien: http: // bruno. linker45.eu/2010/07/15/handshaking-tutorial-with-netty/

Notez que dans cette solution, le serveur ne pas tenter de se connecter au client. Il est toujours le client qui se connecte au serveur. Si vous songez à une socket chaque fois que vous voulez envoyer un message, vous devez reconsidérer les connexions persistantes car elles évitent les frais généraux d'établissement de connexion, accélérant par conséquent le taux de transfert de données N fois.

Je pense que vous devez lire sur les sockets ....

Vous ne recevez pas vraiment ce genre de problèmes .... autres que la façon de traiter à la fois réactive et d'origine, généralement cela se fait par enfiler vos communications ... en fonction de l'application, vous pouvez prendre un certain nombre d'approches à ce sujet.

Le lien correct pour le tutoriel Handshake / Netty mentionné dans la réponse de brunodecarvalho est http://bruno.factor45.org/blag/2010/07/15/handshaking-tutorial-with-netty/
Je voudrais ajouter ceci comme commentaire à sa question, mais je n'ai pas la réputation minimum requis pour le faire.

Si vous vous sentez comme réinventer la roue et ne veulent pas utiliser le middleware ...

Concevez votre protocole afin que l'autre les réponses des pairs à vos demandes sont toujours faciles à distinguer des demandes de l'autre par les pairs. Ensuite, choisissez votre stratégie d'E / S réseau avec soin. Quel que soit le code est responsable de la lecture de la prise doit d'abord déterminer si les données entrantes est une réponse aux données qui ont été envoyés, ou si elle est une nouvelle demande du pair (regardant l'en-tête des données, et si vous avez émis une demande récemment). En outre, vous devez maintenir une bonne file d'attente de sorte que lorsque vous envoyez des réponses aux demandes des pairs, il est correctement séparé de nouvelles demandes que vous émettez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top