Validator를 사용하여 입력을 점검 할 수 있습니다.


[Source Code]


'etc > old' 카테고리의 다른 글

웹 서버 설치 (Apache 2.2 + Tomcat 6.0 + Mysql + Svn)  (0) 2008.11.05
STRUTS2 - Login with Session  (1) 2008.11.04
Context 와 ThreadLocal  (0) 2008.10.27
Tender Love  (0) 2008.10.21
MP3 플레이어 만들기  (0) 2008.10.19

Web 프로그램을 구현할 때 시작시점에 디버그 플래그를 세팅하면 해당 프로그램이 수행되는 모든 지점에서 로그를 출력하려면 어떻게 해야 할까?
J2EE에서 DB와 같은 리소스를 연동하고 트랜잭션을 관리하기 위해서 J2EE에서는 Context라는 객체를 활용한다. 이러한 Contex는 리소스에 대한 위치 투명성을 제공하고 Two Phase Commit과 같은 분산 트랜잭션을 위한 기본적인 환경을 제공한다.
이러한 Context의 기능을 이용해서 작업을 추적해서 로그를 출력하는 모듈을 개발할 수 있다. 그러면 이러한 Context를 간단하게 구현하려면 어떻게 해야 할까?
이러한 문제를 해결하려면 문제를 조금 다른 관점에서 살펴보는 안목이 필요하다.
Web 프로그램은 Muiti Thread 환경에서 실행되는데 프로그램이 각각의 Thread에서 실행된다.
이러한 각각의 Thread에 변수를 저장하는 방법이 있다면 Context와 비슷한 기능을 하는 모듈을 작성할 수 있다
그리고 이러한 모듈을 활용해서 앞에서 제시한 문제를 해결할 수 있다.
그러면 어떻게 Thread에 변수를 저장할 수 있을까? 바로 java.lang.ThreadLocal이라는 Class를 활용해서 작성할 수 있다.
ThreadLocal은 각각의 Thread별로 변수를 생성할 수 있는 기능을 제공하고 또한 각각의 Thrad에서 접근할 수 있는 API를 제공해 준다. 이러한 ThreadLocal을 이용해서 Thread에 따라 구분되는 Data를 저장하고 활용할 수 있다.

아래는 간단한 ThreadLocal 예제이다.
public class ThreadLocalSample {
    public static void main(String[] args) {
        ThreadLocal local = new ThreadLocal(); 
        local.set("Thread Local변수");
        System.out.println("ThreadLocal변수 : " + local.get() );
    }
}

위와 같이 일반적인 Class와 동일하게 객체를 생성하고 값을 설정하고 읽어온다.
다만 내부적으로 Thread.currentThread()라는 함수로 현재 Thread 객체를 찾아와서 객체를 기준으로 Map에서 값을 읽어오도록 구현이 되어 있다. J2SE 1.4.1의 ThreadLocal의 get()과 set()을 살펴보면 아래와 같다.

public Object get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        return map.get(this);
    // Maps are constructed lazily.  if the map for this thread
    // doesn't exist, create it, with this ThreadLocal and its
    // initial value as its only entry.
    Object value = initialValue();
    createMap(t, value);
    return value;
}

public void set(Object value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}

여기서 중요한 부분은 Thread.currentThread()를 이용하는 부분이다. 사실 Thread.currentThread() 함수를 이용하면 ThradLocal을 어렵지 않게 직접 구현할 수도 있다.

그러면 이러한 ThreadLocal을 이용해서 디버그 flag를 저장하고 읽어오는 함수를 구현해 보자.

public class DebugContext {
    // singleton 객체 생성
    private static DebugContext context = new DebugContext();
    private ThreadLocal info = new ThreadLocal();
   
    private DebugContext() {
    }
   
    // singleton객체 반환 함수
    public static DebugContext getContext() {
        return context;
    }
   
    public void setDebug( boolean debug ) {
        info.set( debug + "" );
    }
   
    public boolean getDebug() {
        return Boolean.valueOf( info.get() ).booleanValue();
    }
}

그러면 이 함수를 이용해서 로깅을 하는 함수를 구현해 보자. 로깅은 단순하게 System.out.println을 이용하겠다.

