java.applet.Applet 의 네트워크 메쏘드들 6장

Download Report

Transcript java.applet.Applet 의 네트워크 메쏘드들 6장

6장
java.applet.Applet의
네트워크 메쏘드들
발표자 : 최용준, 박학수
SE Lab
목차
Applet
 Data download하기 위한 Methods
 ImageObserver Interface
 MediaTracker Class
 AppletContext Interface
 유용한 프로그램들(ImageSizer)

SE Lab
2
Applet의 기초(1/5)

특징
– Main() 메소드를 갖지 않음
– WWW 검색기, Appletviewer의 데이터 창에서만
수행되는 제한된 프로그램
– 생성되고 실행이 종료될 때까지 일정한 동작을 반
복하는 Applet life cycle
– 실행 명령에 의해 실행되지 않고, WWW의 HTML
코드 내에서 호출되어 실행되는 형태
– Applet class는 항상 public으로 선언
SE Lab
3
Applet의 기초(2/5)

Applet과 Application의 비교
– Applet
• WWW 브라우져 내에서만 실행, HTML Tag를
사용해서 내장
• Main method가 존재하지 않음
• Main에 해당하는 부분은 브라우저 내에 포함되
어 있다가 이벤트가 발생했을 때마다 실행
– Application
• 자바 인터프리터 사용, 독립적 실행
SE Lab
4
Applet의 기초(3/5)

Applet Class
Java.lang.Object
Java.awt.Component
Java.awt.Container
추상클래스
Java.awt.Panel
Java.applet.Applet
Panel Class로부터 상속
SE Lab
5
Applet의 기초(4/5)

Applet Class’s Method
메소드
설
명
Void init()
애플릿을 초기화
Void start()
애플릿을 시작
Void stop()
애플릿을 중단
Vlid destroy()
애플릿을 끝낸다.
URL getCodeBase()
애플릿 코드가 있는 URL 객체 반환
URL getDocumentBase()
HTML 문서가 있는 URL 객체 반환
Image getImage(URL url)
url(파일이름 포함)이 지정하는 곳에서 이미
지를 가져와 Image 객체로 반환
Image getParameter(String
pName)
애플릿이 호출시 사용한 매개변수 중
pName 매개변수의 값을 반환
SE Lab
6
Applet의 기초(5/5)

Applet’s Lifecycle
처음 방문시
애플릿 페이지로 복귀할 때
애플릿을 종료
Init()
start()
stop()
destroy()
페이지를 떠날 때
paint()
Paint() 메소드는 애플릿에 그래픽을 출력하기
위한 메소드이다. Start() 또는 init()에 의해
자동으로 호출되어 수행된다.
SE Lab
7
Applet에서의 HTML(1/3)

Applet Tag
– CODEBASE : Applet 파일이 로드될 디렉토리를 지정하는
속성
– CODE : 실행을 원하는 애플릿 파일을 지정
– ALT : 검색기가 Applet을 실행할 수 없을 때 나타낼 메시지
를 지정
– NAME : Applet 객체의 이름을 지정
– WIDTH와 HEIGHT : 검색기의 데이터 창에 나타낼 Applet의
크기를 지정
– PARAM NAME과 VALUE : Applet에 넘겨줄 데이터를 지정
SE Lab
8
Applet에서의 HTML(2/3)

HTML 예제
<html>
<head>
<title>ImageMapApplet</title>
</head>
<body>
<h1>ImageMapApplet</h1>
<applet code=ImageMapApplet width=300 height=80>
<param name=filename value=mapfile.gif>
</applet>
</body>
</html>
SE Lab
9
Applet에서의 HTML(3/3)

경로지정방식
– 절대 경로 형식
<applet codebase=“c:\applet\class” code=“test.class”
width=200 height=80>
</applet>
– 상대 경로 형식
<applet codebase=“class” code=“test.class” width=200
height=80>
</applet>
SE Lab
10
Applet에서의 Thread(1/4)

Process와 Thread
– Process
실행중인 하나의 프로그램
– Thread
• Process내에서 순차적으로 동작하는 문장들의 단일 집
합(경량 프로세스)
• 하나의 프로세스에 하나 이상의 스레드 생성
(다중 스레드)
SE Lab
11
Applet에서의 Thread(2/4)

