AIR/파일시스템 연동2008. 12. 23. 11:01


AS3의 가장 큰 장점중에 하나는 지금껏 AS에서 지원이 불가능했던 low level작업이 가능한 점이다. 이는 AS3와 AIR를 통하여 바이너리 데이터를 직접 만들거나 수정 또는 zip알고리즘과 jpg와 png등 이미지 처리 알고리즘을 제공함과 동시에 기타 doc와 ppt... 등 파일 형태만 알고 있다면 모든 파일을 직접 만들 수 있기 때문이다.
이와 같은 작업을 가능케하는 것이 IDataInput, IDataOutput 인터페이스를 구현한 ByteArray라는 클래스이다. 또는 flash.netURLStream(IDataInput만 구현)과 URLLoader를 사용하여도 바이너리 데이터로 접근(만) 할  수 있다.

   - ByteArray는 읽고 쓰기가 모두 가능한 바이너리 관리 전용 클래스이다.
   - URLLoader인 경우에는 바이트배열에 특화되진 않았다. data를 모두 받은 후에 접근 하여 관리한다. 
   - URLStream는 delegator에서 직접 바이트 배열을 읽을 수 있지만 IDataInput만 구현하여 기록은 불가능 하다.
     data를 받는 중에도 접근 가능하다.


ByteArray는 기본적인 바이너리 데이터를 기록하거나 읽기 위한 기본적인 클래스이며 외부 파일데이터를 가져오는 통신 클래스에서는 URLStream를 사용한다. AIR에서는 앞서 살펴본 FileStream(IDataInput, IDataOutput 인터페이스를 구현)를 사용한다.

FileStream은 ByteArray처럼 읽고 쓰기가 모두 가능한 클래스 이다. 따라서 AIR에서는 FileStream만으로 파일을 읽어 들여와 기록까지 가능해 졌다. 복잡한 바이너리 작업이라면 ByteArray를 활용하면 중간에 벌어진 틈을 부드럽게 처리 할 수 있을 것이다.


IDataInput, IDataOutput를 구현한 ByteArray 속성과 메서드 *

[ Public 속성 ]

bytesAvailable : uint
[읽기 전용] 바이트 배열의 현재 위치에서 배열 끝까지 읽을 수 있는 데이터 바이트 수입니다.

defaultObjectEncoding : uint
[정적] 새 ByteArray 인스턴스에 사용할 ByteArray 클래스의 기본 객체 인코딩을 나타냅니다.

endian : String
데이터의 바이트 순서를 Endian.BIG_ENDIAN 또는 Endian.LITTLE_ENDIAN으로 변경하거나 읽습니다.

length : uint
ByteArray 객체의 바이트 단위 길이입니다.

objectEncoding : uint
ByteArray 인스턴스에서 쓰거나 읽을 때 ActionScript 3.0, ActionScript 2.0 또는 ActionScript 1.0 형식을 사용할지 여부를 확인하는 데 사용합니다.

position : uint
ByteArray 객체에 대한 파일 포인터의 현재 위치를 바이트 단위로 옮기거나 반환합니다.

[ Public 메서드 ]
ByteArray()
이 클래스의 메서드와 속성을 사용하여 데이터 저장소 및 스트림을 최적화할 수 있도록 압축된 바이트 배열을 나타내는 ByteArray 인스턴스를 만듭니다.

clear():void
바이트 배열의 내용을 지우고 길이 및 위치 속성을 0으로 재설정합니다.

compress(algorithm:String):void
바이트 배열을 압축합니다.

deflate():void
DEFLATE 압축 알고리즘을 사용하여 바이트 배열을 압축합니다.

inflate():void
바이트 배열의 압축을 해제합니다.

readBoolean():Boolean
바이트 스트림에서 부울 값을 읽습니다.
포맷타입 : Boolean
포맷 : Boolean
0인 경우 false , 기타인 경우 true

readByte():int
바이트 스트림에서 부호 있는 바이트를 읽습니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
바이트 스트림에서 length 매개 변수로 지정된 데이터 바이트 수를 읽습니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

readDouble():Number
바이트 스트림에서 IEEE 754 배정밀도 64비트 부동 소수점 숫자를 읽습니다.
포맷타입 :  숫자
포맷 : Double
Double-precision 64비트 부동 소수점 수

readFloat():Number
바이트 스트림에서 IEEE 754 단정밀도 32비트 부동 소수점 숫자를 읽습니다.
포맷타입 :  숫자
포맷 : Float
Single-precision 32비트 부동 소수점 수


readInt():int
바이트 스트림에서 부호 있는 32비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Integer

