0

私は質問を入力していましたが、最終的に問題を解決し、それを投げたくありませんでした (そしてhttps://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-yourに励まされました) -own-questions/ )、私の問題解決策を共有することにしました。

問題は、Java アプリケーション サーバーから数バイトを取得したいということです。つまり、リプレイ機能のために、サーブレットを介してフラッシュ ゲームにロードします。

as3 からサーバー (php、java など) への逆方向の問題を解決しようとするいくつかの質問があります: How to send binary data from AS3 through Java to a filesystem? ByteArray (Flash から) といくつかのフォーム データを php に送信するにはどうすればよいですか? 、 URLRequestを介して bytearray をアップロードし、 ByteArray を POSTにプッシュします。私が共有しているもののようなものは見つかりませんでした (間違っていたら訂正してください)。

4

1 に答える 1

2

さて、質問で言ったように、私はStackOverflowによって答えるように促されました、そしてここにそれがあります:

バイト配列を提供するサーブレットdoGetメソッド:

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

   MouseInput oneInput = getMouseInput(); //abstracted (I'm using google appengine)
   byte[] inputInBytes = oneInput.getInBytes();
   OutputStream o = resp.getOutputStream();
   o.write(inputInBytes);
   o.flush();
   o.close();
}

MouseInput.getInBytesメソッド本体:

   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   DataOutputStream dos = new DataOutputStream(baos);

   dos.writeInt(this.type);
   dos.writeDouble(this.localX);
   dos.writeDouble(this.localY);
   dos.writeBoolean(this.buttonDown);

   return baos.toByteArray();

バイト配列データを受信するための私のActionscriptコード:

var url:String = "http://localhost:8888/input"; //servlet url
var request:URLRequest = new URLRequest(url);

//get rid of the cache issue:
var urlVariables:URLVariables = new URLVariables();
urlVariables.nocache = new Date().getTime();
request.data = urlVariables;
request.method = URLRequestMethod.GET;

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;

loader.addEventListener(Event.COMPLETE, function (evt:Event) {
    var loader:URLLoader = URLLoader(evt.target);

    var bytes:ByteArray = loader.data as ByteArray;
    trace(bytes); //yeah, you'll get nothing!

    //the bytes obtained from the request (see Servlet and 
    //MouseInput.getInBytes method body code above) were written in 
    //the sequence like is read here:           
    trace(bytes.readInt());
    trace(bytes.readDouble());
    trace(bytes.readDouble());
    trace(bytes.readBoolean());
}
loader.addEventListener(IOErrorEvent.IO_ERROR, function (evt:Event) {
    trace("error");
});

loader.load(request);

まあ、それは動作します!明らかに、読みやすくするために無名関数を使用しないなど、いくつかの調整を行うことができますが、それを説明するために問題はありませんでした。これで、試していた重いXMLの代わりにByteArrayを使用して、ゲームのリプレイ機能(デバッグ目的)にメモリを節約できます。

それがお役に立てば幸いです、そしてどんな批評家も感謝されます!

乾杯

于 2012-07-07T09:39:42.320 に答える