2011-08-22 4 views
2

Je fais donc un simple jeu d'applets en ligne multijoueur, et je le testais en utilisant des sockets UDP multicast au lieu de la connexion client-serveur typique. Ce n'est pas censé être efficace ou sûr, juste une expérience. Le seul problème est que quand j'essaye d'avoir d'autres personnes qui rejoignent le jeu depuis leur maison, ça ne me les connecte pas, mais quand j'utilise deux ordinateurs séparés, un qui est câblé et un qui est sur le wifi, ça fonctionne sans problème. Ils peuvent rejoindre leur propre jeu et se connecter à leur propre réseau, mais pas les autres peuples. Est-ce que je manque quelque chose de grand ici? Je posterai le code pertinent.Le réseautage multijoueur ne fonctionne que sur un réseau privé

InetAddress group; 
DatagramPacket packet; 
DatagramPacket messagePacket; 
MulticastSocket socket; 

socket = new MulticastSocket(4446); //random port 
group = InetAddress.getByName("228.5.6.7"); //multicast address 
socket.joinGroup(group); 

//typical code for sending a packet 
packet = new DatagramPacket(messageBuf, messageBuf.length, group, 4446); 

Des idées? Je suis plutôt nouveau au réseautage mais trouve un défi amusant et voudrais continuer à apprendre plus à ce sujet .. si vous avez d'autres conseils en plus de m'aider à résoudre ce problème, il serait apprécié.

+3

duplication possible de [Pour que la multidiffusion Udp fonctionne, le routeur doit la prendre en charge?] (Http://stackoverflow.com/questions/1801621/in-order-for-udp-multicast-to-work-router- must-support-it). En résumé, au moins un routeur entre vous et votre partenaire ne prend pas en charge la multidiffusion UDP. C'est probablement un problème insoluble à moins que vous ne contrôliez toute l'infrastructure réseau. –

+2

triste jour :(on dirait que je vais lanning celui-ci haha.Merci beaucoup pour l'info cependant, je vais chercher à le servir moi-même. – philip

+0

Multicast sur internet n'a jamais travaillé, jamais, dans le 15 Je pense que parce que l'espace d'adressage IPv4 est si petit, le consensus général parmi les personnes qui contrôlent les gros routeurs Internet était qu'il serait trop confus avec les gens qui essaient d'utiliser leurs propres applications sur les adresses./Vous avez deux options pour autant que je le vois: 1 - utiliser un VPN, donc vous pouvez passer la multidiffusion, ou 2 - attendre que IPv6 soit plus universellement supporté par le réseau domestique connexions (1 an? 5? 10?) et utiliser anycast. – DaveRandom

Répondre

0

Vous avez probablement compris cela maintenant, mais oui, il y a un énorme problème qui vous manque. Cela fonctionnera toujours si vous êtes local car votre routeur ne dérange pas la distribution de paquets derrière le LAN privé. Tout ce qui est en dehors du réseau ne voudra pas fonctionner car le client essaiera d'envoyer un paquet au serveur, mais le serveur est derrière un NAT (traduction d'adresse réseau) et comme le routeur n'a pas vu le serveur envoyer un paquet en premier, le routeur va juste jeter le paquet du client et ne jamais se connecter. Cependant, si le serveur envoie un paquet udp pour essayer de se connecter, le routeur aime changer de port pour que vous ne sachiez pas de quel port le paquet sortira. C'est ce que le transfert de paquets est pour le routeur. Ainsi, lorsque le client envoie un paquet, il va sur un autre port que prévu et le routeur le supprime toujours. Il existe des solutions telles que la "perforation". La solution la plus simple est d'avoir un serveur dédié en dehors de tout NAT pour gérer les requêtes.

Questions connexes