public class Logger {
    public static void printLog( String s ) {
        if( DebugContext.getContext().getDebug() ) {
            System.out.println( s );
        }
    }
}

테스트 시나리오에서 A.jsp라는 페이지에서 BizTask.getInfo()를 호출하고 BizTask.getInfo()에서는 DAO.select()라는 class를 호출한다고 가정하겠다. 이경우 A.jsp와 두개의 Class에서 출력되는 로그를 한번에 Enable/Disable하기 위해서 위에서 만든 Logger와 DebugContext를 이용해 보겠다.

A.jsp는 아래와 같다

<%
String debug = request.getParameter("debug");
if( debug != null && debug.equals("true") {
 DebugContext.getContext().setDebug( true );
} else {
 DebugContext.getContext().setDebug( false );
}

Logger.printLog( "현재 Thread에서 실행되는 모든 로그 출력 시작");
BizTask task = new BizTask();
Logger.printLog( "BizTask.getInfo() 호출 시작");
task.getInfo();
Logger.printLog( "BizTask.getInfo() 호출 완료");
Logger.printLog( "현재 Thread에서 실행되는 모든 로그 출력 종료");
DebugContext.getContext().setDebug( false ); //
Logger.printLog( "로그 테스트");
%>

BizTask.java는 아래와 같다.

public class BizTask{
 public BizTask() {
  Logger.printLog("BizTask 객체 생성");
 }
 
 public void getInfo() {
  DAO dao = new DAO();
  Logger.printLog("DAO.select() 호출 시작");
  dao.select();
  Logger.printLog("DAO.select() 호출 완료");
 }
}

DAO.java는 아래와 같다.

 public class DAO{
 public DAO() {
  Logger.printLog("DAO 객체 생성");
 }
 
 public void select() {
  Logger.printLog("DAO.select() 실행");
 }
}

A.jsp?bebug=true 라는 주소로 호출하면 아래와 같은 로그가 나오게 된다.

현재 Thread에서 실행되는 모든 로그 출력 시작
BizTask 객체 생성
BizTask.getInfo() 호출 시작
DAO 객체 생성
DAO.select() 호출 시작
DAO.select() 실행
DAO.select() 호출 완료
BizTask.getInfo() 호출 완료
현재 Thread에서 실행되는 모든 로그 출력 종료

A.jsp아래쪽에 있는 로그 테스트 라는 부분은 이미 Context에서 debug플래그가 제거되었기 때문에 출력되지 않는다. 또한 A.jsp?debug=false로 호출하면 아무런 로그도 출력되지 않는다.

이렇게 해서 Context를 구현하는 핵심 방법인 ThreadLoca을 알아보고 ThreadLocal을 이용해서 특정 Thread만 debug flag를 활성화 시키는 방법을 알아보았다. 

아마 코딩 경험이 있으신 분들은눈치 채었겠지만 ThreadLocal을 이용하는 방법은 참 다양하다. 

예를 들어 JDBC Connection을 개발자가 반환하는 것이 아니라 응용프로그램이 종료될 때 일괄로 반환해 주는 기능을 많은 Framework에서 제공하는데 이러한 기능도 ThreadLocal을 이용한다. 

'etc > old' 카테고리의 다른 글

STRUTS2 - Login with Session  (1) 2008.11.04
Struts2 - Login Test with Validator  (0) 2008.11.04
Tender Love  (0) 2008.10.21
MP3 플레이어 만들기  (0) 2008.10.19
MECE(Mutually Exclusively, Collectively Exhaustive)  (0) 2008.10.13

'etc > old' 카테고리의 다른 글

Struts2 - Login Test with Validator  (0) 2008.11.04
Context 와 ThreadLocal  (0) 2008.10.27
MP3 플레이어 만들기  (0) 2008.10.19
MECE(Mutually Exclusively, Collectively Exhaustive)  (0) 2008.10.13
SMTP 설정 및 메일 BEAN 만들기  (1) 2008.10.02


최근 수정일 : 2008년 10월 21일
수정 내역 : 5초 앞으로, 뒤로 추가 일시 정지 및 정지 추가, 아직은 스톱이 비정상적으로 처리되고 있음.
ID3태그 또한 제대로 가져오지 못하고 있음, 다음 추가 예정 볼륨

최근 수정일 : 2008년 10월 20일
수정 내역 : PAUSE 까지 구현

최초 작성일 : 2008년 10월 20일 계속 업데이트 됩니다. 얍얍 !





 사운드 관련 중요 클래스 소개

- Sound : 사운드 오브젝트 생성 및 MP3파일의 메타 데이터 접속을 가능하게 해준다.
- SoundChannel : 각각의 다른 채널로 불러드린 사운드의 통제 및 위치 조절
- SoundLoaderContext : 사운드에 대한 정보 관련
- SoundTransform : 사운드 볼륨 조절 관련
- SoundMixer : 전체적인 사운드 통제
- ID3Info : ID3 메타데이터 정보 반영
- Microphone : 컴퓨터에 장착된 마이크 소리를 캡춰하도록 도와준다.


 사운드 관련 BASE Source

//변수 선언
var audioLocation:String;      //음악 소스 위치
var URLReq:URLRequest;      //URL 오브젝트
var snd1:Sound;        //신규 Sound 오브젝트

audioLocation = "c:\\test.mp3";   
URLReq = new URLRequest(audioLocation);
snd1 = new Sound();

snd1.load(URLReq);  //로딩
snd1.play();             //재생


  사운드 버퍼를 사용한 경우


package{
 
 //imports
 import flash.net.URLRequest;
 import flash.media.Sound;
 import flash.media.SoundLoaderContext;
 import flash.display.Sprite;
 
 public class mp3_load extends Sprite{
  
  private var audioLocation:String; 
  private var URLReq:URLRequest;  
  private var snd1:Sound;    
  private var buffer:SoundLoaderContext; //버퍼 정의
  
  public function mp3_load(){
   audioLocation = "파일위치";
   URLReq = new URLRequest(audioLocation);
   snd1 = new Sound();
     
   buffer = new SoundLoaderContext(5000); //오디오 버퍼 생성(1초 = 1000)
   //버퍼를 사용하여 파일 로딩
   snd1.load(URLReq, buffer);   
   snd1.play(5000,2); //play(시작위치{초}, 반복회수)
  }  
 } 
}

  사운드 PAUSE 구현하기


package{
 
 //imports
 import flash.net.URLRequest;
 import flash.media.Sound;
 import flash.media.SoundLoaderContext;
 import flash.media.SoundChannel;
 import flash.display.MovieClip;
 import flash.events.KeyboardEvent;
 
 public class mp3_load extends MovieClip{
  
  private var audioLocation:String; 
  private var URLReq:URLRequest;  
  private var snd1:Sound;    
  private var buffer:SoundLoaderContext; //버퍼 정의
  private var sc:SoundChannel;
  private var pauseStatus:Boolean;
  private var playHeadPosition:Number;
  
  public function mp3_load(){
   audioLocation = "파일위치";
   URLReq = new URLRequest(audioLocation);
   snd1 = new Sound();
     
   buffer = new SoundLoaderContext(5000); //오디오 버퍼 생성(1초 = 1000)
   //버퍼를 사용하여 파일 로딩
   snd1.load(URLReq, buffer);   
   sc=snd1.play(0,1); //play(시작위치{초}, 반복회수), return SoundChannel
  }
  
  //실제 Sound에서는 Pause가 존재 하지 않음.
  //play시 SoundChannel을 확인 한 다음 처리한다.
  public function pauseSound(){
   if(pauseStatus){ //Pause유무를 구분한다.
    sc = snd1.play(playHeadPosition,1); //기존에 저장된 위치부터 재생한다.
    pauseStatus=false;
   }else{
    playHeadPosition = sc.position; //재생 위치 기록
    pauseStatus=true;
    sc.stop(); //정지
   }
  }
 } 
}


'etc > old' 카테고리의 다른 글

Context 와 ThreadLocal  (0) 2008.10.27
Tender Love  (0) 2008.10.21
MECE(Mutually Exclusively, Collectively Exhaustive)  (0) 2008.10.13
SMTP 설정 및 메일 BEAN 만들기  (1) 2008.10.02
FMS3에서 신호처리 방식  (0) 2008.10.01

MECE원칙은 설명이 필요하다.


 
맥킨지 컨설팅에서 결론을 제시할 때에 사용하는 원칙으로 우리가 프레젠테이션 자료를 만들 때 아주 유용한 원칙이 된다.


 
우선 프레젠테이션 내용의 요점을 정리해야 한다. 요점을 2 ~ 3가지로 압축하려고 한다면,어떻게 2~3가지로 간추릴 수가 있을까또한 정리된 요점이 제대로 된 요점 정리인지 아닌지 어떻게 판단할 수 있을까? 이때 사용되는 방법이 MECE원칙이다.
 
요점은 그 요소간에 서로 배타적이면서 한편으로 전체를 포괄해야 한다.  배타적이라는 말은 수학에서 교집합이 생기면 안 된다는 뜻이고, 전체를 포괄한다는 말은 그 요소를 합하면 즉 합집합이 전체가 되어야 한다는 말이다
.
 
예를 들어보면,
어떻게 하면 건강하게 살 수 있을까? 먼저 이에 대한 답을 나열해 보자.
  -
일찍 자고 일찍 일어나기

  -
매일 일정시간 운동하기
  -
편식하지 않기
  -
담배와 술 안 하기
  -
스트레스 받지 않기
  -
과로하지 않기
  -
기타 등등

 
이를 축약해야 하는데 어떻게 하면 될까?
먼저 여러 요소를 검토하여 공통점이 있는 것이 무엇인지를 찾아야 한다. 그래서 그 공통점이 있는 요소는 하나의 카테고리로 묶는다. 각 카테고리를 비교하여 서로 전혀 공통점이 없는 것이 확인 되면 하나의 독립된 요소로 분리시킨다. 이런 작업을 통하여 축약된 소들 사이에 배타적이면서 전체를 총괄하는지를 살피면 되는 것이다
.
 
 
위의 예는 비교적 쉽게 축약할 수 있다
.
즉 해야 할 것과 하지 않아야 할 것 두 가지로 축약할 수 있다. 해야 할 것과 하지 않아야 할 것으로 축약하면 상호 배타적이면서 전체를 포괄할 수 있는 개념이 되기 대문이다
.
 
 
건강하게 살기 위하여

첫째 해야 할 것은
   -
일찍 자고 일찍 일어나기
   -
매일 일정시간 운동하기

둘째 하지 않아야 할 것들은
   -
편식
   -
담배와 술
   -
스트레스

 

이렇게 정리하면 된다.
  
  
만약 3가지로 요점 정리한다면

   (1)
바른 습관 들이기
     -
일찍 자고 일찍 일어나자
     -
편식하는 습관을 버리자
     -
담배와 술을 끊자

   (2)
정신건강이 중요
     -
스트레스를 받지 않기 위해 긍정적으로 살자

   (3)
적절한 휴식이 중요
     -
과로하지 말자

 
이렇게 정리하면 된다. 요점 정리를 할 때 상호 배타적이면서 전체를 포괄해야 완벽한 요점 정리라는 점을 기억하자.

'etc > old' 카테고리의 다른 글

Tender Love  (0) 2008.10.21
MP3 플레이어 만들기  (0) 2008.10.19
SMTP 설정 및 메일 BEAN 만들기  (1) 2008.10.02
FMS3에서 신호처리 방식  (0) 2008.10.01
FMS3 - 간단한 접속 테스트  (0) 2008.09.30

SMTP 설정하기

SMTP 설치 확인

SMTPException.java

package bean.mail;
/**
 * <pre>
 * SMTPException.java
 * SMTPBean에서 예외상황 발생시 에러를 Catch 하기위한 Class
 * error내용을 String으로 저장한후 getMessage() 메소드에 돌려준다.
 * </pre>
 *
 */
public class SMTPException extends Exception {
   private String message;
   /**
    * SMTPBean으로 부터 발생되어 던져지는 에러를 String형 message에 저장
    * @param message 애러 메시지
    */
   public SMTPException(String message) {
    this.message = message;
   }
   /**
    * 에러메시지를 Return (OverRided)
    */
   public String getMessage() {
    return message;
   }
  } 

SMTPBean.java

package bean.mail;
/**
 * SMTPBean.java
 * 실제 메일을 보내는 Bean
 */
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
public class SMTPBean implements  Serializable{
 private static final long serialVersionUID = 7932385610577799446L;
 
 private  Socket smtp;               //SMTP 서버 접속용 소켓
 
 private  String serverReply;        //서버의 응답을 저장하기 위한것
 private  BufferedReader input; 
 private  PrintStream output;
 
 private  String smtpServer="220.85.114.31"; //SMTP서버 아이피
 private  int port = 25;               //SMTP서버 포트
 
 private  String subject; //메일 전송 관련
 private  String message;
 private  String from;
 private  String to;
 /**
  * 보내는 이 설정
  * @param from 보내는 사람
  */
 public void setFrom(String from) {
  this.from = from;
 }
 /**
  * 받는 이 설정
  * @param to 받는사람
  */
 public void setTo(String to) {
  this.to = to;
 }
 /**
  * 제목 설정
  * @param subject 제목
  */
 public void setSubject(String subject) {
  this.subject = subject;
 }
 /**
  * 메시지 설정
  * @param message 메시지
  */
 public void setMessage(String message) {
  this.message = message;
 }
 /**
  * 생성자
  */
 public SMTPBean() {}
 /**
  * 메일 전송
  * @throws SMTPException 애러 처리
  */
 public void sendMail() throws SMTPException{
  connect();
  hail(from, to);
  sendMessage(from, to, subject, message);
  logout();
 }
 
 /**
  * <pre>
  * PrintStream을 서버에 보냄
  * 접속후 서버로 부터의 응답을 파악(2XX or 3XX)인 경우 서비스 준비OK
  * input을 위한 BufferedReader와 함께 새로운 서버 소켓을 생성
  * </pre>
  */
 private void connect() throws SMTPException {
  try {
   smtp = new Socket(smtpServer, port);
   input = new BufferedReader(new InputStreamReader(smtp.getInputStream()));
   //접속된 메일서버에게 출력을 보내기위한 스트림을 생성한다. 
   output = new PrintStream(smtp.getOutputStream()); 
   serverReply = input.readLine();
   if (serverReply.charAt(0) == '2' || serverReply.charAt(0) == '3') { //서버의 응답이 2XX or 3XX
   }
   else {
    throw new SMTPException("Error connecting to SMTP server " + smtpServer + " on port " + port);
   }
  }
  catch(Exception e) {
   throw new SMTPException(e.getMessage());
  }
 
  //System.out.println(serverReply); 
  //System.out.println("connect complete.");
 }
 
 /**
  * 메일 보낸는이, 받는이등을 메일서버에게 알림...
  * @param from 보내는 이
  * @param to 받는 이
  * @throws SMTPException 에러
  */
 private void hail(String from,  String to) throws SMTPException {
  if (submitCommand("HELO " + smtpServer))
   throw new SMTPException("Error occurred during HELO command.");
  if (submitCommand("MAIL FROM: " + from))
   throw new SMTPException("Error during MAIL command.");
  if (submitCommand("RCPT TO: " + to))
   throw new SMTPException("Error during RCPT command.");
 }
 
 
 /**
  * <pre>
  * 실제 메일을 전송
  * [참고] DATA명령은 SMTP 서버에게 메일을 보낸다고 일리는 기능
  * </pre>
  *
  * @param from 보내는 이
  * @param to 받는 이
  * @param subject 제목
  * @param message 내용
  * @throws SMTPException 에러
  */
 private void sendMessage(String from,  String to,  String subject,  String message) throws SMTPException {
  Date ldate_today = new Date(System.currentTimeMillis());
  SimpleDateFormat lgmt_date = new SimpleDateFormat("d MMM yyyy HH:mm:ss 'GMT'");
  lgmt_date.setTimeZone(TimeZone.getTimeZone("GMT"));
  lgmt_date.format(ldate_today);
  try  { 
   if (submitCommand("DATA"))  throw new SMTPException("Error during DATA command.");
   String header = "From: " + from + "\r\n";
   header += "To: " + to + "\r\n";
   header += "Subject: " + han(subject) + "\r\n";
   header += "Date: " + lgmt_date + "\r\n\r\n";
   if (submitCommand(header + han(message) + "\r\n."))
    throw new SMTPException("Error during mail transmission.");  
  }
  catch (Exception e)   {   }
 }
 
 /**
  * 서버에 명령을 보낸후 응답을 보낸다.
  *
  * @param command 보내는 명령
  * @return 처리 결과 (true : error)
  * @throws SMTPException 애러
  */
 private boolean submitCommand(String command) throws SMTPException {
  try {
   output.print(command + "\r\n");
   serverReply = input.readLine();
   System.out.println(command + " : " +serverReply);
   if (serverReply.charAt(0) == '4' || serverReply.charAt(0) == '5') //전송실패등..
    return true;
   else
    return false;
  }
  catch(Exception e) {
   throw new SMTPException(e.getMessage());
  }
 }
 /**
  * SMTP서버의 최근의 응답을 돌려줌
  * @return 서버 응답
  */
 public String getServerReply() {
  return serverReply;
 }

 /**
  * SMTP 서버의 포트번호를 돌려줌
  * @return 포트번호
  */
 public  int getPort(){
  return port;
 }
 /**
  * SMTP서버 포트 재 설정
  * @param newPort 포트번호
  */
 public void setPort(int newPort){
  port = newPort;
 }
 /**
  * SMTP 서버 IP를 알려준다
  * @return 서버 IP
  */
 public  String getSmtpServer(){
  return smtpServer;
 }
 /**
  * SMTP 서버 IP 설정
  * @param newSmtpServer
  */
 public void setSmtpServer(String newSmtpServer){   
  smtpServer = newSmtpServer;
 }
 /**
  * SMTP 서버로 부터 LogOut을 처리한다.
  * @throws SMTPException 애러
  */
 private void logout() throws SMTPException {
  try {
   if (submitCommand("Quit"))
    throw new SMTPException("Error during QUIT command");
   input.close();
   output.flush();
   output.close();
   smtp.close();
  }
  catch(Exception e) {
  }
 }
 /**
  * 한글 변환 처리
  * @param Unicodestr 유니코드 한글
  * @return KSC5601 전환
  * @throws UnsupportedEncodingException 애러처리
  */
 public static String han(String Unicodestr) throws UnsupportedEncodingException {     
  if( Unicodestr == null)   return null;  
  return new String(Unicodestr.getBytes("8859_1"),"KSC5601");  
 }  
}

Test.java

import bean.mail.SMTPBean;
import bean.mail.SMTPException;

public class Test {
 public static void main(String[] args){
  new Test();
 }
 
 public Test(){
  SMTPBean smtp = new SMTPBean();
  //server connect setting
  smtp.setFrom("test@test.com");
  smtp.setTo("test@test.com");   
  smtp.setSubject("title");
  smtp.setMessage("message"); 
 
  //send message
  try {
   smtp.sendMail();
  } catch (SMTPException e) {
   e.printStackTrace();
  }
 
 }
}

'etc > old' 카테고리의 다른 글

MP3 플레이어 만들기  (0) 2008.10.19
MECE(Mutually Exclusively, Collectively Exhaustive)  (0) 2008.10.13
FMS3에서 신호처리 방식  (0) 2008.10.01
FMS3 - 간단한 접속 테스트  (0) 2008.09.30
FMS3 (FLASH MEDIA SERVER) 설치하기  (0) 2008.09.30


FMS3에서 신호처리 방식

1. 스트리밍
=> 각각의 접속자에대하여 일정양의 대역폭을 할당함.(즉 접속자 늘면 대역폭 FULL=> 시청불가)
=> GOOD : 필요한 만큼만 대역폭이 소모됨.
=> BAD : 많은 사람 접속시 대역폭 증설의 문제가 생김

2. 브로드케스팅
=> 특정 접속위치로 접속한 사람은 모두다 시청가능(TV보는것과 같음 11번 틀면 11번만 나옴)
=> 좀더 쉽게 개울가에서 돌맹이 던지면 원형 파장이 발생하는데... 같은 위치에 있는 사람이라면..
))) 이런식으로 파장이 오는것을 느낄 수 있음
=> GOOD : 다수의 사람이 볼때 유리
=> BAD : 특정 접속주소로 접속해야 됨.