readMultiByte(length:uint, charSet:String):String
지정된 문자 세트를 사용하여 바이트 스트림에서 지정된 길이의 멀티바이트 문자열을 읽습니다.
포맷타입 :  문자열
포맷 : Multibyte
디폴트 시스템 코드페이지 사용하지 않고 특정 문자 세트 사용

readObject():*
바이트 배열에서 AMF 직렬 형식으로 인코딩된 객체를 읽습니다.
포맷타입 :  객체
포맷 : Object
AMF를 사용한 직렬화/역직렬화된 객체

readShort():int
바이트 스트림에서 부호 있는 16비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Short
16비트정수

readUnsignedByte():uint
바이트 스트림에서 부호 없는 바이트를 읽습니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

readUnsignedInt():uint
바이트 스트림에서 부호 없는 32비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Integer
32비트정수

readUnsignedShort():uint
바이트 스트림에서 부호 없는 16비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Short
16비트정수

readUTF():String
바이트 스트림에서 UTF-8 문자열을 읽습니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

readUTFBytes(length:uint):String
바이트 스트림에서 length 매개 변수에 지정된 길이의 UTF-8 바이트 시퀀스를 읽고 문자열을 반환합니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

toString():String
바이트 배열을 문자열로 변환합니다.

uncompress(algorithm:String):void
바이트 배열의 압축을 해제합니다.

writeBoolean(value:Boolean):void
부울 값을 씁니다.
포맷타입 : Boolean
포맷 : Boolean
0인 경우 false , 기타인 경우 true

writeByte(value:int):void
바이트 스트림에 바이트를 씁니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
지정된 바이트 배열 bytes에서 offset(0부터 시작하는 인덱스)부터 시작하여 length만큼의 바이트 시퀀스를 데이터 스트림에 씁니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

writeDouble(value:Number):void
바이트 스트림에 IEEE 754 배정밀도 64비트 부동 소수점 숫자를 씁니다.
포맷타입 :  숫자
포맷 : Double
Double-precision 64비트 부동 소수점 수

writeFloat(value:Number):void
바이트 스트림에 IEEE 754 단정밀도 32비트 부동 소수점 숫자를 씁니다.
포맷타입 :  숫자
포맷 : Float
Single-precision 32비트 부동 소수점 수

writeInt(value:int):void
바이트 스트림에 부호 있는 32비트 정수를 씁니다.
포맷타입 :  숫자
포맷 : Integer

writeMultiByte(value:String, charSet:String):void
지정된 문자 세트를 사용하여 멀티바이트 문자열을 바이트 스트림에 씁니다.
포맷타입 :  문자열
포맷 : Multibyte
디폴트 시스템 코드페이지 사용하지 않고 특정 문자 세트 사용

writeObject(object:*):void
객체를 바이트 배열에 AMF 직렬 형식으로 씁니다.
포맷타입 :  객체
포맷 : Object
AMF를 사용한 직렬화/역직렬화된 객체

writeShort(value:int):void
바이트 스트림에 16비트 정수를 씁니다.
포맷타입 :  숫자
포맷 : Short
16비트정수

writeUnsignedInt(value:uint):void
바이트 스트림에 부호 없는 32비트 정수를 씁니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

writeUTF(value:String):void
UTF-8 문자열을 바이트 스트림에 씁니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

writeUTFBytes(value:String):void
UTF-8 문자열을 바이트 스트림에 씁니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

통상적으로 IDataInput와 IDataOutput 인터페이스는 바이트 데이터를 관리하는 속성과 메서드를 선언하였으므로 이를 구현한 ByteArray와 FileStream을 이용하면 간단하게 데이터 읽기와 기록이 가능하다.
읽고 쓰기 작업시에 유효 바이트의 길이를 넘지 않기 위해 bytesAvailable속성을 이용하여 현재 위치에서 데이터 끝까지의 데이터 수를 읽어와 길이를 자르거나 필요한 만큼 읽어오며 작업을 하며, 현재 위치를 이동하거나 읽어오는 position속성과 함께 사용한다. 바로 이 둘( bytesAvailable , position )이 리드버퍼를 이용하는 속성이다.

리드버퍼란 바이트 묶음으로 구성된 컨테이너 정도라고 정의하면 된다. 데이터가 읽을 수 있는 상태가 되면 데이터는 이러한 리드 버퍼 안으로 들어오게 된다. 실제로 위의 readXXX() 메서드들은 리드버퍼의 데이터를 읽어 오는 것이며 open(동기)을 사용하면 리드버퍼에 데이터를 모두 담은 상태에서 데이터에 접근이 가능해지며 동기적 작업에서는 데이터의 모든 바이트를 바로 읽을 수 있기 때문에 사용가능한 유효 바이트를 초과하는 경우가 거의 없지만 openAsync(비동기)를 사용하면 리드버퍼에 데이터는 읽혀짐과 동시에 삭제가 되므로 다른 ByteArray의 delegator에 저장한 다음 작업하여야 한다.


