Flash CS3 설명서 |
|||
| ActionScript 3.0 프로그래밍 > 네트워킹 및 통신 > 소켓 연결 | |||
ActionScript 3.0에는 XML 소켓 연결과 이진 소켓 연결이라는 두 가지 종류의 소켓 연결이 가능합니다. XML 소켓을 사용하면 원격 서버에 연결하고 명시적으로 닫힐 때까지 열린 상태로 유지되는 서버 연결을 만들 수 있습니다. 이를 통해 지속적으로 새로운 서버 연결을 열지 않고도 서버와 클라이언트 간에 XML 데이터를 교환할 수 있습니다. XML 소켓 서버를 사용하는 경우 다른 좋은 점은 사용자가 명시적으로 데이터를 요청할 필요가 없다는 점입니다. 요청 없이 서버에서 데이터를 보낼 수 있으며 XML 소켓 서버에 연결된 모든 클라이언트에 데이터를 보낼 수 있습니다.
클라이언트와 서버에서 특별히 XML 패킷을 교환하지 않아도 된다는 점을 제외하면 이진 소켓 연결도 XML 소켓과 비슷합니다. 대신 연결할 때 이진 정보로 데이터를 전송할 수 있습니다. 따라서 메일 서버(POP3, SMTP 및 IMAP) 및 뉴스 서버(NNTP)를 포함한 다양한 서비스에 연결할 수 있습니다.
ActionScript 3.0에서 처음 도입된 Socket 클래스는 ActionScript 코드를 활성화하여 소켓 연결을 만들고 원시 이진 데이터를 읽고 쓸 수 있도록 합니다. XMLSocket 클래스와 비슷하지만 수신되거나 전송되는 데이터의 형식을 지정하지는 않습니다. 소켓 클래스는 이진 프로토콜을 사용하는 서버와 상호 운용하는 데 유용합니다. 이진 소켓 연결을 사용하여 POP3, SMTP, IMAP 및 NNTP 같은 여러 가지 인터넷 프로토콜과 상호 작업할 수 있는 코드를 작성할 수 있습니다. 따라서 Flash Player에서 메일 및 뉴스 서버에 연결할 수 있습니다.
Flash Player에서는 서버의 이진 프로토콜을 사용하여 해당 서버와 직접 통신할 수 있습니다. 일부 서버에서는 big-endian 바이트 순서를 사용하는 반면 일부 서버에서는 little-endian 바이트 순서를 사용합니다. "네트워크 바이트 순서"가 big-endian이므로 인터넷에서 대부분의 서버는 big-endian 바이트 순서를 사용합니다. little-endian 바이트 순서가 널리 사용되는 이유는 Intel® x86 아키텍처에서 사용되기 때문입니다. Endian 바이트 순서를 선택할 때는 데이터를 주고받는 서버의 바이트 순서와 일치하는 바이트 순서를 사용해야 합니다. IDataInput 및 IDataOutput 인터페이스에서 수행되는 모든 연산과 그러한 인터페이스(ByteArray, Socket 및 URLStream)를 구현하는 클래스는 기본적으로 big-endian 형식으로 인코딩됩니다. 즉, 가장 중요한 바이트가 앞에 옵니다. 이는 Java 및 공식 네트워크 바이트 순서와 일치시키기 위한 것입니다. big-endian 바이트 순서를 사용할지 또는 little-endian 바이트 순서를 사용할지 변경하려면 endian 속성을 Endian.BIG_ENDIAN 또는 Endian.LITTLE_ENDIAN으로 설정할 수 있습니다.
|
참고 |
|
소켓 클래스는 IDataInput 및 IDataOutput 인터페이스(flash.utils 패키지에 있음)에서 구현되는 모든 메서드를 상속하며 이러한 메서드는 소켓에서 쓰고 읽는 데 사용해야 합니다. |
ActionScript는 서버와의 연속적인 연결을 제공하는 내장 XMLSocket 클래스를 제공합니다. 이와 같은 연속 연결은 대기 문제를 해결하며 채팅 응용 프로그램이나 멀티플레이어 게임과 같은 실시간 응용 프로그램에서 주로 사용됩니다. 기존 HTTP 기반 채팅 솔루션은 빈번하게 서버를 폴링하여 HTTP 요청을 사용해 새로운 메시지를 다운로드합니다. 반면에, XMLSocket 채팅 솔루션은 서버와의 연결을 유지하여 클라이언트가 요청하지 않아도 서버에 들어오는 메시지를 서버가 즉시 전송할 수 있도록 합니다.
소켓 연결을 만들려면 소켓 연결 요청을 기다리고 응답을 SWF 파일에 전송하는 서버측 응용 프로그램을 만들어야 합니다. 이 유형의 서버측 응용 프로그램은 Java, Python 또는 Perl과 같은 프로그래밍 언어로 작성할 수 있습니다. XMLSocket 클래스를 사용하려면 XMLSocket 클래스에 사용된 프로토콜을 이해할 수 있는 데몬이 서버 컴퓨터에서 실행되고 있어야 합니다. 다음 목록에 이 프로토콜이 설명되어 있습니다.
|
중요 |
|
XMLSocket 클래스는 자동으로 방화벽을 통해 터널링할 수 없습니다. 그 이유는 RTMP(Real-Time Messaging Protocol) 프로토콜과 달리, XMLSocket에는 HTTP 터널링 기능이 없기 때문입니다. HTTP 터널링을 사용해야 할 경우 Flash Remoting 또는 Flash Media Server(RTMP 지원)를 대신 사용하십시오. |
XMLSocket 객체가 연결할 수 있는 서버 및 연결 방법에는 다음과 같은 제약이 있습니다.
XMLSocket.connect() 메서드는 1024 이상의 TCP 포트 번호에만 연결할 수 있습니다. 이 제한 사항 때문에 XMLSocket 객체와 통신하는 서버 데몬 역시 1024 이상의 포트 번호에 할당되어야 합니다. 1024보다 작은 포트 번호는 주로 FTP (21), Telnet (23), SMTP (25), HTTP (80) 및 POP3 (110) 등과 같은 시스템 서비스에 사용되므로 보안 문제 때문에 XMLSocket 객체가 이러한 포트를 사용하지 못하도록 차단한 것입니다. 이렇게 포트 번호를 제한함으로써 이러한 리소스가 부적절하게 액세스되거나 남용될 가능성을 줄일 수 있습니다. XMLSocket.connect() 메서드는 SWF 파일이 저장된 동일 도메인의 컴퓨터에만 연결할 수 있습니다. 이 제약은 로컬 디스크에서 실행되는 SWF 파일에는 적용되지 않습니다. (이 제약은 URLLoader.load()의 보안 규칙과 동일합니다.) SWF가 있는 도메인과 다른 도메인에서 실행 중인 서버 데몬에 연결하려면 해당 서버에 특정 도메인으로부터의 액세스를 허용하는 보안 정책 파일을 작성하면 됩니다.|
중요 |
|
XMLSocket 객체와 통신할 서버를 설정하는 작업은 그리 간단하지 않습니다. 응용 프로그램에서 실시간 상호 작용이 필요하지 않다면 XMLSocket 클래스 대신 URLLoader 클래스를 사용합니다. |
XMLSocket 클래스의 XMLSocket.connect() 및 XMLSocket.send() 메서드를 사용하여 소켓 연결 상태에서 서버와 XML을 교환할 수 있습니다. XMLSocket.connect() 메서드는 웹 서버 포트와의 소켓 연결을 설정하며 XMLSocket.send() 메서드는 소켓 연결에 지정된 서버에 XML 객체를 전달합니다.
XMLSocket.connect() 메서드를 호출할 때 Flash Player에서는 서버와 TCP/IP 연결을 설정하고 다음 중 하나가 발생할 때까지 이 연결을 그대로 유지합니다.
XMLSocket.close() 메서드가 호출됩니다.다음 코드는 수신 연결을 허용하고 명령 프롬프트 창에 수신된 메시지를 표시하는, Java로 작성된 간단한 XMLSocket 서버를 보여 줍니다. 명령줄에서 서버를 시작할 때 다른 포트 번호를 지정할 수 있지만 기본적으로 새로운 서버는 로컬 컴퓨터의 포트 8080에서 만들어집니다.
새 텍스트 문서를 만들고 다음 코드를 추가합니다.
import java.io.*;
import java.net.*;
class SimpleServer
{
private static SimpleServer server;
ServerSocket socket;
Socket incoming;
BufferedReader readerIn;
PrintStream printOut;
public static void main(String[] args)
{
int port = 8080;
try
{
port = Integer.parseInt(args[0]);
}
catch (ArrayIndexOutOfBoundsException e)
{
// 예외를 포착하고 계속 진행합니다.
}
server = new SimpleServer(port);
}
private SimpleServer(int port)
{
System.out.println(">> Starting SimpleServer");
try
{
socket = new ServerSocket(port);
incoming = socket.accept();
readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
printOut = new PrintStream(incoming.getOutputStream());
printOut.println("Enter EXIT to exit.\r");
out("Enter EXIT to exit.\r");
boolean done = false;
while (!done)
{
String str = readerIn.readLine();
if (str == null)
{
done = true;
}
else
{
out("Echo: " + str + "\r");
if(str.trim().equals("EXIT"))
{
done = true;
}
}
incoming.close();
}
}
catch (Exception e)
{
System.out.println(e);
}
}
private void out(String str)
{
printOut.println(str);
System.out.println(str);
}
}
문서를 하드 디스크에 SimpleServer.java로 저장하고 Java 컴파일러를 사용하여 컴파일하면 SimpleServer.class라는 Java 클래스 파일이 만들어집니다.
명령 프롬프트를 열고 java SimpleServer를 입력하여 XMLSocket 서버를 시작할 수 있습니다. SimpleServer.class 파일은 로컬 컴퓨터 네트워크의 어디에나 보관할 수 있고 웹 서버의 루트 디렉터리에만 놓지 않아도 됩니다.
|
참고 |
|
파일이 Java 클래스 경로에 없어 서버를 시작할 수 없는 경우 |
ActionScript 응용 프로그램에서 XMLSocket에 연결하려면 다음과 같이 호스트 이름과 포트 번호를 전달할 때 XMLSocket 클래스의 새 인스턴스를 만들고 XMLSocket.connect() 메서드를 호출해야 합니다.
var xmlsock:XMLSocket = new XMLSocket();
xmlsock.connect("127.0.0.1", 8080);
XMLSocket.connect()에 대한 호출이 호출자의 보안 샌드박스 외부에 있는 서버 또는 1024 미만의 포트에 대한 연결을 시도하면 securityError(flash.events.SecurityErrorEvent) 이벤트가 발생합니다.
서버에서 데이터를 수신할 때마다 data 이벤트(flash.events.DataEvent.DATA)가 전달됩니다.
xmlsock.addEventListener(DataEvent.DATA, onData);
private function onData(event:DataEvent):void
{
trace("[" + event.type + "] " + event.data);
}
XMLSocket 서버에 데이터를 전송하려면 XMLSocket.send() 메서드를 사용하고 XML 객체나 문자열을 전달합니다. Flash Player가 제공된 매개 변수를 String 객체로 변환하고 XMLSocket 서버에 내용을 전송하고 뒤에 0바이트를 붙입니다.
xmlsock.send(xmlFormattedData);
XMLSocket.send() 메서드는 데이터가 성공적으로 전송되었는지 여부를 나타내는 값을 반환하지 않습니다. 데이터를 전송하려 할 때 오류가 발생하면 IOError 오류가 발생합니다.
|
참고 |
|
XML 소켓 서버에 전송하는 각 메시지는 개행( |
Flash CS3
이 페이지에 의견 추가되면 전자 메일 알림 받기 | 의견 보고서
현재 페이지: http://livedocs.adobe.com/flash/9.0_kr/main/00000318.html