1 / 26

Java applet (c.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 :

jared
Download Presentation

Java applet (c.d.)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Java applet (c.d.) Nguyen Hung Son Uniwersytet Warszawski

  2. Tematy • Wielowątkowość • Animacja • Zasada pracy w sieci • Klasa URL • Praca z plikami przez sieć

  3. 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.

  4. 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.

  5. 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" ); } }

  6. 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{} }

  7. 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 }

  8. 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" ); } }

  9. 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 {} }

  10. 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.

  11. Efekty specjalne • Aby ożywić applet, możemy dołączyć następujące efekty: • dźwiękowy • wizyjny • animacyjny

  12. 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ę } }

  13. 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);

  14. 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);}

  15. 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;                    } }

  16. 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;  } 

  17. 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.

  18. 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 • ...

  19. 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()

  20. 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.

  21. 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");

  22. 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. • ...

  23. 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"); } ... }

  24. 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

  25. 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.

  26. 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);} } }

More Related