在我的上一篇Status 2的文章中给大家简单介绍了Stratus 2 一对多视频直播,今天给大家演示一下如何在NetGroup中共享文件。在原来的Strtuas 1 中,我们也可以发送文件,不过发送的方式很单一,只能通过NetStream.send的方式将文件发送给选定的对象。这样的文件发送问题很多。
- 发送过程中无法知道文件发送的情况。
- 很麻烦才可以将文件拆分发送。
- 发送的过程中很容易造成数据包丢失。
- 一次只能发送给一个用户,如果要发送到第二个用户,需要额外的连接。
以上这些问题因为Stratus 1 只支持点对点的传输,所以这些问题很难解决。而现在的Stratus 2,因为支持了Application level Multicast (应用层多播,关于应用层多播是什么因为不会影响我们的教程,这里就不多解释了,有兴趣的朋友可以问下google),所以我们的文件发送变得更加的强大,或者说更加的P2P,具体来说有这些优点。
- 支持文件拆分发送。你可以将你的文件拆分至N份。
- 多用户间共享文件块 。A用户发送文件,B用户接收,C用户再接收时C用户从A与B中接收
- 相对稳定的传输 (因为Stratus 2 现在也是Beta阶段,我也没有试过真实环境下大量用户共享文件的情况所以稳定情况有待考证)
- 文件传输反馈。更方便的监控传送的过程
了解了以上这些,我们来看下面这个例子,代码我是在前一个例子的基础上添加,所以对已有的代码就不重复解释,只解释文件发送相关的代码。
(more…)
今天收到了Adobe寄来的礼物,非常开心,Fiona在上周活动结束后说给我寄一些小礼物,没想到这么快就收到了,从大一开始就开始接触Flash,一路走到今天,Adobe也成为我最喜爱的公司。所以这次合肥的活动中认识几位Adobe的朋友真是非常开心,更开心的是能和大家一起分享自己各自的经验。未来的路还很长。希望Siloon, 自己和伙伴们可以越来越好,也希望Adobe未来可以提供给我们更多更强大的RIA框架:)
PS: 没想到的是礼物中有一张 “感谢信”,呵呵。很有纪念意义。

(more…)
去合肥参加研讨会回来已经一周了,非常高兴能有机会参加这次会议,会场的气氛非常好,相信无论是我自己,还是每一位到场的朋友都在这次的活动中收获颇丰。也希望以后可以多参加这样的活动。
这里是活动的现场报道,你可以找到其他嘉宾的演讲PPT以及活动照片
艾瑞网报道华东Adobe Flash平台技术研讨会报道
这里是我的演讲PPT, 需要的朋友可以下载,过几天我会给我演讲视频
WEB&RIA (44)
终于有时间试下Strtaus 2的p2p多播功能了。之前看的视频介绍中,Adobe描述一个非常理想的多人P2P数据共享方式。但是今天试了一下后发现视频的速度非常慢(视频的发布和接收端都在一台机器上),感觉上视频被发送到了什么地方后才传了回来。这这……好吧,就当是BETA的问题了,WAIT AND SEE. (2/25日更新,2/23日发布的Flash player 10.1 beta 3 看来解决了这个问题,Demo的速度现在非常正常)
准备工作:
先了解一下什么是stratus以及什么是RTMFP,你可以到http://labs.adobe.com/technologies/stratus/看下官方的解释或者直接看我原来的 Flex 迷你教程 — 基于Stratus的P2P网络电话 (1)(2)(3) 先学习一下Flash p2p的基础. 简单的说原来的Stratus 实现了flash player之间点对点的传输数据,而今天要讲的stratus 2 不仅支持单个的点对点数据传说,还引入了多播的概念。
在原来的stratus中如果我们要做一个多人同时在线的应用,比如多人视频。那么我们需要把在线的所有人都链接起来,类似蜘蛛网的结构,网中的每个人需要与其他所有人链接,这样数据才能在所有人中共享。这种模式在多人连线中是不可取的。假设我们用户A发布一个视频想让其他10个用户观看,那么10个用户都需要链接到他。就中国的普通用户的网络带宽来说,这就是极限了。而Stratus 2 中 “组” 的概念解决了这个问题。用户A发布视频让同一个组中的其他10个人观看。他们并都从A处获取视频。而有可能通过组中的其他用户获取A的视频。这也就是P2P的模式了,每个人都可以作为数据的发出者,数据以最优的方式被观看者收到,参与的人越多,数据的副本就越多。视频的速度也就越快。 (more…)
AIR 2.0 一个非常重要的更新是支持了对Socket的监听,包括TCP (ServerSocket)以及UDP(DatagramSocket)。另外也支持了以UDP方式对外发送信息。这两个功能的增加无疑大大的增加了AIR的应用范围,比如………..这一下想个具体的还是比较困难,比如协作型的应用程序。
这篇教程将使用ServerSocket功能做一个HTML服务器,这个不是我原创的,是看到一个老外写的,觉得很有意思,是一个ServerSocket的好例子,原文在 http://coenraets.org/blog/2009/12/air-2-0-web-server-using-the-new-server-socket-api/. 原文是Flash Builder 4 版本的,这里我给大家的是Flex 3版本, 使用源代码请先下载AIR 2.0 SDK
Demo过程
- 下载安装 AIR 2.0 beta runtime.
- 下载MiniAIRWebServer.air
- 安装运行 MiniAIRWebServer.air.
- 运行 http://localhost:8765/HelloWorld.html (端口以你在运行MiniAIRWebServer.air后输入的为准, 注意安装MiniAIRWebServer.air后安装文件夹下的webroot/HelloWorld.html, 我们运行的就是这个文件)
运行效果如下:

