Comment puis-je m'assurer que le RMI utilise uniquement un ensemble de ports?
Dans notre application, nous utilisons RMI de communication client-serveur de façons très différentes:
- Poussant des données du serveur vers le client à être affichée.
- L'envoi d'informations de contrôle du client vers le serveur.
- Des rappels à partir de ces messages de contrôle chemins de code et ce, à partir du serveur vers le client (encadré note: ceci est un effet secondaire d'un code existant et n'est pas dans notre intention).
Ce que nous aimerions faire est de vous assurer que tous nos RMI liées au code de la seule connue spécifié inventaire des ports. Cela inclut le registre de port (communément devrait être 1099), le port du serveur et tout les ports résultant de l'rappels.
Voici ce que nous savons déjà:
- LocateRegistry.getRegistry(1099) ou à retrouver.createRegistry(1099) permettra de s'assurer que le registre est à l'écoute sur 1099.
- À l'aide de la UnicastRemoteObject constructeur /exportObject méthode statique avec un port à l'argument de spécifier le port du serveur.
Ces points sont également couverts dans ce Soleil post sur le forum.
Ce que nous ne savons pas, c'est: comment pouvons-nous nous assurer que le client de connexion vers le serveur résultant de l'rappels ne se connecter sur un port spécifié plutôt que par défaut un port anonyme?
EDIT: Ajout d'un longuets répondre résumé de mes conclusions et comment nous avons résolu le problème. J'espère que cela va aider quelqu'un d'autre avec des problèmes similaires.
DEUXIÈME EDIT: Il s'avère que dans mon application, il semble y avoir une condition de concurrence dans la création et la modification de la prise des usines. J'ai eu envie de permettre à l'utilisateur de remplacer mes paramètres par défaut dans un script Beanshell. Malheureusement, il semble que mon script est exécuté de façon significative après la première prise est créé par l'usine. En conséquence, je suis un mélange de ports à partir de l'ensemble de valeurs par défaut et les paramètres de l'utilisateur. Plus les travaux seront tenus hors de la portée de cette question, mais je pensais point comme un point d'intérêt pour les autres personnes qui pourraient avoir de la bande de roulement de ces eaux à un certain point....
OriginalL'auteur Bob Cross | 2008-09-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire avec un RMI Prise en Usine.
La prise des usines de créer des sockets RMI pour utiliser à la fois du client et du serveur donc si vous écrivez votre propre, vous avez le plein contrôle sur les ports utilisés. Le client usines sont créées sur le serveur, Sérialisé puis envoyé au client qui est assez propre.
Voici un guide au Soleil vous dire comment le faire.
Si je me souviens bien - c'est un nombre d'années puisque j'ai fait ce - que vous n'avez pas besoin de la classe sur le client. Le SocketFactory Interface est sur le client qui est tout ce dont vous avez besoin, la classe est Sérialisé et envoyé vers le bas à partir du serveur, ce qui le rend si agréable.
Le lien est cassé, mais ici est un bon exemple: netcluesoft.com/rmi-through-a-firewall.html
Cela ressemble à Oracle est l'équivalent de l'ancien lien: docs.oracle.com/javase/7/docs/technotes/guides/rmi/...
Ont mis à jour le lien dans la réponse. Merci!
OriginalL'auteur Dave Webb
Vous n'avez pas besoin de prise usines pour cela, ou même de plusieurs ports. Si vous êtes à partir du Registre à partir de votre serveur de JVM vous pouvez utiliser le port 1099 pour tout, et en effet, c'est ce qui va arriver par défaut. Si vous n'êtes pas de départ le registre à tous, comme dans un client de l'objet de rappel, vous pouvez fournir à port 1099 lors de l'exportation.
La partie de votre question sur 'le client de connexion vers le serveur résultant de rappels' n'a pas de sens. Ils ne sont pas différents de l'original connexions client vers le serveur, et ils utilisent le même port du serveur(s).
OriginalL'auteur user207421
Résumé de la longue réponse ci-dessous: pour résoudre le problème que j'avais (restriction de serveur et de rappel des ports à chaque extrémité du RMI de connexion), j'avais besoin de créer deux paires de client et de serveur de socket usines.
Réponds plus s'ensuit:
Notre solution pour le rappel problème avait essentiellement trois parties. La première a été l'objet d'habillage qui avait besoin de la possibilité de spécifier qu'il était utilisé par un client pour le serveur de connexion et être utilisé pour un serveur de client de rappel. À l'aide d'une extension de
UnicastRemoteObject
nous a donné la possibilité de spécifier le client et le serveur de socket usines que nous voulions utiliser. Cependant, le meilleur endroit pour verrouiller la prise des usines est dans le constructeur de l'objet distant.Donc, le premier argument spécifie la partie sur laquelle l'objet est attend demandes, alors que les deuxième et troisième spécifier la prise des usines qui sera utilisée à chaque extrémité de la connexion de la conduite de cet objet distant.
Depuis que nous avons voulu limiter les ports utilisé par la connexion, nous avons besoin d'étendre le RMI prise d'usines et de verrouiller les ports. Voici quelques croquis de notre serveur et client usines:
Noter que le serveur de socket usine ci-dessus garantit que seul le port que vous avez spécifié précédemment ne sera jamais utilisé par cette usine. Le socket client en usine doit être couplé avec la prise appropriée de l'usine (ou vous ne serez jamais à se connecter).
Alors, la seule chose restant à la force de votre connexion bidirectionnelle pour rester sur le même ensemble de ports est une logique de reconnaître que vous êtes de retour d'appel pour le côté client. Dans cette situation, assurez-vous que votre méthode de fabrique de l'objet distant appelle la RemoteObjectWrapper constructeur jusqu'en haut avec le rappel paramètre est défini sur true.
OriginalL'auteur Bob Cross
J'ai eu divers problèmes de mise en œuvre d'un RMI de Client/Serveur l'architecture, avec des Rappels de Client. Mon scénario, c'est que à la fois le Serveur et le Client sont derrière le Pare-feu/NAT. En fin de compte j'ai eu un travail entièrement mise en œuvre. Voici la liste des principales choses que j'ai fait:
Côté serveur , Local IP: 192.168.1.10. Public (Internet) IP 80.80.80.10
Sur le Pare-feu/Routeur/Serveur Local PC ouvrir le port 6620.
Sur le Pare-feu/Routeur/Serveur Local PC ouvrir le port 1099.
Sur le Routeur/NAT rediriger les connexions entrantes sur le port 6620 à 192.168.1.10:6620
Sur le Routeur/NAT rediriger les connexions entrantes sur le port 1099 192.168.1.10:1099
Dans le programme:
Côté Client, IP Locale: 10.0.1.123 Public (Internet) IP 70.70.70.20
Sur le Pare-feu/Routeur/Serveur Local PC port ouvert en 1999.
Sur le Routeur/NAT rediriger les connexions entrantes sur le port de 1999 à 10.0.1.123:1999
Dans le programme:
Espère que cette aide.
Iraklis
Êtes-vous sûr de 1099 peuvent être utilisés pour RMI Registre de recherche et réelle RMI à Distance les appels de Service aussi? Merci.
OriginalL'auteur Iraklis