음... 쫌 틀린점도 있으므로 자세한건.. NAVER검색 -_-/ 대략적 개념만 탑제함 좋을려만...

'etc > old' 카테고리의 다른 글

MECE(Mutually Exclusively, Collectively Exhaustive)  (0) 2008.10.13
SMTP 설정 및 메일 BEAN 만들기  (1) 2008.10.02
FMS3 - 간단한 접속 테스트  (0) 2008.09.30
FMS3 (FLASH MEDIA SERVER) 설치하기  (0) 2008.09.30
시바토라 - ED SONG  (0) 2008.09.11

FMS3에서는 RTMP (Real-Time Messaging Protocol) 실시간 메시징 서비스를 사용하고 최신버전에서는 E(암호화)가 추가된  RTMPE (E for Encryption)를 사용하고. 두 프로토콜의 속도 차이를 보면 RTMP가 RTMPE보다 약간 빠르지만 뭐 보안이 추가 되었으니.... RTMPE를 사용하는것이 더 보안을 위해 좋다고 하네여 ^^

1. FMS3Connect.as를 만든다음 아래와 같이 코딩한다.



2. FMS3Connect.fla 파일을 만든 이후 Document Class를 FMS3Connect 로 설정한다.


3. C:\Program Files\Adobe\Flash Media Server 3\applications 폴더 아래 test라는 폴더를 만든다.

