繁体   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