JS如何传递ByteArray类型 给as3?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS如何传递ByteArray类型 给as3?相关的知识,希望对你有一定的参考价值。

as3中提供了外部接口函数ExternalInterface.addCallback("sendToActionScript", sendData);
public function sendData(text:ByteArray):void
//...里面我就省略了

现在要用js去调用这个方法,但是参数text是个ByteArray类型,JS中又没有这种数据类型,要怎么办呢?

这个很简单,ByteArray是什么,字面意思就是字节数组

关键两个字,数组,所以传递数组就行了,至于字节,字节可以用什么表示,整数啊

所以答案呼之欲出了,传递一个整数数组就行了

楼主要求从js给as3传值是吧,只是好奇楼主js里的值来自哪里...

只针对这个问题的话,代码如下:

首先是as3代码:

ExternalInterface.addCallback("sendToActionScript",sendData);
function sendData(data:Array):void

// 将收到的数组转化为二进制
var ba:ByteArray = new ByteArray();
for(var i:int = 0; i<data.length;i++)

ba[i] = data[i];

其次是js代码:

var flash_object = document.getElementByID("你的flash元素id");
flash_object.sendData([0x100,0x101,0x102]);

这样就可以相互传递二进制数据了~

参考技术A 转成String。 参考技术B Socket数据获取
/**
* 当客户端给服务端传递信息处理,这里将自动处理内容分割
* @param e
*/
protected function onSocketData(e:ProgressEvent):void

if(socket.bytesAvailable == 0)
return;
//将数据储存在缓存区
var byte:ByteArray = new ByteArray();
socket.readBytes(byte,0,e.bytesTotal);
pushCache(byte);
parsingCache();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
当Socket给我们传输数据的时候,我们可以侦听ProgressEvent事件进行加载读取。Socket的传输原理就跟下载文件一样,你在下载服务端那边的数据,只是数据是自定义的,但数据是按循序而来的。

将数据添加到缓存
/**
* 写入缓存区
* @param byte
*/
public function pushCache(byte:ByteArray):void

if(_cache == null)

_cache = byte;

else

_cache.position = _cache.length;
_cache.writeBytes(byte);
byte.clear();


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
下载数据,意味着并不是每次下载的数据都是完整的,可能会有错位,数据不完整的情况。所以需要将下载到的数据,装到一个ByteArray里作为缓存,方便下一次获取使用。

自定义发送内容格式
/**
* 发送信息到服务端,或者客户端
* @param data
*/
public function send(data:Object):void

//新建一个二进制内容
var byte:ByteArray = new ByteArray();
//写入Object
byte.writeObject(data);
//压缩二进制内容
byte.compress();
//传输内容长度
socket.writeShort(byte.length);
//传输内容
socket.writeBytes(byte);
//确定内容写入
socket.flush();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
这里有一个自定义方法send,里面的data就是我要发送的内容,但不管是什么内容,都将它装载到一个ByteArray数组里。重要的是,ByteArray自带有compress的压缩功能,这意味着传输的宽带需求进行了压缩。这里的传输顺序是:内容长度(Short):内容(ByteArray)。

解析接收到的内容
/**
* 解析分发数据包
*/
public function parsingCache():void

//判断缓存是否存在
if(!_cache)
return;
//初始化缓存的读取位置
var par:int = 0;
_cache.position = par;
//如果缓存的字节大于2,因为Short占位2个字符
while(_cache.bytesAvailable > 2)
//解析时,读取内容长度,这里会取出2个字符
var len:uint = _cache.readShort();
//判断缓存的可用长度是否足够读取内容
if(_cache.bytesAvailable < len)

//当缓存不足读取时,中断读取
break;

else

//当缓存足够可读取时,将当前的缓存位置增加两个字符,跳过Short内容。
_cache.position = par + 2;
//读取其内容
var data:ByteArray = new ByteArray();
_cache.readBytes(data,0,len);
//返回数据
backData(data);
//缓存位置刷新至下一个
par += 2 + len;
_cache.position = par;


//判断缓存的位置是否做了刷新,如果有刷新,意味着读取过内容
if(par != 0)

//判断缓存的可用长度
if(_cache.bytesAvailable > 0)

