Connectez deux prises client
Disons que Java a deux types de sockets:
- serveur de sockets "ServerSocket"
- sockets client ou tout simplement de "Socket"
Imaginer la situation de deux processus:
X = Client
Y = Serveur
Le processus de serveur de Y : a "ServerSocket", qui est à l'écoute sur un port TCP
Le processus client X : envoie une demande de connexion par le biais d'un "Socket" pour Y.
Y: Alors la accept()
méthode renvoie un nouveau client de type "Socket",
lorsque cela se produit, les deux Douilles d'obtenir "interconnectés",
Donc: la prise en processus client est connecté avec le support dans le processus serveur.
Ensuite: la lecture/écriture par le biais de prise X, c'est comme la lecture/écriture par le biais de prise Y.
Maintenant, deux Client Sockets obtenir interconnectés!!
Mais...
Que faire si je créer les deux sockets Client dans le même processus,
et je veux les faire "interconnectés" ?
... même possible?
Disons comment avoir deux socket client obtenir reliés entre eux sans l'aide d'un intermédiaire ServerSocket?
Je l'ai résolu par la création de deux Threads en continu, la lecture de l'Un et de l'écriture B,
et d'autres pour la lecture B et en écriture...
Mais je pense pourrait être une meilleure façon...
(Ceux du monde de consommation d'énergie threads ne sont pas nécessaires avec l'approche client-serveur)
De l'aide ou des conseils seraient appréciés!! Grâce
Edit:
Exemple d'application: "Un existant de l'application serveur peut être converti en un seul client",
Par exemple, le serveur VNC, un socket client se connecte au serveur VNC, et d'autres client socket est créée (pour se connecter à un milieu serveur), alors l'application relie les deux client résultant le serveur VNC est un client demande! Et puis, pas d'IP publique est nécessaire.
VNCServer---MyApp---> |moyen| serveur <---l'Utilisateur
source d'informationauteur Hernán Eche
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, ne l'appelez pas accepté client (côté serveur) son support un
Client Socket
. C'est très déroutant.Ce qui est impossible. Vous avez toujours à faire côté serveur, ce qui peut accepter des clients. Maintenant, la question est: de quel côté de la connexion doit être le côté serveur?
Choses que vous devez penser, par la présente décision:
Je ne vois pas ce que vous voulez faire avec ce troisième serveur. Peut-être la tenue de la VNCServer IP publique?
*Elister* a écrit, vous voulez faire un pont entre le client et le VNCServer. Je ne vois pas l'avantage.
Pourquoi ne pas faire immédiatement une connexion à la VNCServer?
Mais si vous le voulez vraiment, vous pouvez faire ce genre de situation:
Et c'est à quoi il ressemble sans le troisième serveur (Ce que je vous recommande):
EDIT:
Je crois que j'ai maintenant:
Nous avons de visualiser votre situation comme ceci:
(1)
La VNCServer se connecte au serveur principal. De la sorte, alors le serveur principal a obtenu le VNCServer son adresse IP.(2)
Le client se connecte au serveur principal.(3)
Maintenant le serveur principal sait où le serveur et le client sont. Puis il envoie au client sur le serveur. Ensuite, le client va se connecter à l'IP, il a reçu du serveur principal. C'est bien sûr l'adresse IP du VNCServer.(5)
La VNCServer est en cours d'exécution du serveur est d'accepter le client.Maintenant de partage de bureau peut commencer.
Je pense que c'est le plus recommander situation que vous pouvez avoir.
Bien sûr écrit en Java est à vous.
Pourquoi auriez-vous besoin de faire cela?
Si vous voulez avoir un "peer-to-peer" type de système, alors vous avez juste à chaque client d'exécuter à la fois un client et un serveur de socket - le socket serveur pour accepter les connexions provenant d'autres clients et le socket client pour établir des connexions à d'autres.
ETA: Ce n'était pas tout à fait clair ce que vous demandez dans la question d'origine, mais depuis votre montage, il semble que vous cherchez à créer une sorte de serveur proxy.
Dans votre exemple, votre application serait de créer deux sockets client, une connexion à la VNCServer et l'autre de la connexion au "centre serveur". Le "centre serveur" aurait alors deux sockets serveur (un pour votre application pour vous connecter à un pour la connexion de l'utilisateur. En interne, il aurait alors besoin de savoir comment faire correspondre ces prises et navette de données entre les deux.
Le ServerSocket vous permet d'écouter les connexions sur un port particulier. Lorsqu'un socket serveur accepte la connexion, il donne naissance à un autre thread, et déplace la connexion à un autre port, de sorte que le port d'origine peut toujours écouter les connexions supplémentaires.
Le client initie la connexion sur le port connus. Ensuite, généralement, le client devra envoyer une demande, et le serveur va répondre. Cette fonction permet de répéter jusqu'à ce que la communication est terminée. C'est la simple approche client/serveur que le site utilise des.
Si vous n'avez pas besoin de ce mécanisme, et les demandes peuvent provenir soit d'une prise à tout moment, la mise en œuvre, le lecteur et l'écrivain threads de la façon dont vous avez semble le plus approprié.
En interne, ils utilisent toujours attendre mécanismes, de sorte que vous ne devriez pas voir beaucoup d'utilisation de l'UC pendant qu'ils attendent pour les données arrivent.
Je pense que vous avez encore besoin d'une fin pour être un serveur de socket parce que je ne pense pas que c'est possible d'avoir un socket client d'accepter une connexion. ClientSocket implique TCP, ce qui nécessite une connexion. Si vous avez utilisé DatagramSocket, ce qui implique UDP, vous pourriez avoir de client à client de communication, sans connexion.