/* ett Multicastprogram som endast skickar ett förbestämt meddelande som man skriver in som argument i början av programmet tex java PeerToPeer Thomas Hallå! gjorde först en förlängning av detta program utan inre klasser men jag tyckte det blev för mycket referenser så jag bantade ner till endast inre klasser. */ import javax.swing.*; import java.awt.event.*; import java.awt.*; import java.util.*; import java.net.*; import java.io.*; public class PeerToPeer extends JFrame{ //grafik private JTextArea utskrift; private JLabel status; private String hostname="", hostadress="",hostcomment=""; //multicast datatyper private InetAddress adress=null; private int portnr=2000; private MulticastSocket ms; //pekare private Sender sender; private Receiver receiver; private InterFaceHandler interfh; public PeerToPeer(String[] args){ //inga argument skriver, med 1 argument, 2 argument if (args.length==0){ hostname = "unknown"; hostcomment = "anonymt"; } else if (args.length == 1){ hostname=args[0]; hostcomment="anonymt"; }else if (args.length > 1){ hostname=args[0]; hostcomment=args[1]; //forts............ //är det 3 parametrar skiter den i den sista!! } addWindowListener(new Exit()); JPanel yta = new JPanel(); yta.add(utskrift = new JTextArea()); getContentPane().add(utskrift, BorderLayout.CENTER); utskrift.setEditable(false); status = new JLabel(); JPanel statusBar = new JPanel(); statusBar.add(status); getContentPane().add(statusBar, BorderLayout.SOUTH); setSize(400,400); show(); connect(); } private synchronized void connect(){ try{ //ny multicastSocket är unikt för P2P:: ms = new MulticastSocket(portnr); hostadress = ms.getInetAddress().getLocalHost().getHostAddress(); adress = InetAddress.getByName("234.235.236.237"); setTitle("ansluten till: " + adress.getHostAddress()); //lägg in klienterna!! ms.joinGroup(adress); //starta mottagare, sändare respektive ett gränssnitt mellan dessa sender = new Sender(); receiver = new Receiver(); interfh = new InterFaceHandler(receiver); }catch (IOException e){ ShutDown(); } setStatus("broadcastar meddelandet var 5 sek"); } private void setStatus(String mess){ //lägg in text i textarean!! status.setText(mess); } private void ShutDown(){ //stäng av trådarna mha deras resp setOffline() metod i dom inre klassernet receiver.setOffline(); sender.setOffline(); interfh.setOffline(); System.exit(7); } //Inre Klasser:::::::::::::: class Sender extends Thread{ private boolean online=true; private DatagramPacket output; public Sender(){ String message = " From: " + hostname + " Host: " + hostadress + " Comment: " +hostcomment; //pakar ner string meddelandet typiskt för multicast är DatagramPacket:: byte[] data = message.getBytes(); output = new DatagramPacket(data, data.length, adress,portnr); this.start(); //starta tråden i denna klass!!! } public synchronized void run() { try{ while(online){ sleep(1000); //varje sekund ms.send(output); //skicka iväg multicast socketen!!!!! }} catch (IOException e){ System.err.println(e); } catch (InterruptedException ei){ System.err.println(ei);} } public void setOffline(){ //stänga ner online=false; System.out.println("testss"); } }//Sender //Ta emot meddelanden class Receiver extends Thread{ private boolean online=true; private HashSet messages, saml; //tillåter ej dubbletter!!!!!!!!!! public Receiver(){ this.start(); } public synchronized void run(){ try{ byte[] buffer = new byte[65507]; //storlek på buffer while (online) { sleep(1000); boolean samla = true; messages = new HashSet(); while(samla){ DatagramPacket dp = new DatagramPacket(buffer, buffer.length,adress,portnr); ms.receive(dp); String s = new String(dp.getData(), 0, dp.getLength()); samla = messages.add(s); //messages.remove(s); //messages.clear(); //}else //läggs då bara in när samla är true!! }}} catch (IOException e) { System.err.println(e); } catch(InterruptedException ie){ System.err.println(ie); } } //för att fånga upp sleep!!!!! public void setOffline(){ online=false; System.out.println("testing"); messages.clear(); } public ArrayList getMessages(){ return new ArrayList(messages); } }//Receiver class InterFaceHandler extends Thread{ private boolean online=true; private ArrayList samling, skickade; public InterFaceHandler(Receiver rec){ this.start(); //start run } public synchronized void run(){ while(online){ try{ sleep(5000); //5 sek } catch(InterruptedException ie){System.err.println(ie);} samling = receiver.getMessages(); skickade = new ArrayList(); for (int x=0;x