java - 将文件从闪存传输到 java 时出现未知的 AMF 类型和其他错误

标签 java actionscript-3 blazeds amf

我正在使用 Flash 工具将数据传输到 Java。我在一次发送多个对象时遇到问题。发送的对象只是通用的 Object 对象,因此不需要注册类别名或任何其他内容。

发送一个对象效果很好。一旦我开始发送多个对象(将相同的对象放入数组中并发送),它就开始变得奇怪。数组中最多三个对象似乎工作正常。不仅如此,我在 readObject() 函数中遇到了不同的错误,例如:

  • 未知 AMF 类型“47”
  • 未知 AMF 类型“40”
  • 未知 AMF 类型“20”
  • OutOfBoundsExceptions 索引 23,大小 0
  • 空指针异常
  • 等等

发送 3 个对象会起作用,发送 4 个对象会出现错误。如果我删除前三个有效的之一(同时保留添加的第四个),它会再次工作。有人知道这是怎么回事吗?

更多信息:

  • 通信通过 Flash 端的 Socket 类进行。这是纯 AS3,没有 Flex。
  • 消息在发送之前会被压缩并在服务器上解压缩,因此我很确定这不是缓冲区大小问题(除非我遗漏了某些内容)
  • jar 上的 BlazeDS 版本似乎是 4.0.0.14931
  • Flash 版本为 10.1(它是一个 AIR 应用程序)

使用粗略代码更新

发送对象的示例:

var o:Object    = { };
o._key          = this._key.toString();
o.someParam     = someString;
o.someParam2    = someInt;
o.someParam3    = [someString1, someString2, someString3];
...

它被添加到我们的事件对象中(我们用它来确定要调用的事件、要传递的数据等)。事件对象已注册为类别名

该对象通过 Socket 发送到服务器,如下所示:

myByteArray.writeObject( eventObj );
myByteArray.compress();
mySocket.writeBytes( myByteArray );
mySocket.flush();

在服务器端,我们接收字节并解压缩它们。我们创建一个 Amf3Input 对象并设置输入流,然后读取它:

Amf3Input amf3Input = new Amf3Input( mySerializationContext );
amf3Input.setInputStream( new ByteArrayInputStream( buffer ) ); // buffer is a byte[]
MyEventObj eventObj = (MyEventObj)amf3Input.readObject(); // MyEventObj is the server version of the client event object

如果它因“未知的 AMF 类型错误”而崩溃,它会立即崩溃,即当我们尝试读取对象时,而不是当它尝试读取子对象时。

在单步执行读取代码时,似乎当我传递一个对象数组时,如果长度<= 4,它会正确读取长度。如果长度大于该长度,则读取长度为 4。

最佳答案

如果您遇到 AMF 反序列化错误,则可能有多种问题会导致该问题。以下是进行进一步诊断的几种技术:

  1. 使用网络流量嗅探器确保您发送的内容与您接收的内容匹配。在 Mac 上我将使用 CocoaPacketAnalyzer ,或者您可以尝试Charles ,它实际上可以解码它注意到的 AMF 数据包。

  2. 将数据输入到不同的 AMF 库,例如 PyAMFRocketAMF看看这是否是 BlazeDS 的问题或您如何调用它的问题。您也可能会收到不同的错误消息,这将使您更好地了解失败的位置。

  3. 检查AMF数据包的格式。 AMF 服务器调用有一些额外的包装,如果反序列化器不希望遇到这种包装,则会抛出该包装,对于纯序列化对象反之亦然。服务器调用数据包始终以 0x00 开头,后跟 AMF 版本(0x000x03,或在极少数情况下 0x02)。

关于java - 将文件从闪存传输到 java 时出现未知的 AMF 类型和其他错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7997156/

相关文章:

java - 将文件复制到数组中 (Java)

java - 无法从 BlazeDS 绑定(bind) RemoteObject

java - JBoss 上 Flex/BlazeDS 的 Client.Error.MessageSend 问题

ios - AIR iOS TextField 在聚焦后不发送鼠标或触摸事件 (AS3)

actionscript-3 - AS3 PNG编码器?

apache-flex - 如何在 Flex 4 的可编辑数据网格中禁用自动排序

spring - 使用 Spring 注入(inject) Log4J 记录器

java - 从 Java 调用 RPG 程序时 SaveObject 作业失败

java - 使用ArrayList处理一对多关系

java - 创建一个小型彩票应用程序,java