260 likes | 383 Views
Java applet (c.d.). Nguyen Hung Son Uniwersytet Warszawski. Tematy. Wielowątkowość Animacja Zasada pracy w sieci Klasa URL Praca z plikami przez sieć. Wielowątkowość. Multithreading :
E N D
Java applet (c.d.) Nguyen Hung Son Uniwersytet Warszawski
Tematy • Wielowątkowość • Animacja • Zasada pracy w sieci • Klasa URL • Praca z plikami przez sieć
Wielowątkowość • Multithreading: • to możliwość jednoczesnego uruchamiania oddzielnych modułów programu oraz ich dalszego równoległego działania • Na komputerach jednoprocesorowych wykonanie programów wielowątkowych jest tylko emulowane, t.j. naprzemienne przydzielanie czasu procesora poszczególnym wątkom wg. pewnego algorytmu (zaimplementowanego w systemie operacyjnym). • To, w jakim stopniu wątek będzie mógł wykorzystywać procesor, zależy od priorytetu wątku.
Wielowątkowość • Program wielowątkowy definiujemy na dwa sposoby: • jako podklasę klasy Thread; • implementując interfejs Runnable. • Wszystkie zadania, jakie ma wykonywać wątek umieszczone są w metodzie run() wątku. • Po utworzeniu i inicjalizacji wątku, środowisko przetwarzania wywołuje metodę run. • Metodarun() często zawiera pętlę. Na przykład, w wątku odpowiedzialnym za animację, pętla w metodzie run może wyświetlać serię obrazków. • Niekiedy metoda run wątku wykonuje operacje, które zajmują dużo czasu np. ładowanie i odgrywanie dźwięków lub filmów.
Przykład 1- dziedziczenie klasy Thread class Watek extends Thread { String wciecie = ""; public Watek(String str, int numer) { super(str); for (int i = 1; i < numer; i++) wciecie = wciecie + ” ”; } public void run() { for (int i = 0; i < 4; i++) { System.out.println(wciecie + i + ”. " + getName()); try { sleep( (int)(Math.random() * 1000) ); }catch ( InterruptedException e ) { e.printStackTrace(); } } System.out.println(wciecie + getName()+ " koniec" ); } }
Przykład 1 class ProgramWielowatkowy { public static void main (String[] args) throws Exception { new Watek("Janek",1).start(); new Watek("Magda",2).start(); new Watek("Wacek",3).start(); new Watek("Ola",4).start(); pauza(); } static void pauza() throws Exception{} }
Przykład 2 - implementuje Runable • Definicja interfejsu Runnable : public interface java.lang.Runnable { // Metody public abstract void run(); } • Przykład klasy implementującej interfejs Runnable: class MojaKlasa extends Applet implements Runnable { public void run() { //ciało metody run } //... inne metody klasy MojaKlasa }
Przykład 2 class WatekPodstawowy implements Runnable { String wysun = ""; Thread biezacy; public WatekPodstawowy( int numer) { biezacy = Thread.currentThread(); for (int i = 1; i < numer; i++) wysun = wysun + "\t"; } public void run() { for (int i = 0; i < 4; i++) { System.out.println(wysun + i + " " + biezacy.getName()); try { biezacy.sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) {} } System.out.println(wysun + biezacy.getName()+ " koniec" ); } }
Przykład 2 public class DrugiWielowatkowy { // tylko do pól statycznych klasy możemy się odwołać w // statycznej metodzie main() static Thread watki[]; public static void main (String[] args) throws Exception { watki = new Thread[4]; watki[0] = new Thread( new WatekPodstawowy(1),"Janek"); watki[1] = new Thread( new WatekPodstawowy(2),"Magda"); watki[2] = new Thread( new WatekPodstawowy(3),"Wacek"); watki[3] = new Thread( new WatekPodstawowy(4),"Ola"); // uruchomienie wątków for (int i=0; i<4; i++) watki[i].start(); pauza(); } static void pauza() throws Exception {} }
Stany wątku W czasie swego istnienia wątek może znajdować się w jednym z kilku stanów: • nowy wątek • wykonywany • nie wykonywany • zakończony • Metoda isAlive: true, gdy wątek został uruchomiony a nie został jeszcze zakończony.
Efekty specjalne • Aby ożywić applet, możemy dołączyć następujące efekty: • dźwiękowy • wizyjny • animacyjny
Szablon apleta z animacją classAplet_Animacjaextends Applet implements Runnable { Thread animator; public void init() { animator = new Thread(this); } public void start() { if (animator.isAlive()) animator.resume(); else animator.start(); } public void stop() { animator.suspend(); } public void destroy() { animator.stop(); } public void run() { while (true) { repaint(); Thread.sleep(500); // czekaj chwilę do nast. ramki } } public void paint(Graphics g) { //narysuj aktualną ramkę } }
Przykład apletu import java.awt.*;import java.applet.*;public class film extends Applet implements Runnable { /* deklaracja zmiennych programu */ Thread animacja; /* wątek programu */ int stan; /* stan wykonywanego programu */ Color kolor_planszy; /* kolor planszy */ int nr_kadru; /* nr wyświetlanego kadru */ int nr_filmu; /* nr wyświetlanej animacji */ int szybkosc; /* szybkość animacji */ /* obrazki animacji 1 */Image A_kadr1, A_kadr2; /* obrazki animacji 2 */ Image B_kadr1, B_kadr2, B_kadr3, B_kadr4; /* melodyjki odtwarzane w czasie aminacji */ AudioClip muzyka1; AudioClip muzyka2; boolean brak_muzyki; /* parametry tekstu */ Font font=new java.awt.Font("TimesRoman",Font.PLAIN,15);
Init public void init() { /* inicjacja zmiennych programu */ kolor_planszy=Color.blue; stan=0; nr_kadru=1; nr_filmu=1; animacja=null; brak_muzyki=true;/* określenie parametru uruchomienia programu */ String atrybut=getParameter("szybkosc_animacji");if (atrybut==null) szybkosc=500;else szybkosc=(Integer.valueOf(atrybut).intValue();/* pliki graficzne umieszczamy w bieżącym katalogu */ A_kadr1=getImage(getCodeBase(),"./A_kadr1.gif"); A_kadr2=getImage(getCodeBase(),"./A_kadr2.gif"); B_kadr1=getImage(getCodeBase(),"./B_kadr1.gif"); B_kadr2=getImage(getCodeBase(),"./B_kadr2.gif"); B_kadr3=getImage(getCodeBase(),"./B_kadr3.gif"); B_kadr4=getImage(getCodeBase(),"./B_kadr4.gif"); /* pliki muzyczne umieszczamy w bieżącym katalogu */ muzyka1=getAudioClip(getDocumentBase(),"./muzyka.au"); muzyka2=getAudioClip(getDocumentBase(),"./ach.au");/* określa rozmiar pola wyświetlanego programu */ resize(310,90);}
Sterowanie dźwiękiem i animacji else {/*wyświetla drugą aminacje*/ switch (nr_kadru){ case 1: g.drawImage(B_kadr1,50,30,this); nr_kadru=2; break; case 2: g.drawImage(B_kadr2,50,30,this); nr_kadru=3; break; case 3: g.drawImage(B_kadr3,50,30,this); nr_kadru=4; break; case 4: g.drawImage(B_kadr4,50,30,this); nr_kadru=1; break; } } paint(g); } /* ustawienie scieżki dźwiękowej */public void dzwiek() { if (brak_muzyki==true) { if (nr_filmu==1) muzyka1.loop(); else muzyka2.loop(); brak_muzyki=false; } }/* aktualizacja strony graficznej programu */ public void update(Graphics g){ if (nr_filmu==1) { /* wyświetla pierwszą animacje */ switch (nr_kadru) { case 1: g.drawImage(A_kadr1,50,30,this); nr_kadru=2; break; case 2: g.drawImage(A_kadr2,50,30,this); nr_kadru=1; break; } }
Obsługa apletu public void start() { animacja=new Thread(this); animacja.start(); } public void stop() { animacja.stop(); if (muzyka1!=null) { muzyka1.stop(); } if (muzyka2!=null) { muzyka2.stop(); } } public void run() { while(true) { try { Thread.currentThread().sleep(szybkosc); }catch (InterruptedException e ){} dzwiek(); /* aktualizacja grafiki */ repaint(); } } } public void paint(Graphics g) { /* rysuje planszę */ if (stan==0) { g.setColor(kolor_planszy); g.fillRect(10,10,300,80); g.setColor(Color.green); g.fillRect(150,30,145,30); g.setColor(Color.black); g.setFont(font); g.drawString("ZMIANA ANIMACJI",160,50); stan=1; } } /* w momencie wciśnięcia przycisku myszki na odpowiednim polu ekranu następuje zmiana wyświetlanej animacji i odtwarzanej muzyki */public boolean mouseDown(Event evt, int xx, int yy){ if (xx>150&&xx<295&&yy>30&&yy<60) { if (nr_filmu==1) { nr_filmu=2; muzyka1.stop(); } else { nr_filmu=1; muzyka2.stop(); } brak_muzyki=true; } repaint(); return true; }
Zasada pracy w sieci • Koncepcja klient/serwer: • serwer dostarcza naszemu programowi klienta potrzebnych danych: np. • pliki, gdy łączymy się z serwerem FTP, • poczta elektroniczna przysłana do nas (serwer POP), • strony WWW (serwer HTTP), • możemy także wysłać dane do serwera: • np. połączenie z serwerem SMTP pozwala nam na wysłanie poczty elektronicznej • Aby skorzystać z tych usług na nasz komputer musi obsługiwać protokoły TCP i UDP.
Zasada pracy w sieci (c.d.) • W Javie czasami korzystamy z możliwości sieciowych bez implementacji ich: drugi walor tego języka • pakiet java.net dostarcza możliwości sieciowe • Ważniejsze klasy w tym pakiecie: • URL: • URLConection • Socket oraz ServerSocket • DatagramPacket oraz DatagramSocket • ...
Klasa URL • Reprezentuje adres URL(Uniform Resource Locator) • Obiekty klasy URL posiadają: protokół, host, nazwa pliku, port komunikacji. Dostęp do tych właściwości jest możliwy poprzez: • getProtocol() • getHost() • getFile() • getPort()
Klasa URL • URL ma 4 konstruktory: • URL(String, String, int, String)tworzący obiekt URL na podstawie wyspecyfikowanego, odpowiednio: protokołu, nazwy hosta, numeru portu i pliku, • URL(String, String, String)tworzący obiekt URL na podstawie wyspecyfikowanego, odpowiednio: protokołu, nazwy hosta i pliku, • URL(String)tworzący obiekt URL dla adresu reprezentowanego w postaci łańcuchaznakowego, • URL(URL, String)tworzący obiekt URL na podstawie bazowego adresu URL (obiekt typu URL) i relatywnego adresu URL.
Klasa URL - Przykład • Prosty sposób: URL mojAdres = new URL(“http://alfa.mimuw.edu.pl/~son/index.htm”); • Można też: URL mojProvider = new URL(“http://alfa.mimuw.edu.pl”); URL mojAdres = new URL(mojProvider, “/~son/index.htm”); • Można stworzyć obiekt URL odnoszący się do wybranego miejsca na stronie HTML (anchor): URL koniecMojejStrony = new URL(mojaStrona, "#KONIEC_STRONY"); • Można sprecyzować port połączeń URL mojaStrona = new URL("http","alfa.mimuw.edu.pl",80,"/~son/index.htm");
Akcje związane z obiektami URL • Wyświelanie strony z podanym URL za pomocą przeglądarki Internetowej • Otwieranie połączenia do danego adresu, dzięki któremu możemy czytać i zapisywać dane !!! • Utworzenie kanału komunikacyjnego w aplikacjach typu klient - serwer. • ...
Wyświetlanie strony z Appletu public boolean action(Event e, Object arg) { .... try{ URL mojAdres = new URL(http://alfa.mimuw.edu.pl/~son/index.htm); getAppletContext().showDocument(mojAdres,"_self"); } catch (Exception exc){ exc.printStackTrace(); txtCo.setText("Zly adres"); } ... }
Wyświetlanie strony z Appletu • Metoda getAppletContext() zwraca obiekt typu AppletContext umożliwiający dostęp do przeglądarki, w której uruchamiany jest applet. • Obiekt typu AppletContext mają metodę showDocument(URL url, String target) • parametry metody showDocument • "_self" wyświetla dokument w bieżącym oknie • "_parent" wyświetla w bieżącej ramce (ang. frame) • "_top" wyświetla w szczytowej ramce • "_blank" wyświetla w nowym oknie bez nazwy • name wyświetla w nowym oknie o nazwie: name
Połączenie ze stroną • metoda openConection() zwraca referencję do obiektu typu URLConnection, dzięki któremu możemy czytać i zapisywać dane, z utworzonego połączenia. Np.URLConnectionpolaczenie = mojAdres.openConnection(); • można utworzyć strumień dla danego połączenia: • getInputStream public InputStream getInputStream() throws IOException • getOutputStream public OutputStream getOutputStream() throws IOException • wyjątki się pojawiają wtedy, gdy serwer nie obsługuje operacji wejściowych lub wyjściowych.
Przykład popierania danych import java.net.*; import java.io.*; class TestPolaczenia { public static void main(String[] args) { try { URL mojURL = new URL("http://alfa.mimuw.edu.pl/~son/"); URLConnectionpolaczenie = mojURL.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader(polaczenieDoFriko.getInputStream())); String inputLine; while ((inputLine = br.readLine()) != null) { System.out.println(inputLine); } br.close(); } catch (MalformedURLException me) {System.out.println("MalformedURLException: " + me);} catch (IOException ioe) {System.out.println("IOException: " + ioe);} } }