有时候我们希望从FMS服务器上获取指定的文件,再传送到服务端进行操作。
由于是文件操作,客户端我们很正常就会想到byteArray类,服务端使用File类。
另外~由于服务端必不支持ByteArray,我们需要把File读取到的byte存为Array或拼成一串字符再传给客户端。
客户端把Array或字符转成byteArray再进行操作。
这个问题困我好几天。感谢GOOGLE!感谢BAIDU!最感谢http://blog.l4cd.net!!!!
以下内容转自 http://blog.l4cd.net
先看看服务端代码
main.asc
代码
application.onConnect = function(client)
{
client.getFile = function(filename)
{
var file = new File("/" + filename);//打开文件
if(!file.name)return "";
if(file.open("binary","read"))//以二进制读取文件
{
var b = "";
while(!file.eof())b += file.readByte()+",";//把byte拼成字符
file.close();//关闭文件
return b;
}
return "";
}
application.acceptConnection(client);
}
{
client.getFile = function(filename)
{
var file = new File("/" + filename);//打开文件
if(!file.name)return "";
if(file.open("binary","read"))//以二进制读取文件
{
var b = "";
while(!file.eof())b += file.readByte()+",";//把byte拼成字符
file.close();//关闭文件
return b;
}
return "";
}
application.acceptConnection(client);
}
客户端代码
代码
package
{
import flash.display.Sprite;
import flash.display.Loader;
import flash.net.NetConnection;
import flash.events.NetStatusEvent;
import flash.net.Responder;
import flash.utils.ByteArray;
public class FMSGetFileExample extends Sprite
{
private var nc:NetConnection;
public function FMSGetFileExample()
{
//连接
nc = new NetConnection();
nc.connect("rtmp://localhost/file");
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
}
private function netStatusHandler(e:NetStatusEvent):void
{
switch (e.info.code)
{
case "NetConnection.Connect.Success" :
//Call服务端getFile方法,获取文件名为"image.jpg"的文件
nc.call("getFile", new Responder(showFile), "image.jpg");
break;
case "NetConnection.Connect.Rejected" :
case "NetConnection.Connect.Failed" :
trace("connect error");
break;
}
}
private function showFile(file:String):void
{
if(!file)
{
trace("get file error");
return
}
var byte:ByteArray = new ByteArray();
var rs:Array = file.split(",");
//字符转为byteArray;
while(rs.length)
{
byte.writeByte(rs.shift());//删除数组中第一个元素,并返回该元素。
}
byte.position = 0;//将文件指针的当前位置(以字节为单位)移动或返回到 ByteArray 对象中。 下一次调用读取方法时将在此位置开始读取,或者下一次调用写入方法时将在此位置开始写入。
//显示
var loader:Loader = new Loader();
addChild(loader);
loader.loadBytes(byte);
}
}
}
{
import flash.display.Sprite;
import flash.display.Loader;
import flash.net.NetConnection;
import flash.events.NetStatusEvent;
import flash.net.Responder;
import flash.utils.ByteArray;
public class FMSGetFileExample extends Sprite
{
private var nc:NetConnection;
public function FMSGetFileExample()
{
//连接
nc = new NetConnection();
nc.connect("rtmp://localhost/file");
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
}
private function netStatusHandler(e:NetStatusEvent):void
{
switch (e.info.code)
{
case "NetConnection.Connect.Success" :
//Call服务端getFile方法,获取文件名为"image.jpg"的文件
nc.call("getFile", new Responder(showFile), "image.jpg");
break;
case "NetConnection.Connect.Rejected" :
case "NetConnection.Connect.Failed" :
trace("connect error");
break;
}
}
private function showFile(file:String):void
{
if(!file)
{
trace("get file error");
return
}
var byte:ByteArray = new ByteArray();
var rs:Array = file.split(",");
//字符转为byteArray;
while(rs.length)
{
byte.writeByte(rs.shift());//删除数组中第一个元素,并返回该元素。
}
byte.position = 0;//将文件指针的当前位置(以字节为单位)移动或返回到 ByteArray 对象中。 下一次调用读取方法时将在此位置开始读取,或者下一次调用写入方法时将在此位置开始写入。
//显示
var loader:Loader = new Loader();
addChild(loader);
loader.loadBytes(byte);
}
}
}