Thread의 lifecycle
완료
Start()
생성
실행 상태
실행가능
`
상태
SE Lab
Sleep(), wait(), suspend(),
입출력등
대기
notify(), notifyAll()
resume(), 입출력 완료 등
12
Applet에서의 Thread(3/4)

Thread 생성(1/2)
– Thread Class 이용
• 클래스 생성하는 예
class ThreadA extends Thread {
public void run() {
}
}
• 객체 생성하는 예
ThreadA ta = new ThreadA();
ta.start();
SE Lab
13
Applet에서의 Thread(4/4)

Thread 생성(2/2)
– Runnable Interface 이용
• 클래스 생성하는 예
class RunnableB extends Applet implements Runnable
{
public void run() {
}
}
• 객체 생성하는 예
RunnableB rb = new RunnableB();
new Thread(rb).start();
SE Lab
14
Data Download

관련된 정보 가져오기
– getDocumentBase()
– getCodeBase()

이미지 다운로드
– getImage()

사운드 다운로드
– play()
– getAudioClip()
SE Lab
15
관련된 정보 가져오기

Public URL getDocumentBase()
애플릿을 내장하고 있는 웹 문서의 URL을 반환
Public void paint(Graphic g) {
g.drawString(getDocumentBase().toString(), 25, 50);
}

Public URL getCodeBase()
애플릿 디렉토리의 URL을 반환

실행 예(AppletBases)
SE Lab
16
이미지 다운로드하기(1/2)

Public Image getImage(URL u)
지정된 URL에 있는 이미지 데이터를 가져와 Image
객체 안에 저장
URL u = new URL(“http://www.macfaq.com/logo.gif)
Image myLogo = getImage(u)
 실행
예(ImageView)
SE Lab
17
이미지 다운로드하기(2/2)

Public Image getImage(URL u,
String filename)
1.
2.
3.
Image myLogo = getImage(new
URL(“http://www.macfaq.com/”), “logo.gif”);
Image myImage = getImage(getCodeBase(),
“logo.gif”);
Image myImage = getImage(getDocumentsBase(),
“logo.gif”);
SE Lab
18
사운드 다운로드하기(1/4)

Public void play(URL u)
URL에 있는 사운드 파일을 찾아서 다운로드 받아
재생시킨다.
try {
play(new URL(“http://www.macfaq.com/sounds/gong.au”);
}
catch (MalformedURLException e) {
System.err.println(e);
}
SE Lab
19
사운드 다운로드하기(2/4)

Public void play(URL u, String filename)
URL u는 사운드 파일의 디렉토리를 알기 위해,
실제 파일이름을 알기 위해 String filename을 사용
try {
play(new URL(“http://www.macfaq.com/sounds”),
“gong.au); }
catch(MalformedURLException e) {
System.err.println(e); }
SE Lab
20
사운드 다운로드하기(3/4)

Public AudioClip getAudioClip(URL u)
AudioClip theGong;
URL u;
try {
u=new URL(http://sunsite.unc.edu/javafaq/gong.au);
theGong = getAudioClip(u);
}
catch(MalformedURLException e) {
System.err.println(e);
}
SE Lab
21
사운드 다운로드하기(4/4)
 Public
AudioClip getAudioClip
(URL u, String filename)
AudioClip ac = getAudioClip(new
URL(“http://www.macfaq.com/”), “gong.au”);

실행 예(RelativeGong)
SE Lab
22
ImageObserver Interface(1/2)

ImageObserver Interface



이미지 적재의 진행과정을 모니터한다.
준비가 되면 그리기를 실행한다.
imageUpdate()
이미지의 상태 체크, 응답
public boolean imageUpdate(Image img, int
infoflags, int x, int y, int width, int height);


실행 예(ShowImage)
SE Lab
23
ImageObserver Interface(2/2)

ImageObserver 상수들
flag
Flag가 설정되었을 때의 의미
.WIDTH
Width 인자를 통해 이미지의 넓이를 알 수 있다.
.HEIGHT
Height 인자를 통해 이미지의 높이를 알 수 있다.
.PROPERTIES
이미지 속성들에 대한 정보가 이용 가능하다.
.SOMEBITS
이미지를 그리기 위해 필요한 일부분이 전송되었다.
.FRAMEBITS
이미지의 여러 개 프레임중 하나가 이용 가능하다.
.ALLBITS
이미지 완성
.ERROR
이미지 적재중 에러 발생
.ABORT
이미지가 완성되기 전에 적재는 포기되었다.
SE Lab
24
MediaTracker Class(1/10)
ImageObserver와 MediaTracker

–
하나의 이미지 파일을 모니터하는데는 ImgaeObserver 인
터페이스가 유용
이미지가 여러장이거나, 오디오파일같은 매체 유형인 경
우 MediaTracker가 유용
–

MediaTracker Class 사용방법
1.
2.
3.
MediaTracker 인스턴스 생성
Track에 이미지를 추가하기 위해 addImage() 사용
Image에 수치 id를 부여, 그룹일 경우 그룹에 하나의 id 부
여
SE Lab
25
MediaTracker Class(2/10)

실행 예(trackImage)

생성자
Public MediaTracker(Component comp)
예)
MediaTracker theTracker = new MediaTracker(this);
SE Lab
26
MediaTracker Class(3/10)

MediaTracker에 이미지 추가하기
– Public void addImage(Image img, int id)
Image thePicture = getImage(getDocumentBase(), “logo.gif”);
MediaTracker theTracker = new MediaTracker(this);
theTracker.addImage(thePicture, 1)
– Public synchronized void addImage(Image img,
int id, int w, int h)
Image thePicture = getImage(getDocumentBase(), “logo.gif”);
MediaTracker theTracker = new MediaTracker(this);
theTracker.addImage(thePicture, 1, 30, 30)
SE Lab
27
MediaTracker Class(4/10)

매체의 상태 체크하기(1/2)
– Public boolean checkID(int id)
Public void paint(Graphic g) {
if(theTracker.checkID(1)) {
g.drawImage(thePicture.0,0,this);
}
else {
g.drawString(“Loading Picture, Please hang on”, 25,50); }
}
– Public synchronized boolean checkID(int id,
boolean load)
boolean load : true면 아직 적재되지 않은 id의 모든 이미지들이
적재되기 시작할 것이다.
SE Lab
28
MediaTracker Class(5/10)

매체의 상태 체크하기(2/2)
– Public boolean checkAll()
• 객체들에 의해 추적되고 있는 이미지들이 적재를 마쳤는지를
체크
• Id번호는 고려되지 않는다.
– Public synchronized boolean checkAll(
boolean load)
• 적재를 마쳤으면 true, 그렇지 않으면 false를 반환
• Boolean load 인자가 true면 아직 적재되지 않은 이미지
들이 적재를 시작한다.
SE Lab
29
MediaTracker Class(6/10)

매체가 적재되기를 기다리기
– Public void waitForID(int id)
throws InterruptedException
– Public synchronized boolean waitForID(int id, long ms)
throws InterruptedException
– Public synchronized boolean waitForAll()
throws InterruptedException
– Public synchronized boolean waitForAll(long ms)
throws InterruptedException
SE Lab
30
MediaTracker Class(7/10)

에러 체크하기(1/2)
– Public synchronized boolean isErrorAny()
If (theTracker.isErrorAny()) {
System.err.println(“There was an error while loading
media”); }
– Public synchronized Object[] getErrorsAny()
If (theTracker.isErrorAny()) {
System.err.println(“The follow media encountered errors while
loading”);
Object[] failedMedia = theTracker.getErrorsAny();
For (int I = 0 ; I<10 ; I++) {
System.err.println(failedMedia[]); }
}
SE Lab
31
MediaTracker Class(8/10)

에러 체크하기(2/2)
– Public synchronized boolean isErrorID(int id)
If (theTracker.isErrorID(2)) {
System.err.println(“There was an error while loading media
with ID” + 2); }
– Public synchronized Object[] getErrorsID(int id)
If (theTracker.isErrorsID(2)) {
System.err.println(“The follow media encountered errors while
loading”);
Object[] failedMedia = theTracker.getErrorsID(2);
For (int I = 0 ; I<10 ; I++) {
System.err.println(failedMedia[i]); }
}
SE Lab
32
MediaTracker Class(9/10)

매체의 상태 체크하기(1)
– 매체 상태 상수
상 수
값
의 미
MediaTracker.LOADING
1
그룹안에 최소한 하나 이상의 이미지 다운로드
중이다.
MediaTracker.ABORTED
2
그룹안에 최소한 하나 이상의 이미지 적재 프로
세스가 포기되었다.
MediaTracker.ERRORED
4
그룹안에 있는 최소한 하나 이상의 이미지가 적
재 중 에러 발생되었다.
MediaTracker.COMPLETE
8
그룹안에 있는 최소한 하나 이상의 이미지가 성
공적으로 다운로드되었다.
SE Lab
33
MediaTracker Class(10/10)

Public int statusAll(boolean load)
MediaTracker 객체에 의해 추적되는 모든 매체의 상태를 반환
If ((m.statusAll(false) & ImageObserver.COMPLETED) ==
ImageObserver.COMPLETED) {…}

Public int statusAll(int id, boolean load)
추적되는 id 번호를 가진 매체의 상태를 반환
If ((m.statusAll(2, false) & ImageObserver.COMPLETED)
== ImageObserver.COMPLETED) {…}
SE Lab
34
AppletContext 인터페이스의
네트워크 메쏘드들

AppletContext Interface
– 애플릿으로 하여금 자신이 실행되고 있는 환경을
조작할 수 있도록 해주는 인터페이스
– Public void showDocument(URL u)
– Public void showDocument(URL u, String name)

실행 예(Redirector2)
SE Lab
35
유용한 프로그램들

Animator
1.
Animator라는 간단한 에니메이션 에플릿이나, 이것은 애플릿의 <param> 태
그에서 파일 이름들의 목록을 읽는다.(cell0, cell1, cell2, ..)
init()은 존재하지 않는 파일 이름을 발견할 때까지 파라미터를 읽는다.
파일 이름과 문서베이스로 URL을 만들고, getImage()로 이미지를 가져온다.
이미지 객체가 몇 개인지 모르므로, vector에 저장
다운로드된 이미지들은 MediaTracker theTracker에 추가
TheTracker의 checkAll() 메소드는 이미지 적재를 시작하고, 이미지를 연속
적으로 보여주기 위해 새로운 쓰레드가 만들어진다.
이미지를 그리기 전에 run() 메소드는 준비되었는지 확인하기 위해
theTracker.waitForID()를 호출한다.
2.
3.
4.
5.
6.
7.
SE Lab
36