//存在可用的长度时,截取par后面未使用的新数据,以便下一次使用
var newbyte:ByteArray = new ByteArray();
_cache.position = par;
_cache.readBytes(newbyte,0,_cache.bytesAvailable);
_cache.clear();
_cache = newbyte;

else

//如果数据本身不存在可用数据,那么可以进行释放
_cache.clear();
_cache = null;




//数据返回,进行解析
private function backData(data:ByteArray):void

try
//还原读取点
data.position = 0;
//解压数据
data.uncompress();
//读取之前定义好的Object内容
var ob:Object = data.readObject();
if(ob)

//自定义操作
if(dataFunc != null)
dataFunc(ob);


catch(e:Error)

trace("解析出现异常");


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
这里做了ByteArray的解析处理,根据其内容长度,读取内容。Short占两个字符,因此跳过固定为2值。有一个固定的规则,二进制的内容都是自由定义的。

如何在 AS3 中正确将 URL 传递给 UrlRequest?

【中文标题】如何在 AS3 中正确将 URL 传递给 UrlRequest?【英文标题】:How to pass URL to UrlRequest properly in AS3? 【发布时间】:2014-07-02 04:32:12 【问题描述】:

我有一个文件 abc.swf 嵌入在一个名为 index.html 的 html 文件中

SWF文件需要访问abc.xml

abc.xml存储在Rooms/abc.xml

index.html 存储在Schedule/index.html

abc.swf,我有代码:

inforequest=new URLRequest("~/Rooms/abc.xml");

但是我得到了一个错误:

Error #2044: Unhandled ioError:. text=Error #2032: Stream Error

我知道这是因为 URL 错误,但我不知道如何解决。 我试过了:Rooms/abc.xml, abc.xml, ../Rooms/abc.xml 但它们都不起作用。 请帮忙!

编辑:

这是html文件:

@model Booking_Ticket_Management_System.Models.Schedule

@
ViewBag.Title = "XmlGenerate";


<h2>Choose your seats</h2>
<object  >
<param name="movie" value="~/Rooms/@Url.Content(Model.Room.Map)"/>
<embed src="~/Rooms/@Url.Content(Model.Room.Map)"  />
</object>

【问题讨论】:

我还建议实际聆听IOErrorEvent.IO_ERROR,不要让它向用户抛出错误。 最后,我做对了。谢谢您的回答。我没有处理 IOErrorEvent。这就是为什么它没有工作。 【参考方案1】:

养成始终添加至少 2 个侦听器的习惯:Complete - 通常由所有人添加,而 IOErrorEvent 通常被所有人跳过:)

var loader:Loader = new Loader();

    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderHandler, false, 0, true);
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loaderHandler, false, 0, true);

    loader.load(new URLRequest("path/to/image.jpg"));

//...
protected function libLoadHandler(e:Event):void 

    var loader:Loader = (e.target as LoaderInfo).loader;
    if(e.type == Event.COMPLETE || e.type == IOErrorEvent.IO_ERROR)
    
        //unregister both as COMPLETE and IO_ERROR are "finishing" events
        loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loaderHandler, false);
        loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, loaderdHandler, false);

        //do something after event based on event type
    

【讨论】:

【参考方案2】:

试试这个,

var myRequest:URLRequest = new URLRequest("../abc.xml");

【讨论】:

这意味着我必须使用绝对网址。有没有办法使用相对网址? 如果你想使用相对 URL,试试这样 var myRequest:URLRequest = new URLRequest("../abc.xml"); 当我使用绝对 URL 并将 swf 文件放入与 html 文件相同的文件夹中时,然后我运行 swf 文件,它可以工作,但如果我运行 html 文件,它就不起作用。我不知道为什么。 您是否在该 HTML 页面中嵌入了 SWF 文件? 否则试试这个***.com/questions/137326/…

以上是关于JS如何传递ByteArray类型 给as3?的主要内容,如果未能解决你的问题,请参考以下文章

这些 JavaScript 函数在 AS3 ByteArray 中的等效调用是啥?

如何在 AS3 中正确将 URL 传递给 UrlRequest?

如何在应用程序中共享图像as3

在Flash Player中播放ByteArray的FLV

AS3.0 给addEventListener里的方法加上参数传递

如何将变量传递给驱动程序执行脚本?