Java Nachrichten über MulticastSocket im Netzwerk versenden

Posted: Juni 21st, 2011 | Author: admin | Filed under: Programmieren | Tags: , , , , , , , , , , | No Comments »

imageAls ich meinen Netzwerk-Chat jLanChat programmiert habe, musste ich mich intensiv mit diesem Thema beschäftigen. Herkömmlicherweise verwendet man zum versenden von Nachrichten das sogenannte Client-Server Prinzip. Will zum Beispiel PC1 eine Nachricht an PC2 senden so muss PC2 einen Socket öffnen mit dem sich PC1 dann verbindet und über diesen Socket die Nachricht sendet. Will man nun eine Nachrichtenleitung mit mehren PCs aufbauen so benötigt man schnell einen Server, mit dem sich dann alle Clients verbinden und über diesen dann kommunizieren.

Wenn wir die Kommunikation über Multicast (Punkt zu Gruppe) tätigen brauchen wir keinen Server. Denn fast alle Router/Switches unterstützen Multicast.

Alle Teilnehmer verbinden sich mit dem Switch/Router und treten einer Gruppe, in Form einer IP-Adresse und eines Ports (z.B.: 230.0.0.1:4447), bei. Bekommt der Switch/Router jetzt eine Nachricht eines Clients mit der Gruppen-Adresse als Zieladresse vervielfältigt der Switch/Router diese Nachricht und sendet sie an alle die der Gruppe beigetreten sind, auch an den der die Nachricht abgesendet hat. So kann man zum Beispiel einen serverlosen Chat aufbauen. Wenn man’s genau nimmt übernimmt der Switch/Router jetzt unsere Serverfunktion.

Um das Ganze in JAVA zu realisieren muss man folgende Bibliothek ins Projekt einbinden: http://commons.apache.org/lang/

Hier unser Beispiel, Es gibt eine Sender-Klasse und eine Empfänger-Klasse:

Sender

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;


public class Sender {

  public static void main(String[] args) {
    // Netzwerk-Gruppe
    String NETWORK_GROUP = "230.0.0.1";
    // Netzwerk-Gruppen Port
    int NETWORK_GROUP_PORT = 4447;
    // Client-Port
    int CLIENT_MULTICAST_PORT = 4446;
   
    // Nachrichten-Codierung
    String TEXT_ENCODING = "UTF8";
   
    try {
      MulticastSocket socket =  new MulticastSocket(CLIENT_MULTICAST_PORT);
      byte[] message = "Hallo Welt".getBytes(TEXT_ENCODING);
     
      // Nachricht an Gruppe senden
      socket.send(new DatagramPacket(message, message.length , InetAddress.getByName(NETWORK_GROUP) ,
NETWORK_GROUP_PORT
));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

 

Empfänger

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;


public class Receiver {

  public static void main(String[] args) {
    // Netzwerk-Gruppe
    String NETWORK_GROUP = "230.0.0.1";
    // Netzwerk-Gruppen Port
    int NETWORK_GROUP_PORT = 4447;
   
    // Nachrichten-Codierung
    String TEXT_ENCODING = "UTF8";
   
    InetAddress group;
    MulticastSocket socket;
 
    try {
      // Gruppe anlegen
      group = InetAddress.getByName(NETWORK_GROUP);
      socket = new MulticastSocket(NETWORK_GROUP_PORT);
     
      // Gruppe beitreten
      socket.joinGroup(group);
     
      byte[] bytes = new byte[65536];
      DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
     
      while(true){
        // Warten auf Nachricht
        socket.receive(packet);
        String message = new String(packet.getData(),0,packet.getLength(), TEXT_ENCODING);
        System.out.println(message);
      }   
     
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

 

Ich hoffe ich konnte dem ein oder anderen damit helfen.

Das ganze könnt ihr euch als Eclipse Projekt hier herunterladen (inklusive Bibliotheken): Eclipse Projekt – Tutorial Net Send


Java: Wav-Datei abspielen in einem Applet ohne Sicherheitsabfrage

Posted: April 24th, 2011 | Author: admin | Filed under: Programmieren | Tags: , , , , , | No Comments »

Will man in einem Java Applet eine WAV-Datei abspielen ohne auf die lokale Festplatte zugreifen zu müssen, also ohne dass der Benutzer eine Sicherheitsfrage gestellt bekommt, muss man die Applet eigene Methode getAudioClip verwenden. Leider funktioniert diese nicht für MP3s oder OGG.

Beispiel Applet

image

Applet-Quellcode

import java.applet.AudioClip;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class PlayWav extends javax.swing.JApplet {

   public static JApplet playWav;

   private JButton playButton;
   private JButton stopButton;

   // Audio
   private AudioClip audioClip;

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            JFrame frame = new JFrame();
            PlayWav inst = new PlayWav();
            frame.getContentPane().add(inst);
            ((JComponent) frame.getContentPane()).setPreferredSize(inst
                  .getSize());
            frame.pack();
            frame.setVisible(true);
         }
      });

   }

   public PlayWav() {
      super();
      initGUI();
   }

   private void initGUI() {
      try {
         playWav = this;
         BorderLayout thisLayout = new BorderLayout();
         getContentPane().setLayout(thisLayout);
         {
            playButton = new JButton();
            getContentPane().add(playButton, BorderLayout.CENTER);
            playButton.setText("play");

            // Play
            // Wav Datei online abspielen mittels der Applet-Methode
            // getAudioClip.
            playButton.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent evt) {
                  try {
                     // alarm.wav liegt in
                     // http://blog.mynotiz.de/howTo/PlayWav/alarm.wav
                     URL url = new URL(getDocumentBase().toString());
                     audioClip = playWav.getAudioClip(url, "alarm.wav");
                  } catch (MalformedURLException e) {
                     e.printStackTrace();
                  }

                  // Play normal
                  audioClip.play();

                  // Play in loop
                  // audioClip.loop();
               }
            });
         }
         {
            stopButton = new JButton();
            getContentPane().add(stopButton, BorderLayout.SOUTH);
            stopButton.setText("stop");

            // Stop
            stopButton.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent evt) {
                  audioClip.stop();
               }
            });
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