4. FMS3Connect.fla 를 실행하여 아래와 같은 그림을 봤다면 정상적으로 접속 테스트가 완료

'etc > old' 카테고리의 다른 글

SMTP 설정 및 메일 BEAN 만들기  (1) 2008.10.02
FMS3에서 신호처리 방식  (0) 2008.10.01
FMS3 (FLASH MEDIA SERVER) 설치하기  (0) 2008.09.30
시바토라 - ED SONG  (0) 2008.09.11
My Sql 기본적인 명령어  (0) 2008.09.08

1. www.adobe.com/products/flashmediaserver 사이트에 접속하여
하단에 보이는 아래와 같은 그림에서



붉은색으로 밑줄친 FMS를 클릭합니다.

2. 어도비 계정을 만들거나 로그인을 합니다.



(그림설명 : 좌측 - 신규등록, 우측 - 로그인)

3. 이후 부가 정보창 입력 나오면 붉은색 글씨에 유의하여 입력한다음 파일 다운로드.



4. 압축 푼 다음 파일 실행


5. 늘 하는듯이... NEXT


6. 이제 시리얼을 입력할 차례


=>
시리얼 입력 하지 않으면 : Flash Media Development Server 3으로 인스톨
시리얼 입력 하면 : Flash Media Interactive Server 3 or Streaming Server 3으로 인스톨됨.

