AIR와 웹 애플리케이션간 로컬 커넥션 통신하기

문제점 : 웹 애플리케이션에서 AIR 애플리케이션의 메소드를 호출하고 싶다.

해결책 : 로컬 커넥션을 사용해 두 애플리케이션간 통신하도록 하면 된다.

사실 누군가가 처음 내게 이 질문을 했을 때

난 별 생각없이, "물론, 로컬커넥션을 사용하면 웹 애플리케이션이랑 AIR 애플리케이션이

서로 통신할 수 있지"라고 대답했다.

그런데 가만 생각해 보니, 웹 애플리케이션은 플래시 플레이어에서 구동되고

AIR 애플리케이션은 AIR 런타임에서 구동되는데, 둘이 통신할 수 있다는 게

말이 안되는 거 같았다. 그래서 나는 대답을 보류했고, 한참 동안 관련 레퍼런스를

찾아서 결국 로컬 커넥션을 통한 통신이 가능하다는 것을 알아 냈다.

일단 웹 애플리케이션에서 AIR 애플리케이션에 접근하려면 다음 문법을 따라야 한다.

(이 때 lc는 LocalConneciton 인스턴스라고 가정한다)

lc.send("app#"+AIR 애플리케이션 ID+"."+AIR 애플리케이션 제작자(publisher) ID+":"+AIR 애플리케이션 로컬 커넥션 네임,"메소드 명", 파라미터)

얼핏 봐도 복잡해 보인다.

한편 반대로 AIR 애플리케이션에서 웹 애플리케이션의 메소드를 호출하려면

다음과 같이 해야 한다.

lc.send(웹 애플리케이션 도메인+":"+웹 애플리케이션 로컬 커넥션 네임,"메소드 명", 파라미터)

이 때 웹 애플리케이션 도메인은 로컬에 있을 때는 localhost,

웹 도메인에 있을 때는 도메인명(예를 들어,www.joshy21.com)이 된다.


사실 웹 애플리케이션과 AIR 애플리케이션 사이의 로컬 커넥션 통신을 통한 연동은

활용 범위가 엄청나게 넓다. 예를 들어, ActionScript 2와 AIR와의 통신도 가능하고

간단한 로컬 커넥션 핼퍼 클래스를 작성해 연동 부분만 처리하면,

웹 애플리케이션에서  launchApplication() 메소드를 통해 AIR 애플리케이션이 (실행중이 아니면) 실행시키고

서로 통신하면서 온갖 "쇼"를 다 할 수도 있을 것이다.

그래서 나는 다음과 같은 LocalConnection Info 클래스와 Manager 클래스를 만들어

AIR 애플리케이션과 웹 애플리케이션 사이의 연동이 정말 쉬워질 수 있도록 했다.

먼저 LCInfo 클래스의 소스는 다음과 같다.



이 클래스는 domain, air_connection, web_connection, isAirApp, appId, publisherId

속성을 가지고 있는데, 각각의 속성은 다음과 같다.

domain - 웹 애플리케이션이 있는 도메인 위치. 기본값은 localhost
air_connection - AIR 애플리케이션의 로컬 커넥션 네임
web_connection - 웹 애플리케이션의 로컬 커넥션 네임
isAirAipp - 해당 애플리케이션이 웹 애플리케이션인지 AIR 애플리케이션인지 여부
appId - (웹 애플리케이션인 경우에만) AIR 애플리케이션의 애플리케이션 ID
publisherId - (웹 애플리케이션인 경우에만) AIR 애플리케이션의 제작자 ID


이어서 이 클래스를 활용하는 메니저 클래스의 소스를 살펴보면 다음과 같다.


이 클래스는 싱글턴 패턴을 따르고 있고 LCInfo 클래스 인스턴스를

속성으로 가지고 있다 (has-a 관계).

하는 일은 애플리케이션이 웹 애플리케이션인지 AIR 애플리케이션인지

init() 메소드를 통해 알게 된 후

자동으로 상대편 애플리케이션에 로컬 커넥션의 send() 메소드를 통해

접근할 커넥션 네임을 생성해 주고

LCManager.getInstance().send() 메소드를 통해

굳이 로컬 커넥션 객체에 접근해 일일히 커넥션 네임을 할당하지

않아도 상대편 애플리케이션과 통신할 수 있도록 해 주는 기능이다.


그럼 이어서 예제를 보도록 하자.

AIR 애플리케이션 예제

웹 애플리케이션 예제
 

이 두 예제에서 하는 일은 다음과 같다.

AIR 애플리케이션에서는 LCManager 클래스를 통해 로컬 커넥션을