HTML-Quellcode

<applet style="border: 1px solid black;" code="PlayWav.class" archive="playWav.jar"> Ihr Browser unterstütz keine Java Applets! </applet>

 

Wie ihr aus eurem Code ein Applet erzeugt erfahrt ihr hier.

FTP-Ordner

Im FTP-Verzeichnis sieht das ganze dann wie folgt aus.

image


Java Applet: Pizzawecker / Küchenuhr

Posted: April 19th, 2011 | Author: admin | Filed under: Internet, Software | Tags: , , , , , | 1 Comment »

Jeder kennt dass, Pizza oder Lasagne in den Backofen geklatscht und aufgedreht. Danach wieder an den Rechner gesetzt und irgendwann fällt einem ein: “Ach du schei…, meine Pizza ist ja noch im Backofen”. Meistens ist es dann leider zu spät und man findet lediglich ein schwarzen Fladen im Backofen. Um dies zu vermeiden habe ich mir ein Pizzawecker Applet geschrieben bei dem man, wie bei einer Küchenuhr, eine Countdown-Zeit eingeben kann. Wie viel Zeit (in Prozent) bereits abgelaufen ist könnt ihr anhand der Pizza-Grafik ablesen. Je fertiger eure Pizza ist desto mehr Stücke kommen hinzu. Ist der Countdown abgelaufen, und somit die Pizza voll, ertönt ein nerviges Alarm-Geräusch und man weiß, jetzt sollte ich schleunigst die Küche aufsuchen.

Auf http://pizzawecker.mynotiz.de erreicht ihr das Applet.

image

Viel Spaß damit und einen guten Hunger!


Java Spieleentwicklung: Einstieg in Slick – Tutorial

Posted: April 2nd, 2011 | Author: admin | Filed under: Programmieren, Tutorials | Tags: , , , , , , | 2 Comments »

Seit einiger Zeit befasse ich mich mit der Java 2D Spiele-Engine Slick (Danke an Tobse). Deswegen habe ich mir gedacht wieso nicht ein Tutorial schreiben. Heraus gekommen ist ein Dokument welches beschreibt wie man Slick einrichtet, wie mein sein erstes Projekt erstellt und wie man ein erstes Spiel entwickelt. Als Beispiel-Spiel habe ich mich für einen Pong-Klon entschieden.

Hier geht’s zum Slick Tutorial:

image


Java aus Liste während der Iteration Listenelemente löschen

Posted: Januar 21st, 2011 | Author: admin | Filed under: Programmieren | Tags: , , , , , , , , | No Comments »

Oft kommt es vor dass man in Java während der Iteration über eine ArrayList oder eine LinkedList ein Element nach einem gewissen Kriterium heraus löschen will. Über die gewöhnliche Schleife for(String name : namen) geht dies jedoch nur über Umwege mit einer zweiten Hilfsliste. Löscht man Elemente während der Iteration mit obiger Schleife erhält man eine java.util.ConcurrentModificationException.

Folgende Lösung ist weitaus einfacher und effizienter. Hier wird nämlich ein Iterator verwendet und es ist möglich während der Iteration zu löschen:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListRemoveDuringIteration {

  public static void main(String[] args) {
    List<String> namen = new ArrayList<String>();
   
    namen.add("Peter");
    namen.add("Paul");
    namen.add("Maria");
    namen.add("Frank");
   
    for (Iterator<String> nameIter = namen.iterator(); nameIter.hasNext();){
      String name = nameIter.next();
      if(name.equals("Paul")){
        nameIter.remove();
        System.out.println("Paul wurde während der Iteration aus der Liste gelöscht!");
      }
    }
  }
}

 

Quelltextdatei herunterladen: ListRemoveDuringITeration.java