패키지 | flash.net |
클래스 | public class DatagramSocket |
상속 | DatagramSocket EventDispatcher Object |
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 2 |
AIR 프로파일 지원: 이 기능은 모든 데스크톱 운영 체제, iOS(AIR 3.8부터) 및 Android(AIR 3.8부터)에서 지원됩니다. 이 기능은 AIR for TV 장치에서는 지원되지 않습니다. DatagramSocket.isSupported
속성을 사용하여 런타임에 지원을 테스트할 수 있습니다. 여러 프로파일 간 API 지원에 대한 자세한 내용은 AIR 프로파일 지원을 참조하십시오.
데이터그램 패킷은 소스와 대상 간에 개별적으로 전송됩니다. 패킷이 전송된 순서와 다르게 도착할 수도 있습니다. 전송 시 손실된 패킷은 다시 전송되거나 검출되지 않습니다.
데이터그램 소켓을 사용하여 전송한 데이터는 전송 가능한 크기의 패킷으로 자동으로 나누어지지 않습니다. MTU(Maximum Transmission Unit) 크기를 초과하는 UDP 패킷을 보내면 네트워크에서 경고 메시지 없이 이 패킷을 버립니다. MTU 제한은 전송 경로의 인터페이스, 스위치 또는 라우터에 대한 최소 MTU입니다. NetworkInterface 클래스를 사용하여 로컬 인터페이스의 MTU를 정할 수 있지만 네트워크의 다른 노드는 다른 MTU 값을 가질 수 있습니다.
Socket 클래스는 패킷 전달을 보장하고 큰 패킷을 자동으로 나누었다가 다시 조합하는 TCP를 사용합니다. TCP는 향상된 네트워크 대역폭 관리도 제공합니다. TCP 소켓을 사용하여 전송한 데이터의 경우 지연 시간이 좀더 길어질 수 있지만 대부분의 경우 비용 측면의 혜택이 더 크므로 TCP 소켓을 사용하는 것이 좋습니다. 대부분의 네트워크 통신은 DatagramSocket 클래스가 아닌 Socket 클래스를 사용해야 합니다.
DatagramSocket 클래스는 전송 지연 시간이 짧아야 하고 패킷 손실이 허용되는 응용 프로그램을 사용하여 작업하는 경우 유용합니다. 예를 들어 VoIP(voice-over-IP) 응용 프로그램의 네트워크 작업 및 실시간 멀티플레이어 게임에서 UDP의 이점을 활용할 수 있습니다. DatagramSocket 클래스는 일부 서버측 응용 프로그램에도 유용합니다. UDP는 상태가 저장되지 않는 프로토콜이므로 서버에서는 TCP에서 처리했던 것보다 더 많은 클라이언트의 요청을 처리할 수 있습니다.
DatagramSocket 클래스는 Adobe AIR 응용 프로그램 및 응용 프로그램 보안 샌드박스에서만 사용할 수 있습니다.
보안에 대한 자세한 내용은 Flash Player 개발자 센터 항목: 보안을 참조하십시오.
추가 정보
관련 API 요소
속성 | 정의 주체 | ||
---|---|---|---|
bound : Boolean [읽기 전용]
이 소켓 객체가 현재 로컬 주소 및 포트에 바인딩되었는지 여부를 나타냅니다. | DatagramSocket | ||
connected : Boolean [읽기 전용]
이 소켓 객체가 현재 원격 주소 및 포트에 연결되었는지 여부를 나타냅니다. | DatagramSocket | ||
constructor : Object
지정된 객체 인스턴스의 클래스 객체 또는 생성자 함수에 대한 참조입니다. | Object | ||
isSupported : Boolean [정적] [읽기 전용]
런타임 환경에서 DatagramSocket 기능이 지원되는지 여부를 나타냅니다. | DatagramSocket | ||
localAddress : String [읽기 전용]
로컬 컴퓨터에서 이 소켓이 바인딩된 IP 주소입니다. | DatagramSocket | ||
localPort : int [읽기 전용]
로컬 컴퓨터에서 이 소켓이 바인딩된 포트입니다. | DatagramSocket | ||
remoteAddress : String [읽기 전용]
이 소켓을 연결할 원격 컴퓨터의 IP 주소입니다. | DatagramSocket | ||
remotePort : int [읽기 전용]
이 소켓을 연결할 원격 컴퓨터의 포트입니다. | DatagramSocket |
메서드 | 정의 주체 | ||
---|---|---|---|
DatagramSocket 객체를 만듭니다. | DatagramSocket | ||
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
리스너에서 이벤트 알림을 받을 수 있도록 EventDispatcher 객체에 이벤트 리스너 객체를 등록합니다. | EventDispatcher | ||
이 소켓을 지정된 로컬 주소 및 포트에 바인딩합니다. | DatagramSocket | ||
소켓을 닫습니다. | DatagramSocket | ||
소켓을 지정된 원격 주소 및 포트에 연결합니다. | DatagramSocket | ||
이벤트를 이벤트 흐름으로 전달합니다. | EventDispatcher | ||
EventDispatcher 객체에 특정 유형의 이벤트에 대한 리스너가 등록되어 있는지 여부를 확인합니다. | EventDispatcher | ||
지정된 속성이 객체에 정의되어 있는지 여부를 나타냅니다. | Object | ||
Object 클래스의 인스턴스가 매개 변수로 지정된 객체의 프로토타입 체인에 있는지 여부를 나타냅니다. | Object | ||
지정된 속성이 존재하고 열거 가능한지 여부를 나타냅니다. | Object | ||
이 DatagramSocket 객체가 바인딩된 IP 주소 및 포트에서 들어오는 패킷을 수신할 수 있도록 합니다. | DatagramSocket | ||
EventDispatcher 객체에서 리스너를 제거합니다. | EventDispatcher | ||
UDP를 사용하여 ByteArray의 바이트를 포함하는 패킷을 전송합니다. | DatagramSocket | ||
루프 작업에서 동적 속성을 사용할 수 있는지 여부를 설정합니다. | Object | ||
로캘별 규칙에 따라 서식이 지정된 이 객체의 문자열 표현을 반환합니다. | Object | ||
지정된 객체의 문자열 표현을 반환합니다. | Object | ||
지정된 객체의 프리미티브 값을 반환합니다. | Object | ||
이 EventDispatcher 객체 또는 조상 객체에 지정한 이벤트 유형에 대한 이벤트 리스너가 등록되어 있는지 여부를 확인합니다. | EventDispatcher |
이벤트 | 요약 | 정의 주체 | ||
---|---|---|---|---|
[브로드캐스트 이벤트] Flash Player 또는 AIR 응용 프로그램이 운영 체제 포커스를 얻어 활성화될 때 전달됩니다. | EventDispatcher | |||
운영 체제에서 이 소켓을 닫으면 전달됩니다. | DatagramSocket | |||
이 소켓에서 데이터 패킷을 수신하면 전달됩니다. | DatagramSocket | |||
[브로드캐스트 이벤트] Flash Player 또는 AIR 응용 프로그램이 운영 체제 포커스를 잃고 비활성화될 때 전달됩니다. | EventDispatcher | |||
이 소켓이 I/O 오류를 받을 때 전달됩니다. | DatagramSocket |
bound | 속성 |
connected | 속성 |
isSupported | 속성 |
localAddress | 속성 |
localPort | 속성 |
remoteAddress | 속성 |
remotePort | 속성 |
DatagramSocket | () | 생성자 |
public function DatagramSocket()
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 2 |
DatagramSocket 객체를 만듭니다.
오류
SecurityError — AIR 응용 프로그램 보안 샌드박스 외부의 내용에서 DatagramSocket 객체를 만들려는 경우
|
bind | () | 메서드 |
public function bind(localPort:int = 0, localAddress:String = "0.0.0.0"):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 2 |
이 소켓을 지정된 로컬 주소 및 포트에 바인딩합니다.
bind()
메서드는 동기적으로 실행됩니다. 바인딩 작업은 코드의 다음 줄이 실행되기 전에 완료됩니다.
매개 변수
localPort:int (default = 0 ) — 로컬 컴퓨터에 바인딩할 포트 번호입니다. localPort 가 0(기본값)으로 설정된 경우 사용 가능한 다음 시스템 포트가 바인딩됩니다. 1024 미만인 포트 번호에 연결하기 위한 권한은 시스템 보안 정책에 따라 다를 수 있습니다. 예를 들어 Mac 및 Linux 시스템의 경우 1024 미만의 포트에 연결하려면 응용 프로그램이 루트 권한으로 실행 중이어야 합니다.
| |
localAddress:String (default = "0.0.0.0 ") — 바인딩할 로컬 컴퓨터의 IP 주소입니다. 이 주소는 IPv4 또는 IPv6 주소일 수 있습니다. localAddress 가 0.0.0.0 (기본값)으로 설정된 경우 소켓은 사용 가능한 모든 IPv4 주소를 수신합니다. 사용 가능한 모든 IPv6 주소를 수신하려면 "::"를 localAddress 인수로 지정해야 합니다. IPv6 주소를 사용하려면 컴퓨터 및 네트워크 모두가 IPv6을 지원하도록 구성되어야 합니다. 또한 IPv4 주소에 바인딩된 소켓은 IPv6 주소의 소켓에 연결할 수 없습니다. 이와 마찬가지로 IPv6 주소에 바인딩된 소켓은 IPv4 주소인 소켓에 연결할 수 없습니다. 주소 유형은 일치해야 합니다.
|
오류
RangeError — 이 오류는 localPort 가 0보다 작거나 65535보다 클 경우 발생합니다.
| |
ArgumentError — 이 오류는 localAddress 가 구문상 올바른 형식을 갖춘 IP 주소가 아닌 경우 발생합니다.
| |
IOError — 이 오류는 다음과 같은 경우처럼 소켓을 바인딩할 수 없는 경우에 발생합니다.
| |
Error — 이 오류는 localAddress 가 유효한 로컬 주소가 아닌 경우 발생합니다.
|
예제 ( 예제 사용 방법 )
udpSocket.bind(); //bind to any available port, listen on all IPv4 addresses udpSocket.bind( 0, "0.0.0.0" ); //same as above udpSocket.bind( 0, "127.0.0.1" ); //any available port on the localhost address udpSocket.bind( 8989, "192.168.0.1" ); //port 8989 on a particular IPv4 address udpSocket.bind( 0, "::" ); //any available port on all IPv6 address udpSocket.bind( 8989, "::1" ); //port 8989 on the IPv6 localhost address udpSocket.bind( 8989, "2001:1890:110b:1e19:f06b:72db:7026:3d7a" ); //port 8989 on a particular IPv6 address
close | () | 메서드 |
connect | () | 메서드 |
public function connect(remoteAddress:String, remotePort:int):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 2 |
소켓을 지정된 원격 주소 및 포트에 연결합니다.
데이터그램 소켓이 "연결됨" 상태인 경우 데이터그램 패킷은 지정된 대상에 대해서만 전송 및 수신을 수행할 수 있습니다. 다른 소스의 패킷은 무시됩니다. 데이터그램 소켓을 연결할 필요가 없습니다. 연결을 설정하면 다른 소스의 관계없는 패킷을 필터링하지 않아도 됩니다. 하지만 UDP 소켓 연결은 TCP 연결에 대한 것이므로 지속적인 네트워크 연결이 아닙니다. 소켓의 원격 끝이 존재하지 않을 수도 있습니다.
bind()
메서드가 호출되지 않은 경우 소켓은 자동으로 기본 로컬 주소 및 포트에 바인딩됩니다.
매개 변수
remoteAddress:String — 연결을 설정할 원격 컴퓨터의 IP 주소입니다. 이 주소는 IPv4 또는 IPv6 주소일 수 있습니다. bind() 가 호출되지 않았고 remoteAddress , IPv4 또는 IPv6의 주소 집합이 기본 bind() 를 호출할 때 사용되는 경우
| |
remotePort:int — 연결 설정에 사용되는 원격 컴퓨터의 포트 번호입니다.
|
오류
RangeError — 이 오류는 localPort 가 1보다 작거나 65535보다 클 경우 발생합니다.
| |
ArgumentError — 이 오류는 localAddress 가 구문상 유효한 주소가 아닌 경우 발생합니다. 또는 기본 라우트 주소('0.0.0.0' 또는 '::')가 사용되는 경우에 발생합니다.
| |
IOError — 이 오류는 bind() 가 connect() 호출 전에 호출되지 않았거나 원격 주소 집합에 대한 기본 바인딩이 가능하지 않을 때와 같이 소켓을 연결할 수 없는 경우에 발생합니다.
|
receive | () | 메서드 |
public function receive():void
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 2 |
이 DatagramSocket 객체가 바인딩된 IP 주소 및 포트에서 들어오는 패킷을 수신할 수 있도록 합니다.
함수에서 즉시 반환합니다. 데이터 패킷을 수신하면 DatagramSocket 객체에서 data
이벤트를 전달합니다.
이벤트
data: — UDP 패킷이 수신되는 경우
|
send | () | 메서드 |
public function send(bytes:ByteArray, offset:uint = 0, length:uint = 0, address:String = null, port:int = 0):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 2 |
UDP를 사용하여 ByteArray의 바이트를 포함하는 패킷을 전송합니다.
소켓이 연결된 경우 connect()
메서드에 지정된 원격 주소와 포트로 패킷이 전송되고 대상 IP 주소와 포트는 지정할 수 없습니다. 소켓이 연결되지 않은 경우 지정된 주소와 포트로 패킷이 전송되고 address
및 port
에 유효한 값을 제공해야 합니다. bind()
메서드가 호출되지 않은 경우 소켓은 자동으로 기본 로컬 주소 및 포트에 바인딩됩니다.
참고: 브로드캐스트 주소로 데이터를 전송하는 작업은 지원되지 않습니다.
매개 변수
bytes:ByteArray — 패킷 데이터를 포함하는 ByteArray입니다.
| |
offset:uint (default = 0 ) — 패킷을 시작할 bytes ByteArray 객체에 대한 0부터 시작하는 오프셋입니다.
| |
length:uint (default = 0 ) — 패킷의 바이트 수입니다. 기본값이 0으로 설정되면 offset 매개 변수가 지정하는 값을 시작으로 전체 ByteArray를 전송합니다.
| |
address:String (default = null ) — 원격 컴퓨터의 IPv4 또는 IPv6 주소입니다. connect() 메서드를 사용하여 아직 주소를 지정하지 않은 경우 주소가 필요합니다.
| |
port:int (default = 0 ) — 원격 컴퓨터의 포트 번호입니다. connect() 메서드를 사용하여 아직 포트를 지정하지 않은 경우 0보다 크고 65536보다 작은 값이 필요합니다.
|
오류
RangeError — 이 오류는 port 가 1보다 작거나 65535보다 클 경우 발생합니다.
| |
ArgumentError — 소켓이 연결되어 있지 않고 address 가 올바른 형식을 갖춘 IP 주소가 아닌 경우입니다.
| |
IOError — 이 오류가 발생하는 경우는 다음과 같습니다.
| |
Error — bytes 매개 변수가 null 인 경우
| |
RangeError — offset 이 bytes 에 지정된 ByteArray 길이보다 크거나 offset 과 length 를 합하여 쓰도록 지정된 데이터 크기가 사용 가능한 데이터를 초과하는 경우입니다.
| |
IllegalOperationError — 소켓이 이미 연결된 상태에서 address 또는 port 매개 변수가 지정되는 경우
|
close | 이벤트 |
flash.events.Event
속성 Event.type =
flash.events.Event.CLOSE
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 2 |
운영 체제에서 이 소켓을 닫으면 전달됩니다.
close
이벤트는 DatagramSocket close()
메서드가 호출되면 전달되지 않습니다.
Event.CLOSE
상수는 close
이벤트 객체의 type
속성 값을 정의합니다.
이 이벤트에는 다음과 같은 속성이 있습니다.
속성 | 값 |
---|---|
bubbles | false |
cancelable | false . 취소할 기본 비헤이비어가 없습니다. |
currentTarget | 이벤트 리스너를 통해 Event 객체를 처리하고 있는 객체입니다. |
target | 연결이 종료된 객체입니다. |
data | 이벤트 |
flash.events.DatagramSocketDataEvent
속성 DatagramSocketDataEvent.type =
flash.events.DatagramSocketDataEvent.DATA
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 2 |
이 소켓에서 데이터 패킷을 수신하면 전달됩니다.
data
이벤트 객체의 type
속성 값을 정의합니다.
ioError | 이벤트 |
flash.events.IOErrorEvent
속성 IOErrorEvent.type =
flash.events.IOErrorEvent.IOERROR
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 2.5 |
이 소켓이 I/O 오류를 받을 때 전달됩니다.
package { import flash.display.Sprite; import flash.events.DatagramSocketDataEvent; import flash.events.Event; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.net.DatagramSocket; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFieldType; import flash.utils.ByteArray; import flash.utils.Timer; public class DatagramSocketExample extends Sprite { private var datagramSocket:DatagramSocket = new DatagramSocket();; private var localIP:TextField; private var localPort:TextField; private var logField:TextField; private var targetIP:TextField; private var targetPort:TextField; private var message:TextField; public function DatagramSocketExample() { setupUI(); } private function bind( event:Event ):void { if( datagramSocket.bound ) { datagramSocket.close(); datagramSocket = new DatagramSocket(); } datagramSocket.bind( parseInt( localPort.text ), localIP.text ); datagramSocket.addEventListener( DatagramSocketDataEvent.DATA, dataReceived ); datagramSocket.receive(); log( "Bound to: " + datagramSocket.localAddress + ":" + datagramSocket.localPort ); } private function dataReceived( event:DatagramSocketDataEvent ):void { //Read the data from the datagram log("Received from " + event.srcAddress + ":" + event.srcPort + "> " + event.data.readUTFBytes( event.data.bytesAvailable ) ); } private function send( event:Event ):void { //Create a message in a ByteArray var data:ByteArray = new ByteArray(); data.writeUTFBytes( message.text ); //Send a datagram to the target try { datagramSocket.send( data, 0, 0, targetIP.text, parseInt( targetPort.text )); log( "Sent message to " + targetIP.text + ":" + targetPort.text ); } catch ( error:Error ) { log( error.message ); } } private function log( text:String ):void { logField.appendText( text + "\n" ); logField.scrollV = logField.maxScrollV; trace( text ); } private function setupUI():void { targetIP = createTextField( 10, 10, "Target IP:", "192.168.0.1" ); targetPort = createTextField( 10, 35, "Target port:", "8989" ); message = createTextField( 10, 60, "Message:", "Lucy can't drink milk." ); localIP = createTextField( 10, 85, "Local IP", "0.0.0.0"); localPort = createTextField( 10, 110, "Local port:", "0" ); createTextButton( 250, 135, "Bind", bind ); createTextButton( 300, 135, "Send", send ); logField = createTextField( 10, 160, "Log:", "", false, 200 ) this.stage.nativeWindow.activate(); } private function createTextField( x:int, y:int, label:String, defaultValue:String = '', editable:Boolean = true, height:int = 20 ):TextField { var labelField:TextField = new TextField(); labelField.text = label; labelField.type = TextFieldType.DYNAMIC; labelField.width = 180; labelField.x = x; labelField.y = y; var input:TextField = new TextField(); input.text = defaultValue; input.type = TextFieldType.INPUT; input.border = editable; input.selectable = editable; input.width = 280; input.height = height; input.x = x + labelField.width; input.y = y; this.addChild( labelField ); this.addChild( input ); return input; } private function createTextButton( x:int, y:int, label:String, clickHandler:Function ):TextField { var button:TextField = new TextField(); button.htmlText = "<u><b>" + label + "</b></u>"; button.type = TextFieldType.DYNAMIC; button.selectable = false; button.width = 180; button.x = x; button.y = y; button.addEventListener( MouseEvent.CLICK, clickHandler ); this.addChild( button ); return button; } } }
Tue Jun 12 2018, 03:17 PM Z