有时候我们希望从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 );
}
}
}