각 서버의 차이점은...
인터렉티브 서버 : 기존 FMS의 풀버전과 동일
스트리밍 서버 : 음성 및 영상 스트리밍만 가능
디벨롭퍼 서버 : 인터렉티브 서버와 동일하지만.... 접속자 10명 제한 ㅋㅋ

=> 개발 테스트에는 전혀 문제 없으므로 디벨롭퍼로  인스톨

7. 어드민 아이디와 암호 설정



8. FMS서버가 사용하는 포트 및 관리서버 포트 설정



9. 설치 완료 및 어드민 콘솔 확인
: 설치된 폴더의 fms_adminConsole.htm 실행


요기까지 보이고 조금전 입력한 아이디와 암호로 정상적으로 로그인까지 된다면 OK ! 설치 완료~

'etc > old' 카테고리의 다른 글

FMS3에서 신호처리 방식  (0) 2008.10.01
FMS3 - 간단한 접속 테스트  (0) 2008.09.30
시바토라 - ED SONG  (0) 2008.09.11
My Sql 기본적인 명령어  (0) 2008.09.08
For In  (0) 2008.08.12
01あたらしい日日

시바토라 - ED SONG

'etc > old' 카테고리의 다른 글

FMS3 - 간단한 접속 테스트  (0) 2008.09.30
FMS3 (FLASH MEDIA SERVER) 설치하기  (0) 2008.09.30
My Sql 기본적인 명령어  (0) 2008.09.08
For In  (0) 2008.08.12
onfocus 등의 호출시점 => 매우 중요함.  (0) 2008.07.05

+ Recent posts