2009-09-20 10 views
0

Je suis débutant de l'apprentissage Java Networking.Je veux connecter 3 ordinateurs ou plus. Un pour le serveur et d'autres (par exemple A et B) pour les clients. Mais je veux me connectercomment se connecter et envoyer des données entre de nombreux ordinateurs utilisant le réseau Java

  1. A vers le serveur et vice versa
  2. B au serveur et vice versa
  3. A à B et vice versa

D'abord, je veux envoyer un message à partir d'une ou B au serveur et au serveur envoie les données stockées à l'expéditeur (par exemple A) et l'expéditeur (A) se connectera à B. Alors A et B confirmeront le message et A et B enverront les données les uns aux autres. Mais cette occasion peut se produire de A et B en même temps.

Mais je viens d'apprendre le code simple pour la connexion d'un serveur et d'un client en utilisant le socket et le socket du serveur. Les trois ordinateurs auront-ils besoin d'agir à la fois pour le serveur et le client? Existe-t-il d'autres moyens de se connecter entre les clients? Je ne sais pas comment envisager de résoudre les conflits de données entre les ordinateurs. Je veux aussi satisfaire si de nouveaux clients sont ajoutés. Si quelqu'un sait résoudre le problème ci-dessus, y compris les conflits de données, pls m'aider avec un exemple de code simple pour le serveur et les clients.

Répondre

0

Un processus qui s'attend à recevoir des appels entrants doit écouter en tant que serveur; un processus qui rend les appels sortants est un client pour les fins. Vous pouvez contourner le problème des machines clientes (A, B) se trouvant derrière un pare-feu qui les empêcheraient de faire des connexions directes en demandant à chacune d'entre elles d'interroger le serveur à intervalles réguliers pour leur demander s'il existe des données; de sorte que lorsque A a des données pour B, il demande au serveur que la prochaine fois que B se connecte pour demander à le savoir. A attend alors que la connexion soit ouverte jusqu'à ce que B interroge, & est informé qu'il y a des données, le serveur dit alors à A que B est prêt et peut agir comme un proxy jusqu'à ce que l'un ou l'autre casse la connexion.

+0

S'il installe des sockets bidirectionnels, le serveur ne peut-il pas écrire tout ce qui entre sur une socket pour sortir de l'autre, éliminant ainsi le besoin d'interroger? – Adam

+0

Si A et B fonctionnent continuellement, alors oui. Si elles ne fonctionnent que par intermittence, le fait de disposer d'un protocole de type keep-alive et handshake rend la gestion de l'état plus transparente. –

+0

Un message de fin et de démarrage permettrait de résoudre ce problème plutôt bien si vous voulez faire ce que @Adam a dit. –

1

Vous pouvez utiliser des sockets. Je sais que vous le faites déjà, mais je pense que vous devez le faire de cette façon.

serveur

ServerSocket server = new ServerSocket(2009); // 2009 is the networkport 
while (acceptingClients) 
{ 
    Socket socket = server.accept(); 
    ClientHandler handler = new ClientHandler(socket); // ClientHandler, you have to make by yourself 
    Thread thread = new Thread(handler, "Handler"); 
    /* Use a thread, so you can connect more clients at the same 
    * time. Of course ClientHandler must implement java.lang.Runnable 
    */ 
    thread.start(); 
} 

client

Socket socket = new Socket(host, 2009); // host is a String with ipadress from the server. Use the same port 

Ce code doit être essayer-attrapée. Pour la communication, vous pouvez utiliser de nombreux types d'écrivains et de lecteurs. Dans les lecteurs et les écrivains, vous devez ajouter un paramètre de flux en construisant. Vous pouvez les appeler en appelant

socket.getOutputStream(); 
socket.getInputStream(); 

Ne fermez pas les graveurs, sinon la connexion sera fermée. flush() peut par une solution.

Hope this helps

1

On dirait que vous êtes à la recherche d'un certain type de communication de groupe. Cela peut être accompli en utilisant la multidiffusion IP, et une bibliothèque Java qui est très pratique est alors JGroups (ajoute la fiabilité et l'appartenance à un groupe).Si cela ne vous dérange pas d'abstraire l'adresse IP, vous pouvez regarder dans Java Messaging Service, qui est une interface standard pour de nombreuses implémentations de messagerie qui vous donnent la fiabilité et les transactions pour les communications de type publish-subscribe et queue-type.

Questions connexes