[英]Is it necessary to use AMF library when using flash.net.Socket class to read custom object from java?
[英]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.