2011-09-27 7 views
0

소켓을 사용하는 플렉스 앱을 만들었습니다. Glassfish 서버에서 실행되는 웹 응용 프로그램에 flex 응용 프로그램을 게시했습니다. 이제 플렉스 앱에서 C# 서버에 대한 소켓 연결을 만들고 데이터 송수신을 시작합니다. 문제는 C# 서버에 대한 소켓 연결을 만든 후 flex 응용 프로그램이 먼저 정책 파일을 확인한 다음 얻은 후에 연결을 유지하지 않고 소켓을 닫는 것입니다.정책 파일 검사가 소켓을 닫습니다.

이것은 내 C# 서버입니다 : 그렇게,이 소켓을 닫고 지금은 연결을 생성하고 서버에서 정책을 가져옵니다 후

private var socket:Socket = new Socket(); 
socket.addEventListener(Event.CONNECT, onConnect); 
socket.addEventListener(Event.CLOSE, onClose); 
socket.addEventListener(ProgressEvent.SOCKET_DATA, onData); 
socket.addEventListener(ErrorEvent.ERROR, errorHandler); 
socket.addEventListener(IOErrorEvent.IO_ERROR, errorHandler); 
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler); 
... 
socket.connect("172.17.41.211", 12345);  
... 

: 같은

TcpListener tcpListener = new TcpListener(IPAddress.Parse("172.17.41.211"), 12345); 
TcpClient tcpclient = tcpListener.AcceptTcpClient(); 

Socket client = tcpclient.Client; 
while (client.Available > 0) 
{ 
    int bytes = 0; 
    byte[] m_aBuffer = new byte[1024]; 
    bytes = client.Receive(m_aBuffer, m_aBuffer.Length, SocketFlags.None); 
    String str = Encoding.ASCII.GetString(m_aBuffer, 0, bytes); 
    if (str.StartsWith("<policy-file-request/>")) 
    { 
     sendBytes = Encoding.ASCII.GetBytes("<cross-domain-policy><allow-access-from domain=\"172.17.41.211\" to-ports=\"12345\"/></cross-domain-policy>\0"); 
     client.Send(sendBytes); 
    } 
} 

while (client.Connected) 
{ 
    Thread.Sleep(200); 
    sendBytes = Encoding.ASCII.GetBytes("message to client"); 
    client.Send(sendBytes, sendBytes.Length, SocketFlags.None); 
} 

이제 플렉스 클라이언트가 보인다 나는이 작업을 수행 한 후, 난 normall 사용할 수 있습니다 다시

socket.connect("172.17.41.211", 12345)); 

전화를해야이 연결을 사용할 수 있도록 y 연결.

누군가 이런 일이 일어난 이유를 제안 할 수 있으며 연결을 닫지 않았을 가능성이 있습니까?

+0

우선 * 왜 * 소켓 서버를 사용하고 있습니까? 아주 특별한 이유가 있거나 서버에 연결하기를 원하십니까? 자체적 인 소켓을 만드는 것보다 클라이언트에 서버를 연결할 수있는 더 쉽고 좋은 방법이 있기 때문에 이미 많은 것을 알고 잘 알고 입증 된 표준이 있기 때문입니다. –

+0

예, 특정 방식으로 서버와 통신해야합니다. – simion

+0

더 자세한 설명이 가능합니까? 더 나은 대안이 될 수 있습니다. –

답변

0

정책 파일을 소켓 자체를 통해 보내지 마십시오. 그것은 다른 채널에 있어야합니다. 예를 들어, 일부 ip/port에 연결하면 기본적으로 플래시는 동일한 IP에 포트 843을 연결하려고 시도하고 마스터 정책 파일을 찾습니다.

Security.loadPolicyFile(someURL)을 사용하여 수동으로 설정할 수도 있습니다. More information can be found here.

+0

하지만 이것은 포트 843에서 수신 대기하는 별도의 스레드를 만들어야한다는 것을 의미합니까? 그러나 다른 해결책이 없습니까? – simion

+0

정책 파일에 대해 http 서버를 지정할 수는 있지만 내 말을 믿지 마십시오. 문서를보십시오. –

+0

그게 주된 문제입니다. 문서에서 결론을 내리는 것은 정책 데이터 요청을 처리하기 위해 별도의 스레드를 만들어야한다는 것입니다. 그러나 나는이 별개의 스레드를 만들지 않을 수 없다. – simion

관련 문제