未知AMF类型&;将文件从flash传输到java时的其他错误

未知AMF类型&;将文件从flash传输到java时的其他错误,java,actionscript-3,blazeds,amf,Java,Actionscript 3,Blazeds,Amf,我正在使用Flash工具将数据传输到Java。当一次发送多个对象时,我遇到了问题。正在发送的对象只是通用对象对象,因此不需要注册类别名或任何东西 发送一个对象就可以了。一旦我开始发送多个对象(将相同的对象放入一个数组并发送),它就开始变得奇怪。阵列中最多有三个对象似乎可以正常工作。除此之外,我在readObject()函数中还遇到了不同的错误,例如: 未知AMF类型“47” 未知AMF类型“40” 未知AMF类型“20” 边界外概念索引23,大小为0 NullPointerException

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

发送一个对象就可以了。一旦我开始发送多个对象(将相同的对象放入一个数组并发送),它就开始变得奇怪。阵列中最多有三个对象似乎可以正常工作。除此之外,我在
readObject()
函数中还遇到了不同的错误,例如:

  • 未知AMF类型“47”
  • 未知AMF类型“40”
  • 未知AMF类型“20”
  • 边界外概念索引23,大小为0
  • NullPointerException
  • 等等
发送3个对象将起作用,发送4个对象将显示错误。如果我删除前3个有效的选项中的一个(同时保留添加的第四个),它将再次有效。有人知道发生了什么吗

更多信息:

  • 通信通过闪存端的套接字类进行。这是纯AS3,没有弹性
  • 消息在服务器上发送和解压缩之前会被压缩,所以我很确定这不是缓冲区大小的问题(除非我遗漏了什么)
  • 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];
...
它被添加到我们的事件对象(我们使用它来确定要调用的事件、要传递的数据等)。事件对象已注册为类别名

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

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类型错误”而崩溃,它会立即崩溃,即当我们尝试读取对象时,而不是当它尝试读取子对象时


在逐步读取代码的过程中,似乎当我传递一个对象数组时,如果长度如果出现AMF反序列化错误,那么可能有几个问题导致了这个问题。以下是进行进一步诊断的几种技术:

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

  • 将数据馈送到不同的AMF库,如或,以查看它是否与BlazeDS或您如何调用它有关。也有可能您会收到不同的错误消息,这将使您更好地了解它失败的地方

  • 检查AMF数据包的格式。AMF服务器调用周围有一些额外的包装,如果反序列化程序不希望遇到这种包装,则会抛出反序列化程序,对于纯序列化对象,则反之亦然。服务器调用数据包总是以
    0x00
    开头,然后是AMF版本(
    0x00
    0x03
    ,或在少数情况下
    0x02


  • 好的,我解决了问题。基本上,消息在服务器上发送和解压缩之前会被压缩。我没有看到的是,消息解压缩到的
    byte[]
    缓冲区总是1024长度,这对于小型对象数组来说是合适的。但是,一旦通过,它将覆盖缓冲区(我不太确定在Java中,当您尝试写入比可用字节更多的字节时会发生什么情况,无论是循环还是移动数据)

    当它读取amf对象时,它做的第一件事就是读取一个int,并使用它来确定它试图解码的对象的类型。因为这个int是胡言乱语(47110,-10),所以它失败了

    是时候开始预编邮件长度了,我想:)


    感谢您的帮助。

    如果不看代码,就很难有一个想法。我添加了一些粗略的代码-如果不发布一个巨大的源代码转储(我无论如何都做不到),就很难取出相关的代码。没什么特别的事。另外,当发送单个对象或对象的小数组时,它也可以工作。超过3,它就会疯狂地寻找提示。回答你的一些问题:1)下载charles。我看看它能不能给我一些提示。2) 我真的无法在重写大量内容的情况下插入另一个amf库。另外,我只是在调试这个-这不是我的代码:D3)这是从客户端到服务器。到目前为止,我还没有遇到服务器到客户端的问题。此外,它还可以将多个项目发送到某一点。然后每次都会犯不同的错误,这让人抓狂,因为我不太熟悉查尔斯的工作方式。我是否需要做一些具体的事情来让它收听流量?它捕获我拥有的AIR自动更新XML文件,但不捕获应用程序和服务器之间的流量。该应用程序基于AIR,服务器在我的计算机上是本地的(用于测试)