2012-04-18 18 views
2
私たちの先生は私たちが【選択唯一の問題は、私は、彼らがあるとして適切に機能するために取得する方法を見つけ出すように見えることはできませんということですクラスMulticastImageSender(MIS)とMulticastImageReceiver(MIR)で二つのプログラムを変更したさ

彼が私たちにそれらを与えたとき。私は私のアドレスがマルチキャストアドレスではないと言われ続けています。 MISのためのマルチキャスト経由のJava、間違ったアドレス

引数:MIS.jarの127.0.0.0 1234 4 "/home/kevin/Pictures/ME.png" MIRため 引数-jarのjavaます。java -jar MIR.jarの127.0.0.0 1234

私はその後、第1の受信機を実行しますが、私はこれらの出力MIS用

出力得続ける:MIRため

Sent /home/kevin/Pictures/ME.png to 127.0.0.0 on port 1234 

出力:

Exception in thread "main" java.lang.IllegalArgumentException: Not a multicast address 
at MulticastImageReceiver.main(MulticastImageReceiver.java:35) 

私はマルチキャストアドレスが244.x.x.xであることを知っていますが、私はローカルマシンアドレスを使用して自分宛に送信する必要があります。または、私のマルチキャストソケットを244.xxxアドレスで作成すると、私のルータ(コンピュータネットワークインターフェイスカード)は私のアドレスが127.0.0.0であることを知り、送信側は同じルータ(NIC?)もう一度私に?

**私は一度も無駄にこの質問を投稿しました。私は受け付けており、エラーが、私はちょうどこのようなもののすべてを学び、私は実際に私の割り当てを開始できるように、実際にこのプログラムを実行する方法を把握しようとしています。このラインから

if (!multicastAddress.isMulticastAddress()) 

であることを認識しています。私が必要とするのは、使用するアドレスとその理由を簡単に説明することだけです。 UbuntuのOneric、Eclipse IDEを使用して

、Javaの

出典:

MIS 

public class MulticastImageSender 
{ 
private static final int TIMEOUT = 3000; // Time between sends (milliseconds) 
private static final int MAXFILELEN = 65000; // File must fit in single datagram 

public static void main(String[] args) throws IOException, InterruptedException 
{ 
    if (args.length < 4) // Test for correct # of args 
     throw new IllegalArgumentException("Parameter(s): <Multicast Address> <Port> <TTL> <Image File> [<Image File>...]"); 

    InetAddress multicastAddress = InetAddress.getByName(args[0]); 
    int destPort = Integer.parseInt(args[1]); 
    // Destination port of multicast packets 
    int TTL = Integer.parseInt(args[2]); 
    // Create a UDP multicast socket with any available local port 
    MulticastSocket socket = new MulticastSocket(); 
    socket.setTimeToLive(TTL); 
    // Set the TTL 
    for (int i=3; i < args.length; i++) 
    { 
     RandomAccessFile file = new RandomAccessFile(args[i], "r"); 
     if (file.length() > MAXFILELEN) 
      throw new IOException("File too big"); 
     byte [] fileBuffer = new byte[(int) file.length()]; 
     file.read(fileBuffer); 
     file.close(); 
     // Create a datagram to send 
     DatagramPacket sendPacket = new DatagramPacket(fileBuffer, fileBuffer.length, multicastAddress, destPort); 
     socket.send(sendPacket); // Send the echo string 
     System.out.println("Sent " + args[i] + " to " + sendPacket.getAddress().getHostAddress() + " on port " + sendPacket.getPort()); 
     Thread.sleep(TIMEOUT); 
    } 
    socket.close(); 
} 
} 

MIRとそのサポートのスレッドを

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

public class MulticastImageReceiver extends JFrame 
{ 

private static final long serialVersionUID = 1L; 
private JLabel picture; 
// Label to contain image 
public MulticastImageReceiver() 
{ 
    super("Multicast Image Receiver"); // Set the window title 
    setSize(300, 300); 
    // Set the window size 
    picture = new JLabel("No image", SwingConstants.CENTER); 
    JScrollPane scrollPane = new JScrollPane(picture); 
    getContentPane().add(scrollPane, "Center"); 
    addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt){ System.exit(0);}}); 
} 

public JLabel getPicture() 
{ 
    return picture; 
} 

