�빫�� ����� ���

Posts tagged ‘FMS’

Gatherer – Online Collaboration tool 만들기 by 13th warrior (2)


두번째 강좌

Flex Builder를 기반으로 진행하겠습니다.

https://svn.xp-dev.com/svn/icksishu_13thwarrior/testBoard 의 프로젝트를 checkout하셨죠? 그리고 testBoard 의 프로젝트를 import하셨겠지요? 아직 안하셨으면 svn checkout 하시고, import 하시기 바랍니다. FlexBuilder 3부터는 프로젝트를 통채로 import할 수 있어서 편해졌습니다.

testBoard.mxml 파일부터 시작합니다. 경로는 PROJECT_ROOT\testBoard\src\testBoard.mxml 입니다. testBoard.mxml는 gatherer의 첫 화면이고 DB를 연결하여 다른 클래스에 값을 셋팅하는 역할을 담당합니다. 구현에서 눈여겨 볼 점은 State로 구성했다는 것입니다.

선언부의 소스 먼저 볼까요?

	<mx:states>
		<mx:State name="room">
			<mx:AddChild position="lastChild">
				<mx:Label text="Gathering v.1.0  by  13th Warrior" bottom="10" right="10" fontSize="12" fontWeight="bold"/>
			</mx:AddChild>
			<mx:AddChild position="lastChild">
				<ns2:whiteboardPanel x="10" y="21" id="board" width="600" height="737">
				</ns2:whiteboardPanel>
			</mx:AddChild>
			<mx:AddChild position="lastChild">
				<ns1:camPanel x="618" y="21" width="396" height="319" id="camPanel">
				</ns1:camPanel>
			</mx:AddChild>
			<mx:SetStyle name="backgroundColor" value="#A990B8"/>
			<mx:AddChild position="lastChild">
				<ns1:chatPanel x="618" y="348" width="396" height="410" id="chatPanel">
				</ns1:chatPanel>
			</mx:AddChild>
			<mx:SetProperty name="width" value="1067"/>
			<mx:SetProperty name="height" value="776"/>
		</mx:State>
		<mx:State name="login">
			<mx:AddChild position="lastChild">
				<mx:Label text="Gathering v.1.0  by  13th Warrior" bottom="10" right="10" fontSize="12" fontWeight="bold"/>
			</mx:AddChild>
			<mx:AddChild position="lastChild">
				<ns1:LoginPanel id="loginPanel" creationComplete="init()" horizontalCenter="0" verticalCenter="0" height="172">
				</ns1:LoginPanel>
			</mx:AddChild>
			<mx:AddChild position="lastChild">
				<ns1:RoomList id="roomList" visible="false" creationComplete="roomConnection()" horizontalCenter="0" verticalCenter="0">
				</ns1:RoomList>
			</mx:AddChild>
			<mx:SetStyle name="backgroundColor" value="#A790B8"/>
			<mx:SetStyle name="fontStyle" value="normal"/>
		</mx:State>
	</mx:states>

room과 login 두 개의 state를 선언하고 몇가지 화면을 담습니다. mx:Application 태그에서 login state를 디폴트로 선언했구요. login -> roomlist -> room(board, cam, chat) 으로 넘어갑니다. 매번 유저 이벤트로 동작시켜야 하죠.

login의 동작을 보자면

			private function init():void{
				trace("init");
				con = new Connection("192.168.10.99", 3306, "root", "mysql","board");				
				con.addEventListener(Event.CONNECT, handleConnected);
				con.connect("euckr");
				loginPanel.idInputArea.addEventListener(FocusEvent.FOCUS_IN, addEvent);
			}

DB 연결하고 id와 password를 입력할 수 있는 이벤트 리스너를 달아주는 것이 끝입니다. 그러면 동작은 loginPanel로 넘어가게 되지요. DB 커넥션은 asSql이라는 swc 라이브러리를 사용했습니다. 프로젝트 URL은 http://code.google.com/p/assql 이고 라이센스는 MPL입니다. DB 커넥션과 핸들링을 쉽게 해주는 라이브러리이죠.

