플래시 socket 통신 안전 샌 드 박스 문제 해결(추가 사례)
8838 단어 자바socket웹 응용 프로그램actionscript
플래시 가 socket 통신 을 시작 하 는 세 가지 과정:
1.페이지 에 포 장 된 플래시 가 socket 통신 요청 을 할 때 서버 엔 드 843 포트 를 찾 아 crossdomain.xml 파일 을 가 져 옵 니 다.
2.서버 가 843 을 열지 않 았 을 때 플래시 플레이 어 는 요청 한 swf 파일 에 Security.loadPolicy File 을 사 용 했 는 지 확인 합 니 다(xmlsocket://127.0.0.1:4299)
정책 파일 crossdomain.xml 를 불 러 옵 니 다.
3.없 으 면 이 요청 한 swf 가 연결 할 대상 포트 에 정책 파일 이 있 는 지 확인 합 니 다.
위 세 단계 에서 정책 파일 을 찾 지 못 하면 연결 에 실패 하고 오류 알림 이 발생 합 니 다.
[SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"]
둘째, 이 문제 가 발생 한 원인:
새 플래시 플레이어 입 니 다.플래시 파일 이 socket 통신 을 하려 면 서버 에 crossdomain.xml 파일 을 가 져 와 야 합 니 다.찾 지 못 하면 이 문제 가 발생 합 니 다.
(오래된 flash player 는 http 요청 방식 이나 xmlsocket socket 방식 을 사용 하 더 라 도 보안 정책 파일 을 공유 합 니 다.이 정책 파일 은 주 도 메 인 디 렉 터 리 에 두 기만 하면 됩 니 다.
새 버 전의 요구 사항 은 http 요청 방식 을 사용 하려 면 정책 파일 을 디 렉 터 리 아래 에 두 어야 합 니 다.사용 하 는 socket 요청 방식 은 socket 포트 를 통 해 이 정책 파일 을 받 아야 합 니 다. 그 에 대응 하 는 호출 방식 은: http 요청:Security.loadPolicyFile(")http://www.xxx.com/crossdomain.xml"); socket 또는 xmlsocket 요청:Security.loadPolicy File("xmlsocket://www.xxx.com:port");)
3.그러면 socket 정책 파일 을 플래시 플레이어 에 어떻게 보 냅 니까?
세 가지 방법:
기본 843 포트 사용
flash player 는 socket.connect(address,port)에 있 습 니 다.실행 하기 전에 세 가지 과정 에 따라 socket 서버 843 포트 에"
이때 843 포트 를 감청 하 는 서버 가 있다 면 이 문자열 을 받 은 후 xml 형식 으로 정책 파일 을 발휘 하면 해 결 됩 니 다.
2.사용자 정의 포트 사용(추천)
물론 포트 를 스스로 설정 할 수도 있 지만 이 럴 때 는 Http 방식 이 아니 라 xmlsocket 방식 을 사용 해 야 합 니 다.xmlsocket 대상 을 자동 으로 새로 만 드 는 것 과 같 습 니 다.
그리고 지정 한 호스트 와 포트 를 연결 합 니 다. 예 를 들 어 1234 포트 를 사용 하고 싶 으 면 플래시 에 이 Security.loadPolicy File(")을 추가 할 수 있 습 니 다.xmlsocket://www.xxx.com:1234")
주의해 야 할 것 은 이 한 마디 가 당신 의 socket.connect()앞 에 붙 어야 한 다 는 것 입 니 다.
3.코드 전송 정책 파일.
socket 연결 포트 에서 이 요청 을 감청 합 니 다.예 를 들 어 sockt.connect("127.0.0.1",3333)를 사용 합 니 다.
그러면 서버 에'policy-file-request/'문자열 을 받 아들 이 는 코드 를 추가 하고 이 문자열 을 받 았 을 때 정책 파일 을 xml 형식 으로 클 라 이언 트 에 보 냅 니 다.
4.보안 정책 파일 을 어떻게 설정 합 니까?
1.웹 응용 정책 파일
정책 파일 로 열 거 된 접근 허용:*game.com 과 192.168.1.1 swf 파일
기본적으로 정책 파일 은 crossdomain.xml 이 라 고 명명 되 어야 하 며 서버 의 루트 디 렉 터 리 에 있어 야 합 니 다.단,SWF 파일 은 호출 을 통 해
Security.loadPolicy File()방법 은 다른 이름 이나 다른 디 렉 터 리 에 있 는 지 확인 합 니 다.도 메 인 정책 파일 은 이 파일 을 불 러 오 는 디 렉 터 리 에 만 적 용 됩 니 다.
하위 디 렉 터 리따라서 루트 디 렉 터 리 의 정책 파일 은 전체 서버 에 적용 되 지만 임의의 하위 디 렉 터 리 에서 불 러 온 정책 파일 은 이 디 렉 터 리 와 하위 디 렉 터 리 에 만 적 용 됩 니 다.
2.socket 에 대한 정책 파일
이 정책 파일 은 어떤 도 메 인 호스트 가 어떤 포트 를 통 해 연결 할 수 있 는 지 지정 합 니 다.
예제 코드
java socket 서버:
:
public class SecurityServer
{
private int count = 0;
public String xml = "";
private InputStream is;
private OutputStream os;
public void start() throws Exception
{
xml += "<cross-domain-policy>";
xml += "<allow-access-from domain=\"*\" to-ports=\"*\" />";
xml += "</cross-domain-policy>";
ServerSocket serverSocket = new ServerSocket(4299);
System.out.println(" `` ``````");
while (true)
{
try
{
Socket socket = serverSocket.accept();
count++;
this.is = socket.getInputStream();
this.os = socket.getOutputStream();
byte[] temp = new byte[300];
this.is.read(temp);
this.os.write(this.xml.getBytes("utf-8"));
this.os.flush();
this.os.close();
this.is.close();
socket.close();
} catch (Exception e)
{
System.out.println(" ");
}
}
}
public static void main(String[] args)
{
try
{
new SecurityServer().start();
} catch (Exception e)
{
System.out.println("Socket :" + e);
}
}
}
:
public class ServerJava
{
private int count =0;
public void start() throws Exception
{
ServerSocket serverSocket = new ServerSocket(4399);
System.out.println(" ````````");
while (true)
{
try
{
Socket socket = serverSocket.accept();
count++;
System.out.println(" `` : `````"+count);
ServerThread thread = new ServerThread(socket);
thread.start();
} catch (Exception e)
{
System.out.println(" ");
}
}
}
public static void main(String[] args)
{
try
{
new ServerJava().start();
} catch (Exception e)
{
System.out.println("Socket :" + e);
}
}
}
:
public class ServerThread extends Thread
{
private Socket socket;
private BufferedReader input;
private PrintWriter output;
private OutputStream os;
private InputStream is;
public ServerThread(Socket socket)
{
this.socket = socket;
}
public void run()
{
System.out.println("--------------- -----------------");
try
{
this.os = this.socket.getOutputStream();
this.is = this.socket.getInputStream();
byte[] temp = new byte[1000];
int len = 0;
StringBuffer msg = new StringBuffer();
while ((len = this.is.read(temp)) > 0)
{
msg.append(new String(temp, 0, len,"UTF-8"));
if(len<1000){
this.os.write(msg.toString().getBytes("UTF-8"));
this.os.flush();
msg = new StringBuffer();
}
}
} catch (Exception e)
{
System.out.println(" ");
try
{
input.close();
output.close();
} catch (Exception ex)
{
System.out.println(" ");
}
System.out.println(" ");
}
}
}
as3 클 라 이언 트 단일 코드:
package {
import flash.net.Socket;
import flash.events.ProgressEvent;
import flash.events.Event;
import flash.utils.ByteArray;
import flash.display.Sprite;
import flash.system.Security;
import flash.text.TextField;
import flash.events.MouseEvent;
public class ClientSocket extends Sprite {
private var count:uint=0;
private var clientSocket:Socket;
private var readBytes:ByteArray = new ByteArray();
private var writeBytes:ByteArray = new ByteArray();
public function ClientSocket() {
conn.addEventListener(MouseEvent.CLICK,connServer);
send.addEventListener(MouseEvent.CLICK,sendToServer);
}
private function connServer(evt:MouseEvent):void {
clientSocket = new Socket();
Security.allowDomain("*");
Security.loadPolicyFile("xmlsocket://127.0.0.1:4299")
clientSocket.connect("127.0.0.1",4399);
clientSocket.addEventListener(Event.CONNECT,successConn);
clientSocket.addEventListener(ProgressEvent.SOCKET_DATA,reviceData);
}
private function successConn(evt:Event):void {
count++;
dyText.text=" "+count+"
";
}
private function sendToServer(evt:Event):void {
var charContext=inputText.text;
dyText.text=dyText.text+charContext+"
";
//utf-8
clientSocket.writeUTFBytes(charContext);
clientSocket.flush();
}
private function reviceData(evt:Event):void {
trace(totalLen+"======revice message===============");
var totalLen:uint=clientSocket.bytesAvailable;
server.text=clientSocket.readUTFBytes(totalLen);
}
}
}
swf 파일 을 웹 페이지 에 게시 하여 테스트 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.