programming/actionscript2014.06.18 12:00

이제부터는 앞서 설명한 클라우드 서비스들과 기타등등 라이브러리를 이용하여 멀티플레이 구현을 해보도록 하겠습니다.

하나 하나 구현해보면서 장단점도 연구해보고 가장 좋은 방법을 채택하여 간단한 게임을 만들어 보도록 하죠.


ServerSocket 활용하기

AIR 3.8 버전부터 지원하는 ServerSocket Class를 활용하여 멀티플레이를 구현해 보도록 하겠습니다. 이 클래스를 이용하면 AS3로 TCP 소켓 서버를 구현 할 수 있습니다. 플래시로는 보통 클라이언트로만 개발을 하는데, 이 클래스를 이용하면 클라이언트 겸 서버로도 개발 할 수 있고, 온라인 게임 같은 과부하가 몰리는 게임서버의 일부 기능을 클라이언트로 분산시킬 수도 있고, 마인크래프트같은 샌드박스 게임도 만들 수 있고, 활용분야가 무궁 무진하죠.


참고 : http://help.adobe.com/ko_KR/FlashPlatform/reference/actionscript/3/flash/net/ServerSocket.html



아래는 서버 구현 코드입니다.


package  
{  
    import flash.events.Event;  
    import flash.events.ProgressEvent;  
    import flash.events.ServerSocketConnectEvent;  
    import flash.net.ServerSocket;  
    import flash.net.Socket;  
      
    public class Server  
    {  
        private var server:ServerSocket;  
        private var incomingSocket:Socket;  
          
        public function Server()  
        {  
          
        }  
          
        public function createServer():void  
        {  
            server = new ServerSocket();  
            server.addEventListener(Event.CONNECT, onConnect);  
            server.bind(7934);  
            server.listen();  
              
            trace("createServer...");  
        }  
          
        protected function onConnect(event:ServerSocketConnectEvent):void  
        {  
            incomingSocket = event.socket;  
            incomingSocket.addEventListener(ProgressEvent.SOCKET_DATA, onData);  
              
            trace("onConnect..." + event.socket.remoteAddress + ":" + event.socket.remotePort);  
        }  
          
        protected function onData(event:ProgressEvent):void  
        {  
            if (incomingSocket.bytesAvailable > 0)  
            {  
                var recv:String = incomingSocket.readUTFBytes(incomingSocket.bytesAvailable);  
                  
                incomingSocket.writeUTFBytes(recv);  
                incomingSocket.flush();  
                                  trace("onData..." + incomingSocket.remoteAddress + ":" + incomingSocket.remotePort + " = " + recv);  
            }  
        }  
    }  
}

그 다음은 클라이언트 구현 코드


package  
{  
    import flash.events.Event;  
    import flash.events.IOErrorEvent;  
    import flash.events.ProgressEvent;  
    import flash.net.Socket;  
      
    public class Client  
    {  
        private var socket:Socket;  
          
        public function Client()  
        {  
          
        }  
          
        public function connect():void  
        {  
            socket = new Socket()  
            socket.addEventListener(Event.CONNECT, onConnect);  
            socket.addEventListener(ProgressEvent.SOCKET_DATA, onData);  
            socket.addEventListener(IOErrorEvent.IO_ERROR, onError);  
            socket.addEventListener(Event.CLOSE, onClose);  
            socket.connect("127.0.0.1", 7934);  
              
            trace("connect...");  
        }  
          
        private function onConnect(e:Event):void  
        {  
            Main.clientlog("onConnect");  
        }  
          
        protected function onData(event:ProgressEvent):void  
        {  
            if (socket.bytesAvailable > 0)  
            {  
                var recv:String = socket.readUTFBytes(socket.bytesAvailable);  
                  
                trace("recv : " + recv);  
            }  
        }  
          
        protected function onError(event:IOErrorEvent):void  
        {  
            trace("onError");  
        }  
          
        private function onClose(e:Event):void  
        {  
            trace("onClose");  
        }  
          
        public function send(msg:String):void  
        {  
            try  
            {  
                socket.writeUTFBytes(msg);  
                socket.flush();  
            }  
            catch (error:Error)  
            {  
                trace(error.message);  
            }  
        }  
      
    }  
}

구현이 굉장히 쉽고 Flash 외의 다른 개발환경을 구축할 필요가 없기 때문에 ActionScript로만 개발하길 원하시는 분들에겐 좋은 방법이죠. 


하지만 단점도 존재합니다.


이 방식의 단점

먼저 Flash Platform이 아닌, AIR Platform만 지원합니다. 즉 웹브라우저용 플래시 게임을 서버로 돌릴 수 없다는 거죠. 그러면 AIR로 모바일용 앱만 만든다고 치면 뭐 상관 없을 거 같은데, 여기서도 단점이 있습니다.


일단 지원 범위가 멀티플랫폼의 대명사인 AIR라고 하더라도, 데스크탑, iOS, Android, TV용 플랫폼 별로 지원 여부가 다 다릅니다. (AIR for TV 지원안함)어느 환경까지 배포할 것인지 디테일한 검토가 필요합니다.


그리고 와이파이가 아닌 모바일네트워크(3G나 LTE)를 사용할 경우에는 TCP Socket Listen이 안됩니다. (통신사마다 다르긴 하지만 국가별 통신사별 따지면서 개발할 수 도 없고...) 이게 모바일 환경에서 가장 큰 단점이죠.


여기서 잠깐! 모바일 네트워크에 대해 대략 알고 넘어가면 좋을 것 같은데 아래 링크에 좋은 자료가 있습니다.

참고 : 3G 모바일 네트워크의 이해 


범용적이고 쉬운 개발을 원하는 저에겐 아무래도 이 기능만으론 부족한게 사실이라 이 방법은 패스~~!!!

저작자 표시 동일 조건 변경 허락
신고
Posted by 귀뫄뉘

댓글을 달아 주세요


티스토리 툴바