2010-04-16 9 views
1

J'ai fait une petite applet de discussion en utilisant la multidiffusion. Il fonctionne bien entre les ordinateurs sur le même réseau, mais échoue si les ordinateurs sont sur des réseaux différents. Pourquoi est-ce?Comment faire pour que mon programme de multidiffusion fonctionne entre les ordinateurs sur différents réseaux?

import java.io.*; 
import java.net.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ClientA extends JApplet implements ActionListener, Runnable { 

JTextField tf; 
JTextArea ta; 
MulticastSocket socket; 
InetAddress group; 
String name=""; 

public void start() { 
    try { 
socket = new MulticastSocket(7777); 
group = InetAddress.getByName("233.0.0.1"); 
socket.joinGroup(group); 
socket.setTimeToLive(255); 
Thread th = new Thread(this); 
th.start(); 
name =JOptionPane.showInputDialog(null,"Please enter your name.","What is your name?",JOptionPane.PLAIN_MESSAGE); 
tf.grabFocus(); 
    }catch(Exception e) {e.printStackTrace();} 
} 

public void init() { 

JPanel p = new JPanel(new BorderLayout()); 
ta = new JTextArea(); 
ta.setEditable(false); 
ta.setLineWrap(true); 
JScrollPane sp = new JScrollPane(ta); 
p.add(sp,BorderLayout.CENTER); 
JPanel p2 = new JPanel(); 
tf = new JTextField(30); 
tf.addActionListener(this); 
p2.add(tf); 
JButton b = new JButton("Send"); 
b.addActionListener(this); 
p2.add(b); 
p.add(p2,BorderLayout.SOUTH); 
add(p); 

} 

public void actionPerformed(ActionEvent ae) { 
String message = name+":"+tf.getText(); 
tf.setText(""); 
tf.grabFocus(); 
byte[] buf = message.getBytes(); 
DatagramPacket packet = new DatagramPacket(buf,buf.length, group,7777); 
try { 
socket.send(packet); 
} 
catch(Exception e) {} 
} 



public void run() { 
while(true) { 
byte[] buf = new byte[256]; 
String received = ""; 
    DatagramPacket packet = new DatagramPacket(buf, buf.length); 
try { 
      socket.receive(packet); 
      received = new String(packet.getData()).trim(); 
} 
catch(Exception e) {} 
ta.append(received +"\n"); 
ta.setCaretPosition(ta.getDocument().getLength()); 
} 
} 

} 

Répondre

2

La plupart des routeurs (routage IPv4) sont configurés pour ne pas prendre en charge la multidiffusion.

http://www.ibiblio.org/pub/Linux/docs/howto/other-formats/html_single/Multicast-HOWTO.html

Pour travailler à travers multicasting réseaux, le routeur (s) impliquées devraient être configurés pour le soutenir. IPv6 c'est obligatoire, mais IPv4 c'est optionnel et normalement pas fait.

+0

Le fait que le programme fonctionne sur mon réseau local signifie-t-il que mon routeur est configuré pour la multidiffusion? – George

+1

J'imagine que certains routeurs peuvent être configurés pour prendre en charge la multidiffusion interne, mais pas pour la diffusion ultérieure vers le réseau étendu. C'est juste une supposition si – Martin

+1

@George (& Martin) - la plupart des routeurs ne seront pas * route * multicast par défaut. C'est pourquoi il ne fonctionne que sur le segment de réseau local. Et même si vous aviez un petit routeur grand public qui le supporte (la plupart ne le font pas), la plupart des FAI ne routent pas la multidiffusion. –

Questions connexes