참고) 1 바이트는 256가지 값의 표현이 가능하다. 1bit는 0,1로 2개의 값을 표현하고 이것이 모여 8bit(2^8)가 1바이트가 된다. 8비트는 2의 8승이며 0부터 255까지의 값을 표현 할 수 있다.

참고)
**** 오브젝트 인코딩 데이터 : AMF ****
ObjectEncoding 클래스는 객체를 직렬화하는 클래스(예: NetStream, NetConnection, SharedObject 및 ByteArray)가 이전 버전의 ActionScript와 작동할 수 있도록 합니다. 
객체 인코딩은 객체가 AMF(Action Message Format)에서 표현되는 방식을 제어합니다.
Flash Player는 AMF를 사용하여 Flash 응용 프로그램과 원격 서버 간의 효율적인 통신을 가능하게 합니다.
AMF는 원격 프로시저 호출을 압축된 이진 표현으로 인코딩하여 Flash Media Server에서 사용되는 HTTP/HTTPS 또는 RTMP/RTMPS 프로토콜을 통해 전송될 수 있도록 합니다.
ActionScript 객체 및 데이터 값은 이진 형식으로 직렬화됩니다.
이것은 일반적으로 XML 등과 같은 표현보다 더 압축된 형식입니다.
    
Flash Player 9는 AMF3 및 AMF0의 두 가지 다른 형식으로 직렬화할 수 있습니다.
AMF3은 ActionScript 3.0에서 사용되는 기본 직렬화로 ActionScript 1.0 및 2.0에서 사용되는 AMF0보다 다양한 장점을 제공합니다. AMF3은 AMF0보다 네트워크를 통해 더 효율적으로 데이트를 전송합니다.
또한, int 및 uint 객체를 정수로 전송하는 것을 지원하며, ByteArray, XML 및 IExternalizable 등 ActionScript 3.0에서만 사용 가능한 데이터 유형을 지원합니다. 이것은 ActionScript 3.0 및 Flex 2와 같은 AMF3 인코딩을 사용하는 서버에서만 사용할 수 있습니다.

ByteArray, NetConnection, NetStream, SharedObject, Socket 및 URLStream 클래스에는 ObjectEncoding 클래스로부터 상수가 할당되는 objectEncoding 속성이 포함되어 있습니다. objectEncoding 속성의 비헤이비어는 객체에 따라 달라집니다.

참고) endian자료 보기
Posted by 버터백통
AS3.0 Cookbook/XML2008. 9. 20. 18:10

서버사이드에 XML데이터를 업로드 하기 위해서는 URLLoader()를 사용하고 URLRequest()객체에 데이터를 보내고자 하는 xml데이터로 설정하고 데이터의 Mime타입을  "text/xml"로 설정하면 된다.

var xmlData:XML =   <gamescore>
          <username>{userName}</username>
          <score>{score}</score>
         </gamescore>;

[ URLRequest의 데이터와 컨텐츠 mime 타입설정 ]
URLRequest.data = xmlData;
URLRequest.contentType = "text/xml";


Posted by 버터백통
서블릿이나 기타 서버사이드 언어와 데이터를 주고 받을 때 실행할 메서드나 변수와 값을 클라이언트에서 넘겨주어야 하는 경우가 자주 발생한다. 역시 이러한 때에도 URLRequest()와 URLVariables() , URLLoader() 클래스를 이용한다.

데이터를 보내고 싶을 때는 URLVariables를 이용한다. URLVariables에 필요한 변수와 메소드를 설정한 다음
URLRequest의 data로 설정하여 URLLoader를 통해 load()를 실행한다.

[ 접근할 서버 경로 설정 ]
var request:URLRequest = new URLRequest("서버 사이드 url")

[ 서버에서 필요한 정보설정 ]
var variables:URLVariables = new URLVariables();
variables.method = "정의된 메소드 ex) checkID , saveData..";
variables.userId = "ID" //서버쪽에서 필요한 정보
variables.age = "30" //서버쪽에서 필요한 정보

[ URLRequest 객체에 데이터 설정 ]
request.data = variables;

[ 서버로 접근 ]
loader.load( request );
Posted by 버터백통
Loader나 URLLoader는 혼자서 서버에 접근할 수 없다. 따라서 서버에 문을 두드리기(요청) 위해서는 요청 전문 객체인 URLRequest를 사용하여 접근할 서버URL이나 파라미터를 설정한다.