생성하고 웹 애플리케이션쪽으로 애플리케이션 ID와 publisher ID를

타이머를 통해 전송해 준다.

웹 애플리케이션에서는 역시 LCManager 클래스를 통해 로컬 커넥션을

생성하고 AIR 애플리케이션에서 호출하는 getID 메소드를 통해

AIR 애플리케이션의 ID와 publisher ID를 동적으로 전달받는다.

이렇게 전달받은 애플리케이션 ID와 publisher ID를 바탕으로

웹 애플리케이션은 AIR 애플리케이션의 stopTimer() 메소드를

LCManager 클래스를 통해 호출하고


AIR 애플리케이션의 타이머는 멈추게 된다. 또 test 버튼을 클릭하면 AIR 애플리케이션의 showAlert 메소드에 파라미터를 넘겨서 AIR 애플리케이션의 메소드를 파라미터와 함께 호출하도록 한다.  

웹 애플리케이션 메소드

AIR 애플리케이션 메소드

액션스크립트 원리 : LocalConnection 객체를 사용하면 서로 다른 도메인의 두 swf간 통신은 물론 AIR 애플리케이션과 웹 애플리케이션, AIR 애플리케이션과 또 다른 AIR 애플리케이션 간의 통신이 가능하다. 하지만 로컬 커넥션은 하나의 커넥션 네임당 하나의 애플리케이션만 허용되는 점, 호출할 메소드가 public으로 선언되어야 한다는 점 등 몇 가지 제약이 따르니 사용시에는 항상 주의가 필요하다.
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/11/07 22:15 2008/11/07 22:15
tagged with  ,
REPLY AND TRACKBACK RSS http://joshy21.com/weblog/rss/response/30
REPLY AND TRACKBACK ATOM http://joshy21.com/weblog/atom/response/30
TRACKBACK ADDRESS
http://joshy21.com/weblog/trackback/30
REPLY RSS http://joshy21.com/weblog/rss/comment/30
REPLY ATOM http://joshy21.com/weblog/atom/comment/30
wrote at 2008/11/09 03:48
^^ 좋은 글 잘봤습니다.
swf가 web에 embed딘 상태에서 직접 테스트 하신건가요?
왜 이질문을 드렸냐면....
AIR와 swf간의 통신때는 LocalConnection 의 채널명이 언더스코어(_)로 시작하지 않으면 통신이 안되기 때문입니다..
예전에 구현을 하다 한참을 헤맨 부분이었지요.... AIR Developer Center에서 답을 찾고 난후 얼마나 허무하던지.. :)

그럼 좋은 하루 되세요.~
eirene 
wrote at 2008/11/09 08:46
네~ 아예 swf가 들어있는 html 페이지를 플렉스의 HTML 컴포넌트를 써서 로드해서 테스트해 본 겁니다.. 물론 웹에 임배드된 상태에서도 해 봤구요^^ 언더스코어 얘기는 첨 듣네요 ^^; 제가 잘 모르는 걸 수도 ㄷㄷㄷ ㅠ
eirene 
wrote at 2008/11/09 20:38
AIR에서 HTML 컴포넌트 써서 불러오지 않고 그냥 브라우저에서 웹 애플리케이션 띄우고 AIR에서 언더스코어 안 쓰고 로컬 커넥션으로 연동해 봤는데 잘 되네요^^
wrote at 2008/11/10 10:29
RSS주소가 바뀌었군요. 어쩐지 언제부터인가 rss에서 에러가 나더니...-_-;
암튼 좋은 내용 잘 봤습니다 ^^ 시도중입니다 ㅠ
eirene 
wrote at 2008/11/10 12:17
헐.. 그런가요 ㅠㅠ 제가 Textcube 업뎃하면서 몬가 실수를 했나 보네여 ㄷㄷㄷ ㅠ
wrote at 2008/11/16 16:23
좋은 글 잘봤습니다.
wrote at 2008/11/27 00:06
우와 +_+ ; 그렇군요 ~ ㅋ 정말 감사합니다.
재밌는거 많이 만들 수 있을꺼 같아 흥미진진해지네요 ^-^
아바 
wrote at 2009/12/05 23:10
좋은 정보 정말 감사합니다!!
[로그인][오픈아이디란?]
이름 :
비밀번호 :
홈사이트 :
비밀글 :
*1  ... *77  *78  *79  *80  *81  *82  *83  *84  *85  ... *108 
count total 10227, today 10, yesterday 13
관리인 : eirene
rss
I am
전체
Development
La vie quotidienne
English
Languages
Jesus
글 보관함
2010/01, 2009/06, 2009/03, 2009/02, 2009/01,
달력
«   2010/03   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31