Dans le cas ou votre programme évolue sur un réseau LAN (VPN), Null besoin de machine tier pour héberger les parties.
Voilà l'idée :
Partons du principe suivant,
Joueur J1 et joueur J2 désirent faire une partie. Dans ce scénario, J1 sera le premier à démarrer le programme sur sa
machine. Puis J2 démarrera le sien. Au préalable, J1 et J2 seront connectés en VPN.
Au lancement du programme de J1, un message de type broadcast (via DatagramSocket) est envoyé sur le réseau, mais comme
il est le premier, pas de réponse...
Il s'autoproclame hébergeur, et crée un ServerSocket prèt à accueillir toute connexion pour une partie. Dans le même
temps, il met en écoute un DatagramSocket (sur le port broadcast 5600 fonctionnel chez moi) pour réceptionner les
messages broadcast des autres programmes qui se lanceront après lui, ou qui lui répondent.
J2 lance alors son programme, ce dernier emmet son message broadcast que J1 réceptionne, et il lui répond "Ok". Le
programme de J2 présente alors dans sa liste de joueur disponible le joueur J1, et de son côté, le programme de J1
ajoute dans sa liste de joueurs demandeur J2.
Les deux programmes sont lancés, et les deux joueurs se voient. Le programme J1 étant autoproclamé hébergeur, J2
sélectionne J1 dans sa liste et demande à se connecter, cette fois avec une connexion directe par Socket afin
d'initialiser le dialogue du jeu.
Si l'on désire permettre uniquement des parties uniques, il suffit de stopper l'écoute de message broadcast et
d'entretenir le dialogue du jeu. Dans le cas contraire, il faudra isoler chaque partie dans son propre Thread, et
continuer d'écouter pour héberger d'autres parties.
Moralité, la gestion des parties se fait via les DatagramSocket, et les parties en Socket.
Voici un exemple de code qui emet un message Broadcast et attend 50 millisecondes une réponse:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| void emetMessage() {
DatagramSocket emeteur;
byte[] AdresseDeBroadcast = { (byte)255 , (byte)255 , (byte)255 , (byte)255 };
try {
InetSocketAddress broadcast = new InetSocketAddress(InetAddress.getByAddress(AdresseDeBroadcast), 5600);
byte[] messageInitial = new String("Message a envoyer à tout le monde").getBytes();
DatagramPacket EmissionBroadcast = new DatagramPacket(messageInitial, messageInitial.length, broadcast);
emeteur = new DatagramSocket();
emeteur.setBroadcast(true);
emeteur.send(EmissionBroadcast);
ecouteReponse();
}
catch (Exception e) {
System.out.println("Erreur lors de l'envoie de données broadcast. Détails :");
e.printStackTrace();
}
}
void ecouteReponse() {
DatagramSocket ecouteur = new DatagramSocket(5600);
ecouteur.setSoTimeout(50);
byte[] messageReceptionne;
DatagramPacket recepteur;
String valeur;
int cpt;
try {
messageReceptionne = new byte[1000]; // Plus selon la longueur de vos messages.
recepteur = new DatagramPacket(messageReceptionne, messageReceptionne.length());
ecouteur.receive(recepteur);
valeur = new String(recepteur.getData());
System.out.println(valeur);
// Traitement de l'information...
// Je ne suis pas le premier, j'ajoute celui qui m'a répondu dans ma liste...
...
...
.
}
catch (Exception e) {
System.out.println("Pas de réponse au message Broadcasr : Autoproclamation d'hébergement.");
// Selon scénario, je suis le premier => création du ServerSocket
// Attente de message Broadcast...
...
...
.
}
} |
Qu'en pensez-vous ?
Partager