Title: Java applet (c.d.)
1Java applet (c.d.)
- Nguyen Hung Son
- Uniwersytet Warszawski
2Tematy
- Wielowatkowosc
- Animacja
- Zasada pracy w sieci
- Klasa URL
- Praca z plikami przez siec
3Wielowatkowosc
- Multithreading
- to mozliwosc jednoczesnego uruchamiania
oddzielnych modulów programu oraz ich dalszego
równoleglego dzialania - Na komputerach jednoprocesorowych wykonanie
programów wielowatkowych jest tylko emulowane,
t.j. naprzemienne przydzielanie czasu procesora
poszczególnym watkom wg. pewnego algorytmu
(zaimplementowanego w systemie operacyjnym). - To, w jakim stopniu watek bedzie mógl
wykorzystywac procesor, zalezy od priorytetu
watku.
4Wielowatkowosc
- Program wielowatkowy definiujemy na dwa sposoby
- jako podklase klasy Thread
- implementujac interfejs Runnable.
- Wszystkie zadania, jakie ma wykonywac watek
umieszczone sa w metodzie run() watku. - Po utworzeniu i inicjalizacji watku, srodowisko
przetwarzania wywoluje metode run. - Metoda run() czesto zawiera petle. Na przyklad,
- w watku odpowiedzialnym za animacje, petla w
metodzie run moze wyswietlac serie obrazków. - Niekiedy metoda run watku wykonuje operacje,
które zajmuja duzo czasu np. ladowanie i
odgrywanie dzwieków lub filmów.
5Przyklad 1- dziedziczenie klasy Thread
- class Watek extends Thread
-
- String wciecie ""
- public Watek(String str, int numer)
- super(str)
- for (int i 1 i lt numer i) wciecie
wciecie -
- public void run()
- for (int i 0 i lt 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" ) -
6Przyklad 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
7Przyklad 2 - implementuje Runable
- Definicja interfejsu Runnable
- public interface java.lang.Runnable
- // Metody
- public abstract void run()
-
- Przyklad klasy implementujacej interfejs
Runnable - class MojaKlasa extends Applet implements
Runnable -
- public void run()
-
- //cialo metody run
-
- //... inne metody klasy MojaKlasa
8Przyklad 2
- class WatekPodstawowy implements Runnable
-
- String wysun ""
- Thread biezacy
- public WatekPodstawowy( int numer)
- biezacy Thread.currentThread()
- for (int i 1 i lt numer i) wysun wysun
"\t" -
- public void run()
- for (int i 0 i lt 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" ) -
9Przyklad 2
- public class DrugiWielowatkowy
-
- // tylko do pól statycznych klasy mozemy sie
odwolac w - // statycznej metodzie main()
- static Thread watki
- public static void main (String args) throws
Exception -
- watki new Thread4
- watki0 new Thread( new WatekPodstawowy(1),"
Janek") - watki1 new Thread( new WatekPodstawowy(2),"
Magda") - watki2 new Thread( new WatekPodstawowy(3),"
Wacek") - watki3 new Thread( new WatekPodstawowy(4),"
Ola") - // uruchomienie watków
- for (int i0 ilt4 i)
- watkii.start()
- pauza()
-
- static void pauza() throws Exception
10Stany watku
W czasie swego istnienia watek moze znajdowac sie
w jednym z kilku stanów
- nowy watek
- wykonywany
- nie wykonywany
- zakonczony
- Metoda isAlive true, gdy watek zostal
uruchomiony a nie zostal jeszcze zakonczony.
11Efekty specjalne
- Aby ozywic applet, mozemy dolaczyc nastepujace
efekty - dzwiekowy
- wizyjny
- animacyjny
12Szablon apleta z animacja
- class Aplet_Animacja extends 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
chwile do nast. ramki public void
paint(Graphics g) //narysuj aktualna
ramke
13Przyklad apletu
- import java.awt.import java.applet.public
class film extends Applet - implements Runnable / deklaracja
zmiennych programu / Thread
animacja / watek programu /
int stan / stan wykonywanego
programu / Color kolor_planszy /
kolor planszy / int nr_kadru /
nr wyswietlanego kadru /
int nr_filmu / nr wyswietlanej
animacji / int szybkosc /
szybkosc 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 fontnew java.awt.Font("TimesRoma
n",Font.PLAIN,15)
14Init
- public void init()
- / inicjacja zmiennych programu /
kolor_planszyColor.blue
stan0 nr_kadru1
nr_filmu1 animacjanull
brak_muzykitrue/ okreslenie parametru
uruchomienia programu / String
atrybutgetParameter("szybkosc_animacji")
if (atrybutnull) szybkosc500
else szybkosc(Integer.valueOf(
atrybut).intValue()/ pliki graficzne
umieszczamy w biezacym katalogu /
A_kadr1getImage(getCodeBase(),"./A_kadr1.gif")
A_kadr2getImage(getCodeBase(),"./A_kadr2.
gif") B_kadr1getImage(getCodeBase(),"./
B_kadr1.gif") B_kadr2getImage(getCodeBa
se(),"./B_kadr2.gif")
B_kadr3getImage(getCodeBase(),"./B_kadr3.gif")
B_kadr4getImage(getCodeBase(),"./B_kadr4.
gif") / pliki muzyczne umieszczamy w biezacym
katalogu / muzyka1getAudioClip(getDocum
entBase(),"./muzyka.au")
muzyka2getAudioClip(getDocumentBase(),"./ach.au")
/ okresla rozmiar pola wyswietlanego
programu / resize(310,90)
15Sterowanie dzwiekiem i animacji
- / ustawienie sciezki dzwiekowej /public void
dzwiek() if (brak_muzykitrue)
if (nr_filmu1)
muzyka1.loop() else
muzyka2.loop() brak_muzykifalse
- / aktualizacja strony graficznej
programu / - public void update(Graphics g) if
(nr_filmu1) / wyswietla pierwsza
animacje / - switch (nr_kadru) case 1
g.drawImage(A_kadr1,50,30,this)
nr_kadru2 break case 2
g.drawImage(A_kadr2,50,30,this)
nr_kadru1 break -
else /wyswietla druga aminacje/ switch
(nr_kadru) case 1 g.drawImage(B_kadr1,
50,30,this) nr_kadru2 break
case 2 g.drawImage(B_kadr2,50,30,this)
nr_kadru3 break case
3 g.drawImage(B_kadr3,50,30,this) n
r_kadru4 break case
4 g.drawImage(B_kadr4,50,30,this) n
r_kadru1 break paint(g)
16Obsluga apletu
- public void paint(Graphics g)
- / rysuje plansze / if (stan0)
g.setColor(kolor_planszy)
g.fillRect(10,10,300,80) g.setColor(Col
or.green) g.fillRect(150,30,145,30)
g.setColor(Color.black) g.setFont(fon
t) g.drawString("ZMIANA
ANIMACJI",160,50) stan1
/ w momencie wcisniecia przycisku myszki na
odpowiednim polu ekranu nastepuje zmiana
wyswietlanej animacji i odtwarzanej muzyki
/public boolean mouseDown(Event evt, int xx,
int yy) if (xxgt150xxlt295yygt30yylt60)
if (nr_filmu1)
nr_filmu2 muzyka1.stop()
else
nr_filmu1 muzyka2.stop()
brak_muzykitrue
repaint() return true
public void start()
animacjanew 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()
17Zasada pracy w sieci
- Koncepcja klient/serwer
- serwer dostarcza naszemu programowi klienta
potrzebnych danych np. - pliki, gdy laczymy sie z serwerem FTP,
- poczta elektroniczna przyslana do nas (serwer
POP), - strony WWW (serwer HTTP),
- mozemy takze wyslac dane do serwera
- np. polaczenie z serwerem SMTP pozwala nam na
wyslanie poczty elektronicznej - Aby skorzystac z tych uslug na nasz komputer musi
obslugiwac protokoly TCP i UDP.
18Zasada pracy w sieci (c.d.)
- W Javie czasami korzystamy z mozliwosci
sieciowych bez implementacji ich drugi walor
tego jezyka - pakiet java.net dostarcza mozliwosci sieciowe
- Wazniejsze klasy w tym pakiecie
- URL
- URLConection
- Socket oraz ServerSocket
- DatagramPacket oraz DatagramSocket
- ...
19Klasa URL
- Reprezentuje adres URL(Uniform Resource Locator)
- Obiekty klasy URL posiadaja protokól, host,
nazwa pliku, port komunikacji. Dostep do tych
wlasciwosci jest mozliwy poprzez - getProtocol()
- getHost()
- getFile()
- getPort()
20Klasa URL
- URL ma 4 konstruktory
- URL(String, String, int, String) tworzacy obiekt
URL na podstawie wyspecyfikowanego, odpowiednio
protokolu, nazwy hosta, numeru portu i pliku, - URL(String, String, String) tworzacy obiekt URL
na podstawie wyspecyfikowanego, odpowiednio
protokolu, nazwy hosta i pliku, - URL(String) tworzacy obiekt URL dla adresu
reprezentowanego w postaci lancucha znakowego, - URL(URL, String) tworzacy obiekt URL na
podstawie bazowego adresu URL (obiekt typu URL) i
relatywnego adresu URL.
21Klasa URL - Przyklad
- Prosty sposób
- URL mojAdres new URL(http//alfa.mimuw.edu.pl/
son/index.htm) - Mozna tez
- URL mojProvider new URL(http//alfa.mimuw.edu.
pl) - URL mojAdres new URL(mojProvider,
/son/index.htm) - Mozna stworzyc obiekt URL odnoszacy sie do
wybranego miejsca na stronie HTML (anchor) - URL koniecMojejStrony new URL(mojaStrona,
"KONIEC_STRONY") - Mozna sprecyzowac port polaczen
- URL mojaStrona new URL("http","alfa.mimuw.edu.p
l",80,"/son/index.htm")
22Akcje zwiazane z obiektami URL
- Wyswielanie strony z podanym URL za pomoca
przegladarki Internetowej - Otwieranie polaczenia do danego adresu, dzieki
któremu mozemy czytac i zapisywac dane !!! - Utworzenie kanalu komunikacyjnego w aplikacjach
typu klient - serwer. - ...
23Wyswietlanie 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")
-
- ...
24Wyswietlanie strony z Appletu
- Metoda getAppletContext() zwraca obiekt typu
AppletContext umozliwiajacy dostep do
przegladarki, w której uruchamiany jest applet. - Obiekt typu AppletContext maja metode
showDocument(URL url, String target) - parametry metody showDocument
- "_self" wyswietla dokument w biezacym oknie
- "_parent" wyswietla w biezacej ramce (ang.
frame) - "_top" wyswietla w szczytowej ramce
- "_blank" wyswietla w nowym oknie bez nazwy
- name wyswietla w nowym oknie o nazwie name
25Polaczenie ze strona
- metoda openConection() zwraca referencje do
obiektu typu URLConnection, dzieki któremu mozemy
czytac i zapisywac dane, z utworzonego
polaczenia. Np.URLConnection polaczenie
mojAdres.openConnection() - mozna utworzyc strumien dla danego polaczenia
- getInputStream
- public InputStream getInputStream() throws
IOException - getOutputStream
- public OutputStream getOutputStream() throws
IOException - wyjatki sie pojawiaja wtedy, gdy serwer nie
obsluguje operacji wejsciowych lub wyjsciowych.
26Przyklad 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/") - URLConnection polaczenie mojURL.openConnectio
n() - BufferedReader br new BufferedReader(new
- InputStreamReader(polaczenieDoFriko.getInputSt
ream())) - 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)
-