이제 LoginPanel.mxml을 살펴보죠.
경로는 PROJECT_ROOT\src\extenders\panel\LoginPanel.mxml입니다. component 선언부는 그저 위치와 이벤트 핸들러고 별다른 내용은 없습니다. 여기서도 asSql을 사용했는데요, asSql의 특징은 보통 자바나 C/C++에서 DB 커넥션을 열고 ResultSet 객체를 받아서 핸들링을 하는 것과는 달리 커넥션 후 쿼리에 대한 결과를 MySqlToken 클래스 인스턴스로 받아서 그에 대한 핸들링을 비동기 이벤트 핸들러로 수행한다는 겁니다. LoginPanel.mxml 소스를 보면 로그인 버튼 이벤트 핸들러로 clickConBtn()이 있고 토큰의 핸들러로 selectResult()를 설정합니다. selectResult()는ResultSet을 얻어서 loginResult()가 수행되도록 하죠.

			private function clickConBtn():void{
				if(idInputArea.text == ""){
					Alert.show("ID를 입력해 주세요.");
				}
				else{
					userID = idInputArea.text;
					var query:String = 'SELECT pw from members where id =\''+userID+'\'';
					var token:MySqlToken = st.executeQuery(query);
					token.addResponder(new AsyncResponder(selectResult, fault));
				}
			}
 
			private function selectResult(data:Object, token:Object):void{
				var rs:ResultSet = ResultSet(data);
				dataAC = rs.getRows();
				loginResult();							
			}
 
			private function loginResult():void{
				if(dataAC.length > 0){
					if((dataAC[0].pw == null)||(dataAC[0].pw != pwInputArea.text))
					{
						this.removeEventListener(KeyboardEvent.KEY_UP, enterHandler);
						Alert.show("Login Fail");
 
					}else{
						this.removeEventListener(KeyboardEvent.KEY_UP, enterHandler);
						Alert.show("Login Success");
						isLogin = true;
					}
				}
				else{
					this.removeEventListener(KeyboardEvent.KEY_UP, enterHandler);
					Alert.show("Login Fail");
				}
			}

ResultSet의 핸들링이 비동기로 이뤄지기 때문에 로그인이되었다 안되었다라는 판단을 바로 해서는 안되며 비동기로 동작하는 메소드에서 값을 설정한 후 다른 이벤트 핸들러가 동작하도록 하는 것이 좋습니다. LoginPanel.mxml의 동작이 끝나면 testBoard.mxml의 updateComplete 이벤트에 의해 testBoard.updateState()가 호출됩니다. 그러면 다시 testBoard.mxml로 가서 login state 다음인 room state가 실행되겠죠. state가 넘어가는 것을 구현하는 것은 쉽습니다. 선언한 state를 바꿔주기만 하면 되거든요. updateState()를 보면 쉽게 알 수 있습니다.

			private function updateState():void{
				if(loginPanel.getLogin() == true)
				{
					userID = loginPanel.getID();
					roomName = roomList.getRoomName();
				 	loginPanel.setVisible(false);
				 	roomList.setVisible(true);
				 	roomList.setUserID(userID);	
				 	//roomList.findEmptyRoom();		 	
				 	if(roomList.getIsRoom() == true)
				 	{
				 		roomList.setVisible(false);
				 		currentState = "room";				 		
				 		board.setUserID(userID);				 						 		
				 		camPanel.setUserID(userID);
				 		chatPanel.setUserID(userID);
				 		board.setRoomName(roomName);
				 		camPanel.setRoomName(roomName);
				 		chatPanel.setRoomName(roomName);
				 	}
				}				
			}

이번 강좌는 여기서 끝내고 다음 강좌에서는 실제 사용하는 컨트롤들 중 chatPanel부터 살펴보도록 하겠습니다.

P.S 타겟을 Flex에 어느정도 능숙하다고 생각하다보니 너무 건성건성 하는 것이 아닌가 싶네요. 질문이 있으시면 언제든 답글을 달아놓으시면 성심성의껏 아는 한도에서 설명드리겠습니다.

Window XP에 Adobe Flash Media Interactive Server 3.5 설치하기


Flex 강좌를 진행하려다 보니 FMS 설치에 대한 이야기를 하여야겠는데, 제가 한참 사용할 때는 Flash Media Server 3였거든요, 어느새 Flash Media Interactive Server 3.5로 업데이트 되었습니다. 요새(작년, 올해, 내년도?) adobe 개발자들 꽤 바쁠 것 같아서 부럽습니다.

 

