簡體   English   中英

AS3 無法從 Java 發送的套接字中解碼 AMF3 object

[英]AS3 unable to decode AMF3 object from socket sent by Java

我有一個 java 套接字服務器,它在連接時將 Animal object 發送到 Flash 客戶端。 object 是這樣發送的:

Amf3Output amf3Output = new Amf3Output(SerializationContext.getSerializationContext());
amf3Output.setOutputStream(userSocket.getOutputStream());
amf3Output.writeObject(animal);

flash 端的代碼是:

var object:Object = socket.readObject();
trace(object);
trace(object as Animal);

然而,當第二個跟蹤給我一個null

我檢查了 java 發送了 31 個字節,而 Flash 接收了 31 個字節。

我認為可能是我的 Java 和 AS3 類不符合某些 AMF 要求。

Java class:

package main;

public class Animal {

   public String name;
   public int age;
}

AS3 class:

package  
{

    [Bindable]
    [RemoteClass(alias="main.Animal")]
    public class Animal 
    {
        public var name:String;
        public var age:int;

    }

}

我不熟悉 Java 和可用的 AMF 序列化器/反序列化器,但是如果你發送正確的數據,flash 確實支持通過 sockets 發送類型對象。 下面是 ruby 中的套接字服務器與 Flash 應用程序通信的示例。 我正在使用 RocketAMF 在連接后通過套接字將 AMF3 object 發送到客戶端。

SocketTest.as:

package {
    import flash.display.Sprite;
    import flash.net.registerClassAlias;
    import org.rackAMF.*;
    import flash.net.Socket;
    import flash.events.*;

    public class SocketTest extends Sprite {
        private var socket:Socket;

        public function SocketTest() {
            registerClassAlias('Animal', Animal);

            socket = new Socket();
            socket.addEventListener(ProgressEvent.SOCKET_DATA, onResponse);
            socket.connect("localhost", 8081);
        }

        private function onResponse(e:ProgressEvent):void {
            var animal:Animal = socket.readObject() as Animal;
            trace(Object(animal).constructor); // [trace] [class Animal]
            trace(animal.name); // [trace] Zebra
            trace(animal.age); // [trace] 5
        }
    }
}

class Animal {
    public var name:String;
    public var age:int;
}

socket_server.rb:

require 'rubygems'
require 'socket'
require 'rocketamf'

class Animal
  attr_accessor :name, :age
end

# Map "Animal" in ruby to "Animal" in flash
RocketAMF::ClassMapper.define do |m|
  m.map :as => 'Animal', :ruby => 'Animal'
end

server = TCPServer.open(8081)
loop {
  client = server.accept

  animal = Animal.new
  animal.name = "Zebra"
  animal.age = 5
  client.write RocketAMF.serialize(animal, 3)

  client.close
}

您是否檢查過 ActionScript 端的objectEncoding設置為 3? 如果您正在發送 AMF3 數據並且它正在嘗試讀取 AMF0 數據,它將無法正常工作。

由於您已經學習了 BlazeDS 的部分內容,因此很難確定 AMF3 要求與 BlazeDS 要求是什么。 我要說的是 BlazeDS 需要遵循 Java Beans 規范的 Java 類,這意味着匹配 getter 和 setter。

我還假設 Flex 端需要更多來反序列化 AMF3 有效負載:在線格式不是 Actionscript 3.0 object。 我已經完成了一些 BlazeDS 自定義序列化,這就是為什么我認為您在 Flex 方面遺漏了一些東西。

您是否有理由不使用 BlazeDS(或 GraniteDS)進行通信?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM