Programowanie sieciowe w Javie Michał Kuciapski m.kuciapski@univ.gda.pl
Metody sieciowe apletów
Metody sieciowe apletów Klasy tworzenia apletu
Wykorzystywane klasy Aby utworzyć aplet należy dziedziczyć po jednej z klas: java.applet.Applet javax.swing.JApplet Do tworzenia interfejsu graficznego używamy odpowiednio: java.awt.* - w przypadku tworzenia apletu jako Applet javax.swing.* - w przypadku tworzenia apletu jako JApplet
Metody sieciowe apletów Cykl życia apletu
Etapy cyklu życia Cykl życia aplety składa się z kilku etapów: public void init() public void start() public void stop() public void destroy() paint(Graphics g)
Przykład import java.applet.Applet; import java.awt.Graphics; public class CyklZyciaApletu extends Applet { StringBuffer tekstApletu; public void init() { tekstApletu = new StringBuffer(); dodajElement("inicjalizowanie... "); } public void start() { dodajElement("uruchamianie... "); } public void stop() { dodajElement("zatrzymanie... "); } public void destroy() { dodajElement("usuwanie..."); }
Przykład c.d. private void dodajElement(String tekst) { tekstApletu.append(tekst); repaint(); } public void paint(Graphics g) { g.drawOval(0,0,getWidth() - 10 , getHeight() - 10); g.drawString(tekstApletu.toString(), getWidth()/4, getHeight()/2);
Metody sieciowe apletów Pobieranie danych lokalizacji apletu
Miejsca pobierania danych Aplety pobierają najczęściej dane z: Katalogu, z którego aplet pochodzi – baza kodowa Katalogu strony HTML, w której aplet jest zagnieżdżony – baza dokumentowa Do ustalanie baz kodowej i dokumentowej służą odpowiednio metody: URL getCodeBase() – adres URL katalogu zawierającego aplet URL getDocumentBase() – adres URL strony zawierającej aplet
Przykład 1 import java.awt.Graphics; import java.applet.Applet; public class BazaApletu extends Applet { public void paint(Graphics g) g.drawString("Baza kodowa apletu: " + this.getCodeBase() .toString(), 20, 30); g.drawString("Baza dokumentowa apletu: " + this.getDocumentBase().toString(), 20, 50); }
Przykład 2 import javax.swing.*; public class BazaApletuSwing extends JApplet { public void init() { JLabel bazaKodowa = new JLabel(); JLabel bazaDokumentowa = new JLabel(); bazaKodowa.setText(this.getCodeBase().toString()); bazaDokumentowa.setText(this.getDocumentBase().toString()); getContentPane().setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS)); this.add(bazaKodowa); this.add(bazaDokumentowa); }
Metody sieciowe apletów Pobieranie i przesyłanie danych
Zastosowania Aplety w zakresie pobierania i przesyłania danych umożliwiają m.in.: Ładowanie obrazków Ładowanie dźwięków Wyświetlanie dokumentów Przesyłanie danych pomiędzy sobą
Ładowanie obrazków Ładowanie obrazków możliwe jest poprzez metody klasy Image : Image getImage(URL url) Image getImage(URL url, String nazwa) Metody te są dostępne poprzez: Klasę Applet Klasę java.awt.Toolkit – dzięki metodzie statycznej getDefaultToolkit()
Przykład import java.awt.*; import java.applet.*; import java.net.*; public class PobieranieObrazkow extends Applet { Image obrazek1; Image obrazek2; public void init() { try URL adres = new URL(this.getCodeBase(), this.getParameter("Obrazek1")); this.obrazek1 = this.getImage(adres);
Przykład c.d. Toolkit tk = java.awt.Toolkit.getDefaultToolkit(); adres = new URL(this.getCodeBase(), this.getParameter("Obrazek2")); obrazek2 = tk.getImage(adres); } catch(MalformedURLException e){} public void paint(Graphics g) { g.drawImage(obrazek1,0,0,this); // int szerokosc = obrazek1.getWidth(this); g.drawString("I jego najlepszy kumpel ;-)",50,180); g.drawImage(obrazek2,0,200,this);
Ładowanie dźwięku Ładowanie dźwięku możliwe jest porzez intefejs AudioClip pakietu Applet. Obsługiwanym przez Java API formatem począwszy od wersji 1.2 są: AIFF, AU (jednokanałowy, 8 bitowy, µlaw, 8000 Hz), WAV, MIDI (typ 0 i typ 1), RMF. Narzędziem umożliwiającym konwersję różnych formatów na ten format jest audiotool.
Ładowanie dźwięku - metody Utworzenie obiektu umożliwiającego odtwarzanie dźwięku dokonywane jest poprzez dwie metody: AudioClip getAudioClip(URL adres) AudioClip getAudioClip(URL adres, String nazwa) Interfejs AudioClip zawiera metody: void loop() play: void play(URL adres) void play(URL adres, String nazwa) void stop()
Przykład AudioClip dzwiek = this.getAudioClip(this.getCodeBase(),"Aplety/muzyka.au"); public void start() { if(loop == false) { dzwiek.loop(); loop = true; }} public void stop() { if(loop) dzwiek.stop(); loop = false;
Wyświetlanie dokumentów Za pomocą klasy AppletContext możliwe jest wyświetlanie dolumentów HTML w okienie przęgladarki. Służą do tego dwie metody: public void showDocument(URL adres) public void showDocument(URL adres, String doceloweOkno) Parametr doceloweOkno może mieć wartości: "_blank" "nazwaOkna" "_self" "_parent" "_top"
Wyświetlanie dokumentów - przykład AppletContext kontekst = this.getAppletContext(); String typOkna; if (jcbOkno.getSelectedItem().toString().equalsIgnoreCase("Nowe Okno")) typOkna = "_blank"; else typOkna = "_self"; try{ URL sciezka = new URL(this.getCodeBase() + "Aplety/dokumenty/" + jcbDokumenty.getSelectedItem().toString()); System.out.println(this.getCodeBase() + "Aplety/dokumenty/" + jcbDokumenty.getSelectedItem().toString()); System.out.println(typOkna); kontekst.showDocument(sciezka, typOkna); } catch(MalformedURLException e) {}
Przesyłanie danych pomiędzy apletami Z przesyłaniem danych pomiędzy apletami wiążą się następujące restrykcje.: Wiele przeglądarek wymaga, aby aplety pochodziły z tego samego serwera Wiele przeglądarek wymaga, aby aplety miały tą samą bazę kodową Java API wymaga, aby aplety były uruchomione na tej samej stronie w tym samym oknie przeglądarki
Przesyłanie danych pomiędzy apletami Znajdowanie apleta opiera się o sprawdzenie jego nazwy przy wykorzystaniu metody getApplet klasy AppletContext. Znalezienie apletu poprzez pobranie adresu jego obiektu jest jednoznaczne z możliwością wywoływania jego metod. Nazwę apletu podajemu w tagu <APPLET> jako atrybut NAME <APPLET codebase="classes" code="Aplety/PobieranieObrazkow.class" width=300 height=470 name="pobieranieObrazkow" >
Przesyłanie danych pomiędzy apletami - przykład this.showStatus("Zostaly przeslane dane!!!"); Applet aplet = getAppletContext().getApplet("odbiorca"); ((ApletPrzesylanieOdbiorca)aplet).ustawPrzeslaneDane(jtaDane.getText()); public void ustawPrzeslaneDane(String tekst) { jtaDane.setSelectedTextColor(java.awt.Color.RED); jtaDane.setText(tekst); Applet aplet = getAppletContext().getApplet("nadawca"); ((ApletPrzesylanieNadawca)aplet).ustawPrzeslaneDane("DZIĘKI ZA PRZESŁANIE DANYCH!!!"); }
Aplety wielowątkowe W związku z tym, że dla utworzenia apletu konieczne jest dziedziczenia po klasie Applet lub JApplet dla pisania apletów wielowątkowych wykorzystujemy interfejs Runnable. public class ApletWielowatkowy extends Applet implements Runnable
Aplety wielowątkowe - przykład Thread watek = new Thread(this); watek.start(); …. public void run() { while(true) { try { repaint(); Thread.currentThread().sleep(5000); dorysujTrzeci = true; dzwiek.play(); } catch(InterruptedException e){} }