2012-10-20 5 views
2

J'ai une application où je dois envoyer des signaux et des données entre deux entités. Quelle est la meilleure pratique et pourquoi?Utilisation efficace des sockets en Java

  1. ouvertes 4 prises, 2 pour les signaux dans les deux directions et 2 pour les données dans les deux sens
  2. ouvert deux prises chacune des données et des signaux
  3. Il suffit d'ouvrir une prise de courant et de filtrage des signaux et des données

Répondre

2

Tout d'abord, les sockets sont en duplex intégral, c'est-à-dire que vous n'avez pas besoin d'une prise séparée (connexion) pour l'envoi et la réception. Deuxièmement, il est difficile de dire sans entrer dans plus de détails. Cependant, en connaissant l'histoire de HTTP (une connexion pour les commandes/en-têtes et les données) et FTP (des connexions séparées pour les commandes et les données) semble que les concepteurs de HTTP ont fait un meilleur choix. Deux connexions sont plus de code à maintenir, aussi certains pare-feu n'aiment pas la suspension, la connexion de commande FTP inactive lorsque de grandes portions de données sont transférées. Donc, pour une connexion, il est facile de distinguer les signaux et les données (drapeau, en-tête, etc.). Le canal entrant et sortant est également complètement orthogonal.

+0

Merci pour votre réponse, le raisonnement HTTP/FTP est logique. –

0

Pourquoi ne pouvez-vous pas simplement avoir une prise pour toutes les données et une prise pour tous les signaux. Vous pouvez envoyer des signaux à l'entité distante en lisant les signaux de l'entité distante à partir de la même socket. C'est un peu comme le fonctionnement du FTP (non-passif), vous avez une connexion de contrôle et ensuite celle utilisée pour le transfert de données réel.

Avoir 4 prises semble trop puissant, mais je ne connais pas le contexte de ce que sont les signaux ou les données.

Si cela ne vous dérange pas plus de code pour décoder la communication réseau, vous pouvez certainement tout faire dans un seul socket. Il faudra plus de réflexion dans la communication actuelle, un meilleur "protocole" si vous voulez. Les modèles à 2 prises et à 1 prise sont parfaits.

0

Il existe une "voie intermédiaire" possible - utilisez JBoss à distance ou similaire à multiplexer plusieurs sockets virtuelles par-dessus une socket réelle. De cette façon, vous pouvez séparer les canaux de données et de contrôle au niveau de l'application, mais vous n'avez besoin que d'un seul port TCP (et donc au plus un trou de pare-feu) au niveau du système d'exploitation.

0

Une autre façon: utiliser un middleware dédié, construit pour realtime application like 0MQ.

Pour instancier omq:

Jzmq obj = new Jzmq (hostname); 

Où le nom d'hôte est le nom ou l'adresse IP de la boîte où zmq_server est en cours d'exécution.

Pour créer un câblage, les fonctions createExchange, createQueue et bind peuvent être utilisées. Pour une description détaillée du fonctionnement du mécanisme de câblage, cliquez ici.

int eid = obj.createExchange ("E", Jzmq.SCOPE_GLOBAL, "10.0.0.1:5555"); 
obj.createQueue ("Q", Jzmq.SCOPE_GLOBAL, "10.0.0.1:5556"); 
obj.bind ("E", "Q"); 

L'envoi d'un message est assez simple.Le message est fourni sous forme de tableau d'octets:

byte msg [] = {1, 2, 3, 4, 5, 6}; 
obj.send (eid, msg); 

Réception d'un message est encore plus simple:

byte [] msg = obj.receive(); 

Échantillon complet available here.