源代码
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" close="closeHandler()" creationComplete="init()">
<mx:Script>
<![CDATA[
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.ServerSocketConnectEvent;
import flash.net.ServerSocket;
import flash.net.Socket;
import flash.utils.ByteArray;
import mx.controls.Alert;
//ServerSocket,用于监听TCP下的链接
private var serverSocket:ServerSocket;
private var mimeTypes:Object = new Object();
private function init():void
{
// 支持的类型
mimeTypes[".css"] = "text/css";
mimeTypes[".gif"] = "image/gif";
mimeTypes[".htm"] = "text/html";
mimeTypes[".html"] = "text/html";
mimeTypes[".ico"] = "image/x-icon";
mimeTypes[".jpg"] = "image/jpeg";
mimeTypes[".js"] = "application/x-javascript";
mimeTypes[".png"] = "image/png";
// 初始化服务器文件夹
var webroot:File = File.applicationStorageDirectory.resolvePath("webroot");
if (!webroot.exists)
{
File.applicationDirectory.resolvePath("webroot").copyTo(webroot);
}
}
private function listen():void
{
try
{
serverSocket = new ServerSocket();
//监听链接
serverSocket.addEventListener(Event.CONNECT, socketConnectHandler);
//绑定端口
serverSocket.bind(Number(port.text));
//开始
serverSocket.listen();
log.text += "正在监听 " + port.text + "端口...\n";
}
catch (error:Error)
{
Alert.show("端口 " + port.text +
" 也许正在被使用,请尝试另一个端口.\n(" +
error.message +")", "错误");
}
}
private function socketConnectHandler(event:ServerSocketConnectEvent):void
{
var socket:Socket = event.socket;
//监听数据
socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
}
private function socketDataHandler(event:ProgressEvent):void
{
try
{
var socket:Socket = event.target as Socket;
var bytes:ByteArray = new ByteArray();
socket.readBytes(bytes);
var request:String = "" + bytes;
log.text += request;
var filePath:String = request.substring(4, request.indexOf("HTTP/") - 1);
var file:File = File.applicationStorageDirectory.resolvePath("webroot" + filePath);
if (file.exists && !file.isDirectory)
{
var stream:FileStream = new FileStream();
stream.open( file, FileMode.READ );
var content:ByteArray = new ByteArray();
stream.readBytes(content);
stream.close();
socket.writeUTFBytes("HTTP/1.1 200 OK\n");
socket.writeUTFBytes("Content-Type: " + getMimeType(filePath) + "\n\n");
socket.writeBytes(content);
}
else
{
socket.writeUTFBytes("HTTP/1.1 404 Not Found\n");
socket.writeUTFBytes("Content-Type: text/html\n\n");
socket.writeUTFBytes("<html><body><h2>Page Not Found</h2></body></html>");
}
socket.flush();
socket.close();
}
catch (error:Error)
{
Alert.show(error.message, "错误");
}
}
private function getMimeType(path:String):String
{
var mimeType:String;
var index:int = path.lastIndexOf(".");
if (index > -1)
{
mimeType = mimeTypes[path.substring(index)];
}
return mimeType == null ? "text/html" : mimeType;
}
private function closeHandler():void{
if(serverSocket){
serverSocket.close()
}
}
]]>
</mx:Script>
<mx:HBox verticalAlign="middle">
<mx:Label text="Port:"/>
<mx:TextInput id="port" text="8765" width="50"/>
<mx:Button label="Listen" click="listen()"/>
</mx:HBox>
<mx:TextArea id="log" width="100%" height="100%" />
</mx:WindowedApplication> |
下载:
MIniAIRWebServer.air (305)
MIniAIRWebServer.zip (309)
哈喽喂今天升级了新的UI,以及一些新的功能。
点击 www.halowei.com 进入


朋友刚做好的QQ台球辅助外挂, 他的台球积分总是徘徊在-xxx分,有天终于爆发决定改变这种局面,身为专业人员当然要用专业的方法,于是这款Snooker Assistan外挂就此诞生。基于桌球碰撞理论用AIR开发了这款外挂,用上这个东西,新手的水平立马可以变成有1000场经验的中高手的水平。两天时间,朋友已以从以前的-300分刷0分了(不容易阿,终于不是负资产了)
(more…)