설치하기 앞서, Linux 버전을 설치하려는 분들이라면 이 글을 보실 필요도 없는 고수라고 생각됩니다. 이글을 정말 다음, 다음, 클릭, 클릭 사용자를 위하여 작성됩니다.

 

1. 다운받기

adobe의 FMS 페이지를 보시면  Download free Adobe Flash Media Development Server 3.5 가 보일 겁니다. 링크를 따라가려고 하면 로그인 하라고 하는데, Flex와 친해지려면 adobe 홈페이지를 들락날락 해야하니 아이디를 하나 만들어 두시는게 나을 겁니다. 로그인 하시면 Linux버전 또는 Window 버전을 골라서 다운받기 시작합니다. 다운을 다 받으면 아래와 같은 파일을 볼 수 있습니다. 

fms1

파일이 꽤 크죠? 압축을 풉시다.
fms2

압출을 풀고 보면 위와같은 파일들을 볼 수 있습니다. FlashMediaServer3.5.exe를 실행하세요.

 

fms3

별거 있을까요? 그냥 다음 다음.. 

fms4

물론 동의해야겠죠. 안하면 뭐.. ~_~

fms5

시리얼 키를 넣는 부분인데 그냥 비우고 next 버튼을 클릭하면 developement 버전으로 설치됩니다. (development 버전은 최대 접속 10 client만을 지원합니다. 개발하는데는 지장없으니 그냥 ㄱ ㄱ )

fms6

역시.. 다음. 다음..

fms7

이전 버전과는 다르게 apache 를 같이 설치할 수 있던데, 왜 그런지는 아직 모르겠습니다. 일단 다음.. 다음..

fms8

fms9
FMS 내에서 사용할 관리자 계정 정보입니다.  전 그냥 admin/admin으로 합니다.
fms10

RTMP 포트와 관리자 접속용 포트를 결정합니다. 그냥 디폴트, 다음.. 

fms11

fms12

fms13

여기까지 오면 설치가 끝나고, 한번 실행할 수 있도록 바로 스타트 옵션이 있습니다. 일단 한번 실행해보죠. 체크박스를 체크된 상태로 놓고 그냥 finish~~!

fms14

그러면 아래와 같은 페이지가 로드됩니다.  중간에 있는 “Launch the Flash Media Administration Console” 버튼을 클릭하면 관리자 콘솔이 나타나게 됩니다. 한번 보죠.

fms15

그럼 아래와 같은 화면이 나타납니다. 간간히 사용하게 될 관리자 콘솔인데요, 접속해보도록 하죠. Server Name이야 대충 지어주시고, Server Adress를 127.0.0.1, Username  : admin, Password : admin (그 전에 설정한 id/pw) 이렇게 입력하고 Login 버튼을 츨릭하시면 됩니다. 

fms16

그러면 하단과 같은 화면이 나타납니다.

fms17

FMS의 서버 어플리케이션을 구동하는 것은 간단합니다.  [FMS 설치경로]\applications 를 보면 (C:\Program Files\Adobe\Flash Media Server 3.5\applications 이죠.)  live와 vod라는 폴더가 있는데 그것이 바로 live, vod라는 샘플 프로그램입니다. 콘솔 왼편 아랫쪽을 보면 New Instance 라는 콤보박스가 있지요. 그곳에 live와 vod가 나타날 겁니다. 따라서 새로 작성한 서버 어플리케이션을 applications 폴더에 넣으면 위와 같이 New Instance 콤보박스에서 선택할 수 있고, 그 어플리케이션을 실행할 수 있는 것입니다.

fms181

13thwarrior의 svn(https://svn.xp-dev.com/svn/icksishu_13thwarrior/)을 체크아웃하였다면 그 안에 sungjinDo\serverMain 폴더를 찾을 수 있을 겁니다. 아래의 그림과 같이 말이죠.

fms19

위의 3 폴더(board, chat, video)를 복사하여 [FMS 설치경로]\applications에 넣어둡니다.

fms20

그리고 관리자 콘솔을 Refresh한 다음 New Instance 콤보박스를 클릭하여 보면 아래와 같이 프로그램 이름들이 보일 것입니다. 하나씩 실행하면 FMS에 관한 셋팅은 끝납니다.

fms21

 

이번 강좌는 여기서 끝이구요, 다음은 MySQL 설정편을 보도록 하겠습니다.