URLRequest에는 url이라는 속성이 있다. 이곳에 접근할 서버주소를 설정하고
URLLoader의 load()메서드를 통해 서버에 접근하게 된다.
URLRequest.url = "server url"
URLLoader.load( URLRequest Delegate Variable )



가져올 데이터에 따라 URLLoaderDataFormat을 설정한다. 기본은 Text로 설정되어있지만 URL - encoded 된 데이터는 변수그룹으로 되어있는 것이 대부분이기에
URLLoader.dataFormat = URLLoaderDataFormat.VARIABLES
로 설정하면 사용하기 편하다.

가져온 데이터의 접근은 비교적 쉽다. 대부분의 접근방식으로 가져다 사용할 수 있기 때문이다.
trace( "URLLoader( e.target ).data :" , URLLoader( e.target ).data );
trace( "urlLoad.data                    :" , urlLoad.data );
trace( "urlLoad.data['someText']   :" , urlLoad.data["someText"] );
trace( "urlLoad.data.someNumber   :" , urlLoad.data.someNumber );


또는 아래처럼 연관배열 형태로 값을 가져올 수 있다.
 for( var property:String in urlLoad.data ){
    trace( "for in : " ,  property + " >> " + urlLoad.data[property] )
}
단 위처럼 가져오기 위해서는 URL - encoded의 규칙을 엄격하게 지켜야 한다.

만약 URLLoaderDataFormat.VARIABLES로 설정하지 않았다면 URLVariables를 통해 받은 데이터를
변수로 설정할 수 있다.
var vars:URLVariables = new URLVariables( URLLoader.data );
이후 필요한 데이터를 참조해서 사용하면 된다.
trace("vars : " , vars);
trace("someText : " , vars.someText);
trace("someNumber : " , vars.someNumber);






Posted by 버터백통
AS3 에서 Data통신은 URLLoader()를 사용한다. 텍스트 , 바이너리 데이터 , URL-encoded 등의 데이터를 처리할 수 있다.(이미지 데이터 는 Loader를 사용)

URLLoader는 URLRequestURLVariables 또는 URLStream등과 함께 사용하며, 굉장히 유연하면서도 강력한 기능을 발휘 한다.

[ 속성 ]

bytesLoaded : uint = 0

로드 작업 중 지금까지 로드한 바이트 수를 나타냅니다.

bytesTotal : uint = 0

다운로드한 데이터의 총 바이트 수를 나타냅니다.

data : *

로드 작업으로 수신된 데이터입니다.

dataFormat : String = "text"

다운로드하는 데이터를 텍스트(URLLoaderDataFormat.TEXT), 원시 이진 데이터(URLLoaderDataFormat.BINARY) 또는 URL 인코딩된 변수(URLLoaderDataFormat.VARIABLES) 중 어떤 형식으로 수신할 것인지 제어합니다.

 

 

 [ 메서드 ]

URLLoader(request:URLRequest = null)

URLLoader 객체를 만듭니다.

close():void

진행 중인 로드 작업을 닫습니다.

load(request:URLRequest):void

지정된 URL에서 데이터를 보내거나 로드합니다.

 
[ 이벤트 ]
 

complete

수신된 모든 데이터가 디코딩된 후 URLLoader 객체의 data 속성에 배치되면 전달됩니다.

httpStatus

URLLoader.load() 호출로 HTTP를 통해 데이터 액세스를 시도하고 현재의 Flash Player 환경에서 이 요청에 대한 상태 코드를 감지 및 반환할 수 있을 때 전달됩니다.

ioError

URLLoader.load() 호출로 치명적인 오류가 발생하여 다운로드가 중단되면 전달됩니다.

open

URLLoader.load() 메서드 호출에 이어 다운로드 작업이 시작될 때 전달됩니다.

progress

다운로드 작업이 진행되어 데이터가 수신될 때 전달됩니다.

securityError

URLLoader.load() 호출로 보안 샌드박스 외부의 서버로부터 데이터 로드를 시도할 때 전달됩니다.

 
* 참고 )
만약 받고자 하는 데이터가 URL-encoded데이터인 경우 다음과 같은 규칙을 지켜야 한다.
- 각 변수와 값은 공백없이 연결되어야 한다.
- 불러온 문자열은 언제나 문자열로 취급한다. 따라서 ""를 붙일 필요가 없다.
- 하나 이상의 변수와 값이 있으면 & 를 사용하여 묶어야 한다.
- 값사이 공백은 %20이 아닌 +로 연결한다.(보다 안정적이다.)
- 16진수 이스케이프 문자를 사용해야 한다. (L's book -> L%27s+book)







Posted by 버터백통
2008. 7. 6. 11:17

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.