public static void main(String[] args) throws IOException 
{ 
    if (args.length != 2) // Test for correct # of args 
     throw new IllegalArgumentException("Parameter(s): <Multicast Address> <Port>"); 

    final InetAddress multicastAddress = InetAddress.getByName(args[0]); 
    if (!multicastAddress.isMulticastAddress()) 
     throw new IllegalArgumentException("Not a multicast address"); 

    int port = Integer.parseInt(args[1]); 
    // Destination port of multicast packets 
    MulticastImageReceiver multicastImageReceiver = new MulticastImageReceiver(); 
    multicastImageReceiver.setVisible(true); 
    new Thread(new MulticastImageReceiverThread(multicastImageReceiver, multicastAddress, port,"No Image")).start(); 
} 
} 

MIRスレッド

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


class MulticastImageReceiverThread implements Runnable 
{ 
private static final int MAXFILELEN = 65000; 
// File must fit in single datagram 
private InetAddress multicastAddress; 
// Sender multicast address 
private int port; 
// Sender port 
Runnable updateImage; 
// Anonymous class for Swing event queue to update label 
String imageText; 
// Label text 
byte[] image = new byte[MAXFILELEN]; 
// Bytes of image 
boolean imageValid = false; 
// True if image contains valid bytes 

public MulticastImageReceiverThread(final MulticastImageReceiver frame, InetAddress multicastAddress, int port, String initialImageText) 
{ 
    this.multicastAddress = multicastAddress; 
    this.port = port; 
    this.imageText = initialImageText; 
    updateImage = new Runnable() 
    { 
     public void run() 
     { 
      JLabel picture = frame.getPicture(); 
      picture.setText(imageText); 
      if (imageValid) 
      { 
       ImageIcon newImage = new ImageIcon(image); 
       picture.setIcon(newImage); 
       picture.setPreferredSize(new Dimension(newImage.getIconWidth(), newImage.getIconHeight())); 
      } 
      else 
       picture.setIcon(null); 

      picture.revalidate(); 
     } 
    }; 
} 

public void changeImage() 
{ 
    try 
    { 
     SwingUtilities.invokeAndWait(updateImage); 
     // Put update in queue and wait until handled 
    } 
    catch (Exception e) 
    { 
     System.out.println(e.getMessage());} 
} 

public void run() 
{ 
    // Create a datagram to receive 
    DatagramPacket recvPacket = new DatagramPacket(image, MAXFILELEN); 
    MulticastSocket socket; 
    // Create a UDP multicast socket with the specified local port 
    try 
    { 
     socket = new MulticastSocket(port); 
     socket.joinGroup(multicastAddress); // Join the multicast group 
    } 
    catch (IOException e) 
    { 
     imageText = "Problem with multicast socket"; 
     imageValid = false; changeImage(); return; 
    } 
    for (;;) 
    { 
     try 
     { 
      socket.receive(recvPacket); // Receive the image 
     } 
     catch (IOException e) 
     { break; } 
     // Assume exception due to file closing 
     imageText = ""; 
     imageValid = true; 
     changeImage(); 
     recvPacket.setLength(MAXFILELEN); 
     // You have to reset this!!! 
    } 
} 
} 
+0

224.0.0.1は、 –

答えて

3

127.0.0.1マルチキャストではないローカルホスト(ユニキャスト)

マルチキャストは古いCLASS D空間です。そう224.0.0.0から239.255.255.255

を通じてより多くの情報のため

http://tools.ietf.org/html/rfc1112を参照してください

または

http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xml

だから、ADHOCグループで何かを選択し、あなたが行って良いことがあります。

-edit-コメントに対応します。

IPマルチキャストでは、宛先アドレスがマルチキャストとして識別されます。したがって、MISに127.0.0の送信元を持つマルチキャストアドレスにMISを送信させる場合は、1と同じコンピュータ上のそのアドレスを聞いている受信者はでなければなりません。は動作します。実際にはマジックはありません。一度マルチキャストグループに参加すると、TCPスタックはそのアドレスへのパケットに興味があることを示し、それが渡されます。ローカルネットワークの複雑さ/設定に応じて、マルチキャストパケットは、最初のIGMP対応スイッチ、または最初のルータ(マルチキャストルーティングプロトコルを実行している場合を除き、ドロップ/無視されます)のいずれかになります。

実際のマルチキャストアドレスを使用しようとすると機能しませんか?

+1

-1で動作します。彼はそれを知っていると説明した。彼の疑問は、自分のコンピュータでそれをどうやって起こさせるかということです。 – Neil

+1

技術的には、同じコンピュータ上にマルチキャスト送信者と受信者を持つことができます。宛先アドレスは、マルチキャストでは重要であり、ソースではありません。 – Doon

+0

これはあなたの答えに入れるべき説明です。 – Neil

関連する問題