2013-02-26 5 views
0
나는 이미 그것을 잃어버린하고

....자바 소켓 I가에 FlashDevelop (AS3)를 통해 간단한 Flash 응용 프로그램을 구축했고 나는 그것이 서버와 통신 할</p> <p>서버

Main.java :

import org.xsocket.connection.*; 

public class Main 
{ 
    protected static IServer srv = null; 

    public static void main(String[] args) 
    { 
     try 
     { 
      srv = new Server(8090, new xSocketDataHandler()); 
      srv.run(); 
     } 
     catch(Exception ex) 
     { 
      System.out.println(ex.getMessage()); 
     } 
    } 

    protected static void shutdownServer() 
    { 
     try 
     { 
      srv.close(); 
     } 
     catch(Exception ex) 
     { 
      System.out.println(ex.getMessage()); 
     }   
    } 
} 

및 xSocketDataHandler.java :

import java.io.IOException; 
import java.nio.BufferUnderflowException; 
import java.nio.channels.ClosedChannelException; 
import java.util.*; 
import org.xsocket.*; 
import org.xsocket.connection.*; 


public class xSocketDataHandler implements IDataHandler, IConnectHandler, IDisconnectHandler 
{ 
    private Set<INonBlockingConnection> sessions = Collections.synchronizedSet(new HashSet<INonBlockingConnection>()); 

    public boolean onData(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, ClosedChannelException, MaxReadSizeExceededException 
    { 
     try 
     { 
      String data = nbc.readStringByDelimiter("\0"); 

      if(data.trim().length() > 0) 
      { 
       System.out.println("Incoming data: " + data); 

       if(data.equalsIgnoreCase("<policy-file-request/>")) 
       { 
        nbc.write("<cross-domain-policy>" + 
          "<allow-access-from domain=\"*\" secure=\"false\" />" + 
          "<allow-access-from domain=\"*\" to-ports=\"8090\"/>" + 
          "</cross-domain-policy>\0"); 
        return true; 
       } 

       String[] message = data.split("~"); 

       sendMessageToAll(nbc, message[0], message[1]); 

       if(message[1].equalsIgnoreCase("SHUTDOWN")) 
        Main.shutdownServer();     
      } 
     } 
     catch(Exception ex) 
     { 
      System.out.println("onData: " + ex.getMessage()); 
     } 

     return true; 
    } 

    private void sendMessageToAll(INonBlockingConnection nbc, String user, String message) 
    { 
     try 
     { 
      synchronized(sessions) 
      { 
       Iterator<INonBlockingConnection> iter = sessions.iterator(); 

       while(iter.hasNext()) 
       { 
        INonBlockingConnection nbConn = (INonBlockingConnection) iter.next(); 

        if(nbConn.isOpen()) 
         nbConn.write("<b>" + user + "</b>: " + message + "<br />\0"); 
       } 
      } 

      System.out.println("Outgoing data: " + user + ": " + message); 
     } 
     catch(Exception ex) 
     { 
      System.out.println("sendMessageToAll: " + ex.getMessage()); 
     }    
    } 

    public boolean onConnect(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, MaxReadSizeExceededException 
    { 
     try 
     { 
      synchronized(sessions) 
      { 
       sessions.add(nbc);    
      } 

      System.out.println("onConnect"); 
     } 
     catch(Exception ex) 
     { 
      System.out.println("onConnect: " + ex.getMessage()); 
     } 

     return true; 
    } 

    public boolean onDisconnect(INonBlockingConnection nbc) throws IOException 
    { 
     try 
     { 
      synchronized(sessions) 
      { 
       sessions.remove(nbc);    
      } 

      System.out.println("onDisconnect"); 
     } 
     catch(Exception ex) 
     { 
      System.out.println("onDisconnect: " + ex.getMessage()); 
     }   

     return true; 
    } 
} 

그래서, 문제가 :

나는 내가 다음 코드 간단한 소켓 자바 응용 프로그램을 만들어 Java 응용 프로그램을 시작하면 완벽하게 실행됩니다. 내 Flash 응용 프로그램을 시작하고 실행, 소켓 객체를 생성하는 서버에 연결 시도를 얻을 수 있지만 (내 컴퓨터에있는 모든) 내 서버에 연결 :

nbc.readStringByDelimiter("\0"); 

는 NBC가 닫혀 있다고하고, 서버 예외를 잡으십시오 : "onData: channel is closed (read buffer size=0)"

나는 항상 이것을 얻는가 누군가는 알고 있는가? 어떻게 쓰는지는 상관 없지만 Socket, XMLSocket, xSocketDataHandler 또는 anyhting을 사용하면 닫힌 채널 오류가 계속 발생합니다.

내가 뭘 잘못하고 있니?

감사합니다.

EDIT1 :

AS3 코드 : 이것은 내 Socket 클래스입니다

:

import flash.events.Event; 
import flash.events.IOErrorEvent; 
import flash.events.ProgressEvent; 
import flash.events.SecurityErrorEvent; 
import flash.net.Socket; 
/** 
* ... 
* @author 9MS 
*/ 
public class GameSocket extends Socket 
{ 
private var host:String; 
private var port:int; 

public function GameSocket(host:String="187.127.89.158", port:int=8090) 
{ 
super(host, port); 

socketConnect(); 
} 

public function socketConnect():Boolean { 


addEventListener(Event.CONNECT, onConnect); 
addEventListener(ProgressEvent.SOCKET_DATA, onResponse); 
addEventListener(Event.CLOSE, onClose); 
addEventListener(IOErrorEvent.IO_ERROR, onError); 
addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecError); 

try { 
connect(this.host, this.port); 
} 
catch (e:Error) { 
trace("Error on connect: " + e); 
return false; 
} 
return true; 
} 

public function sendData(msg:String):void { 
msg += "\0"; 

try { 
writeUTFBytes(msg); 
flush(); 
trace("Message sent: " + msg); 
} 
catch(e:Error) { 
trace("Error sending data: " + e); 
} 

} 

private function onConnect(e:Event):void { 
trace("Connected: "+e); 
} 

private function onResponse(e:ProgressEvent):void { 
trace("Receiving Data: " + e); 

var resp:String = readUTFBytes(bytesAvailable); 

} 

private function onClose(e:Event):void { 
trace("Connection Closed: " + e); 
close(); 
} 

private function onError(e:IOErrorEvent):void { 
trace("IO Error: " + e.text); 
close(); 
} 

private function onSecError(e:SecurityErrorEvent):void { 
trace("Security Error: " + e.text); 
close(); 
} 

} 
+0

이 게시물을 보았습니까? http://www.giantflyingsaucer.com/blog/?p=205 – shazin

+0

예, 처음 사용한 튜토리얼 이었지만, 게시물에 내 문제가있는 사람들을 더 많이 볼 수 있습니다. 댓글 ... –

+0

게시 할 수 및 AS3 코드. 플래시가 연결을 닫은 것일까 요? (즉, 소켓 또는 범위를 벗어난 로컬 변수 사용) –

답변

0

그래서, 내가 문제를 해결했습니다. Flash Communication Throught 소켓에서 매우 중요한 점은 Flash가 소켓 브리지를 열고 정책 파일을 요청한 후 닫는 것입니다. 따라서 서버에서 연결을 수신하고 정책 파일 요청을 확인하고 정책 파일을 보내고 브리지를 닫아야합니다. 정책 파일을받은 후 Flash는 다시 연결을 열고 정책 파일을 다시 묻지 않고 정상적으로 통신합니다.

새 연결을 얻은 후에는 논리를 정상적으로 시작해야하지만 정책 파일 요청을 받으면 정책 파일로 응답하고 연결을 닫으십시오.