<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Flash / Flex 学园</title>
	<atom:link href="http://blog.smilecn.net/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.smilecn.net</link>
	<description>arrowyoung</description>
	<lastBuildDate>Tue, 19 May 2009 06:47:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[Flex]AdvancED Flex 3中文翻译(四)</title>
		<link>http://blog.smilecn.net/?p=45</link>
		<comments>http://blog.smilecn.net/?p=45#comments</comments>
		<pubDate>Tue, 19 May 2009 06:39:53 +0000</pubDate>
		<dc:creator>arrowyoung</dc:creator>
				<category><![CDATA[AdvancED Flex 3中文翻译]]></category>

		<guid isPermaLink="false">http://blog.smilecn.net/?p=45</guid>
		<description><![CDATA[为本地或远程创建一个统一的model代理
当真正的对象不存在时，代理可以代替真正的对象。当一个真正的对象做一些花销很大的操作或需要一段时间才能加载时，代理代替真正的对象，直到真正的对象可以使用。代理的API和真正的对象是想同的，因些当真正的对象还在加载或初始化时，你也可以调用它。当真正的对象可用时，这个调用会传递给它，它会对调用做出反应。
代理可分为两类，虚拟代理和远程代理，虚拟代理的定义完全符合上一段所描述的。远程代码略有不同，因为它不在本地。

如果是一个远程对象，通过代理我们能象本地一样操作。调用会建立一个代理对象并且传递给真正的远程对象。当收到远程对象的答复里，代理会传递给调用者。几乎所有的语言都允许远程代理用RPC调用分布式远程对象。在这种情况下，它调用的一般是对应的结构。
为内部和外部数据建立一个统一的获取机制，我们需要一个外部数据源的远程代理接口。与此同时，在复杂的应用程序里，一些数据可能会涉及复杂的操作。通常这些复杂的操作发生在远程调用的时候。因此我们需要建立有虚拟和远程两种代理功能的代理。
从调用者的角度看，无论是调用本地还是远程，简单还是复杂的资源都是一样的。
model有不同的类型和特点，所以从对象到对象有不同的代理接口。我们定义一个名叫ImodelProxy的接口指定为model类的代理类型。这个代理类也实现了flash.events. IEventDispatcher接口，定义了添加、删除、侦听和发送事件的方法。当一个远程操作返回成功，会触发相应的事件。定义事件处理程序去处理相应的操作。
在我们的例子中，我们希望MedalWinner和MedalTally对象以相同的方式处理，无论数据是本地的还是远程的，因此我们将使用这两种代理模式。
在少数情况下，你的model会在源代码的不同的地方。在这种情况下，在应用程序中使用一个对象之前你可能想定义一个理想的对象。在这种情况下你可能需要一个外观（façade）而不是一个代理（proxy）。你仍然可以期待你的外观（façade）能有延时加载数据和表现出一些代理的一些行为。一个外观（façade）有时还可以简化复杂的ORM，在应用程序中定义一个对象之前建立数据之间的关系。
另外一些情况下，你可能不需要编写代码，但要显示出原始model的API。当你需要定义外部数据去适合你的程序model时，通常会这样做。这个时候你可能需要是适配器（adapter）而不是一个代理（proxy）或一个外观（façade）。或者你需要适配器能支持延时加载数据或代替原始数据，就像一个代理一样。
让我们改变一下那个简单的model，作为一个看起来像新结构下的一个代理那样去理解它。我们仅仅用MedalTally去控制一个XML文件的内容。在真实情况下，你会在MedalTally中包含MedalWinner对象。在1-4所示的UML图中显示了结构，一些接口和类去实现一个代理。

(1-4)
MedalTally.as的源代码和MedalTallyProxy.as实现的类在这里包括一个代理的特征。首先看一下MedalTallyProxy.as：


package com.riarevolution.advancedflex3.examples.athens2004.model.proxy
&#160;
public&#160;class MedalTallyProxy implements IMedalTally, IModelProxy
{
private&#160;var _sourceData:XML;
private&#160;var _medalTally:MedalTally;
public&#160;function MedalTallyProxy(_sourceData:XML)
{
_sourceData = getSourceData();
medalTally = new&#160;MedalTally();
//TODO: 实现函数
}
public&#160;function getMedalWinners():Array
{
if(_medalTally.getMedalWinners() == null)&#160;{
_medalTally.setMedalWinners(mx.utils.ArrayUtil.toArray(_sourceData.MedalWinner));
}
return&#160;_medalTally.getMedalWinners();
}
public&#160;function setMedalWinners(value:Array):void
{
mx.utils.ArrayUtil.toArray(_sourceData.MedalWinner) = value;
_medalTally.setMedalWinners(value);
}
private&#160;function getSourceData() {
// 实现远程代理
// 从外部XML文件得到数据
}
}
&#160;
}
再看MedalTally.as：
package com.riarevolution.advancedflex3.examples.athens2004.model.proxy{
public&#160;class MedalTally implements IMedalTally {
private&#160;var _medalWinners:Array;
public&#160;function MedalTally() {
super();
}
public&#160;function getMedalWinners():Array {
return&#160;_medalWinners;
}
public&#160;function setMedalWinners(value:Array):void {
_medalWinners=value;
}
}
}
我们来看MedalTallyProxy.as，我们没有实现取得外部数据的方法（getSourceData）。你能使用URLLoader类来加载外部的XML文件来做为一个远程代理。特别是一个大的XML文件。
下节继续!
(转载请注明出处,请勿使用商业用途!)
]]></description>
		<wfw:commentRss>http://blog.smilecn.net/?feed=rss2&amp;p=45</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[Flex]AdvancED Flex 3中文翻译(三)</title>
		<link>http://blog.smilecn.net/?p=44</link>
		<comments>http://blog.smilecn.net/?p=44#comments</comments>
		<pubDate>Thu, 26 Feb 2009 07:31:14 +0000</pubDate>
		<dc:creator>arrowyoung</dc:creator>
				<category><![CDATA[AdvancED Flex 3中文翻译]]></category>

		<guid isPermaLink="false">http://blog.smilecn.net/?p=44</guid>
		<description><![CDATA[在例子中添加一些更真实和复杂的东西
前面的假设意味着支持五种可能替代model接口实现了单一view。为了实现这一目标，你需要抽象出一种model数据结构，不管选择哪一种数据源，在程序中都有这个结构。通常情况下，建立一个这样的结构是一个面向对象（OO）的model和可能用代理的远程数据源。这样做不仅仅是改变model，使那个基础MVC能更好的扩展和松耦合，也能确保在以后更复杂的view，controller,services和model在全面的互动时得到好的处理。

为了实现这一目标，我们需要做以下事情：
■用面向对象(OO)的形式创建一个有代表性的model。
■创建一个代理model，无论任何时候都能访问和操作本地或远程的。
■总结内外部的数据访问services。
■创建一个所有服务的注册表，记录Flex与内部、外部数据源的所有应用程序接口。
■提供一种机制来查询服务注册表和调用一个服务。
■在用户操作或系统事件发生时，创建一个命令来调用服务及调用命令。
■建立一个机制，让model和view能互发消息。
在复杂的情况下，我们还需要做一些额外的事情：
■在应用程序中创建一种松散耦合的消息传递机制，这是对现有Flex消息机制的一种扩充。
■创建一个能注册、取回model的model注册表。
■允许在整个应用程序中定义model，尤其是CRUD应用程序。
■在多个Flex应用程序和多个存取控制层中共享数据应创建一个用命名空间分隔的model注册表
■创建一个能注册、取回command的command注册表。
如果你被上面说的这些东西吓到了，请不要担心。我会一步一步教你每一个步骤，详细地讲清楚，尽快将所有的都讲明白。此外，所有这些概念已经汇总到了一个叫Fireclay的框架中，它可以很方便的使用在你的应用程序中。Fireclay放在Google Code主机上，地址是：http://code.google.com/p/fireclay/
让我们先学习进一步的原理和步骤，然后深入，让它变得更清楚和更有效的。我们首先讨论model有不同的数据源，但不久我们将精力集中在抽象服务，command、proxy和event，这能方便所有类型的model操作和controller相互作用。
在较高的水平，我们通常会有三个主要的部分：view、controller、model，另外附加二个部分：service、event。view是一些组件，通常会调用一些辅助的和公共的一些方法完成一些过渡和效果。model能在代理的帮助下得到本地或远程的复杂的抽象数据。controller查询事件消息和通知帮助event间接执行command通过事件侦听去执行一个service或执行业务逻辑。所有主张支持松散耦合和事件驱动架构。我也建议你积极避开一些想法，这里列出一些反模式：
■频繁的使用数据绑定是不好的。绑定是基于事件模式的，过多的绑定会导致创建过多的事件并没有使用。通常你只会得到model元素的改变的属性值。
■Cairngorm提倡使用单例的model,这是多余的，并且会降低性能。Cairngorm是一个用得比较广泛的开源的Flex应用程序开发框架，我们在后面的章节中讲到它。
■使用Front Controller，在Flex应用程序中，一般流行的请求(request)-响应（response）的web应用程序方式是多余的。
■使用单例的情况下，注册实例或注册event实例是没有必要的，因为这样会限制程序的扩展和单元测试。
我们将讨论一些反模式（一些被推荐的架构）,下一节我们会讲得更详细。在此之前我们来看一下我们的新的MVC架构（1-2）

model以面向对象（OO）形式表现
ActionScript 3 (AS3) 是一个面向对象的语言，所以我们将以对象的形式表现model。在我们的例子中，将建立一个MedalWinner对象，它的如下属性：ThreeLetterCode、Name、 GoldMedalCount、SilverMedalCount和BronzeMedalCount。我们创建一个MedalTally类，包含多个MedalWinner对象，我们利用对象的属性，为属性命一些好记的名字，以便于我们能更容易理解model中的单个元素和它们的行为。在远程调用过程情况下，特别是远程调用的语言也是面向对象的（如JAVA）,这些相同的对象能够被中间件序列化和反序列化。这些对象往往是调用数据转换对象（DTOs）。DTOs支持多个应用程序一起调用。如果你有不熟悉的概念，可以到以下网站了解：
■Patterns of Enterprise Application Architecture:http://www.martinfowler.com/eaaCatalog/dataTransferObject.html
■Core J2EE Patterns—Transfer Object:http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html
下面的代码是用上面的例子的model建立一个对象，源代码清单中MedalTally对象并没有包含MedalWinners对象，对MedalTally对象来说要包含什么并没有严格的限制。如果确实需要，可以包含一些基于松耦合配置数组。
MedalWinner.as定义了一个MedalWinner类的属性和操作。
package com.riarevolution.advancedflex3.examples.athens2004.model{
public&#160;class MedalWinner {
public&#160;function MedalWinner() {
super();
}
private&#160;var _threeLetterCode:String;
private&#160;var _name:String;
private&#160;var _goldMedalCount:int;
private&#160;var _silverMedalCount:int;
private&#160;var _bronzeMedalCount:int;
/**
* threeLetterCode uniquely identifies a medal-winning country
*/
public&#160;function get threeLetterCode():String {
return&#160;_threeLetterCode;
}
/**
* @private
*/
public&#160;function set threeLetterCode(value:String):void {
_threeLetterCode=value;
}
/**
* The medal-winning country name
* thats maps 1 to 1 with the threeLetterCode
*/
public&#160;function get name():String {
return&#160;_name;
}
/**
* @private
*/
public&#160;function set name(value:String):void [...]]]></description>
		<wfw:commentRss>http://blog.smilecn.net/?feed=rss2&amp;p=44</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[Flex]AdvancED Flex 3中文翻译(二)</title>
		<link>http://blog.smilecn.net/?p=43</link>
		<comments>http://blog.smilecn.net/?p=43#comments</comments>
		<pubDate>Tue, 13 Jan 2009 08:17:21 +0000</pubDate>
		<dc:creator>arrowyoung</dc:creator>
				<category><![CDATA[AdvancED Flex 3中文翻译]]></category>

		<guid isPermaLink="false">http://blog.smilecn.net/?p=43</guid>
		<description><![CDATA[一个简单的例子
     让我们来看一个简单的例子，以便你可以看到在实践中的MVC。我们的是model是2004年雅典奥运会奖牌排名前五名的国家。我们将根据这个model建立三个不同的view。一个view我们用表格的形式来表现，别外两个我们用柱形和条形的图表来表现。
     在Flex，一个数据model能编译在树形的ActionScript对象中，使用MXML Model标签。我们的重点在MVC上，利用这一原理，把我们的model放在一个简单的XML文件中，我们结合Model标签来绑定源文件。接下来我们来考虑如何架构和设计model。Model标签的部分代码如下：

&#60;mx:Model source=&#34;/com/riarevolution/advancedflex3/examples/athens2004/model/medal_tally_top_5.xml&#34; id=&#34;medalTally&#34; /&#62;
&#60;!-- medal_tally_top_5.xml部分内容 -- &#62;
&#60;!-- XML文件存储数据 --&#62;
&#60;MedalTally&#62;
&#160; &#160; &#60;MedalWinner&#62;
&#160; &#160; &#160; &#160; &#60;ThreeLetterCode&#62;USA&#60;/ThreeLetterCode&#62;
&#160; &#160; &#160; &#160; &#60;Name&#62;United States&#60;/Name&#62;
&#160; &#160; &#160; &#160; &#60;GoldMedalCount&#62;35&#60;/GoldMedalCount&#62;
&#160; &#160; &#160; &#160; &#60;SilverMedalCount&#62;39&#60;/SilverMedalCount&#62;
&#160; &#160; &#160; &#160; &#60;BronzeMedalCount&#62;29&#60;/BronzeMedalCount&#62;
&#160; &#160; &#60;/MedalWinner&#62;
&#160; &#160; &#60;MedalWinner&#62;
&#60;/MedalTally&#62;
    这个model会用在三个不同的view中，放在三个独立的MXML中，利用Flex方便有效的数据绑定机制。将我们需要的值存在变量中，绑定的值要用{}括起来。真实的值存在变量中，这些值是从数据源中复制的属性，值是数据源的属性值（{}括起来）,是复制的目标属性。这样可以动态绑定变量的值，并保持数据源的值和使用地方的松散耦合。
{}机制，数据绑定允许：
■使用ActionScript表达式在{}中
■使用E4X表达式在{}中
■使用ActionScript 函数在{}中
    [...]]]></description>
		<wfw:commentRss>http://blog.smilecn.net/?feed=rss2&amp;p=43</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Flex]AdvancED Flex 3中文翻译(一)</title>
		<link>http://blog.smilecn.net/?p=42</link>
		<comments>http://blog.smilecn.net/?p=42#comments</comments>
		<pubDate>Tue, 13 Jan 2009 07:55:35 +0000</pubDate>
		<dc:creator>arrowyoung</dc:creator>
				<category><![CDATA[AdvancED Flex 3中文翻译]]></category>

		<guid isPermaLink="false">http://blog.smilecn.net/?p=42</guid>
		<description><![CDATA[
作者:Shashank Tiwari, Jack Herrington,Elad Elrom和 Joshua Mostafa
AdvancED Flex 3中文翻译　by arrowyoung
(注:请勿使用商业用途　如有任何问题请联系我:arrowyoung@126.com)

第一部分 利用强大的Flex 3
第一章 
利用架构和设计模式
Adobe Flex 3,其框架、相关技术（Flash 平台）、相关工具（编译器和调试器）、IDE（Flex Builder 3）和服务器端网关(BlazeDS 和 LifeCycle Data Services) 让您可以建立复杂有效的丰富互联网应用程序（RIA），它能帮助你按时并在预算内得到具有丰富交互性应用程序。但它不是用来写你的业务逻辑和应用程序流程的，这一点要注意。
当应用程序只有有限的范围和复杂度时，我们知道业务逻辑和应用程序流程是很容易实现的,如果范围和复杂度增加时，事情会变得不好控制。当你的代码文件越来越多时，程序结构会变得不合理,业务逻辑的实现如果没有好的规划和设计，开始代码灵活，往后会越来越难于修改和增加新的功能。除此之外，应用程序流程根据要求的变化而变化会变得极其难以处理和维护。所以，当我们准备去部署这个应该程序的时候，它是不可维护的。如果你要避免这种情况，你自始至终都要使用简单干净的设计。
在整个应用程序开发周期，不断地制作可维护和灵活的应用程序，可使你有一个良好的编程习惯，长此以往，你将变成一个更好的程序员。如果你已经有了一些或所有的这些优点，你将能更好的利用它们。
在制作一个丰富、健壮的应用程序的时候，你也许希望你的朋友的一些良好的建议，以提高你的技巧、耐心和毅力。这本书就一个朋友。在这本书中能看到大量的建议和非常好的源代码，它是一直以来努力的结果。
我们现在开始吧
在这一章中，我们的重点是如何去设计和架构一个灵活、可维护和可扩展(按照用户的期望)的丰富互联网应用程序（RIA）。我们可以根据需求在理论的基础上进行讨论。有大量的图解的例子。
从结构的角度，我们把这一章分成四个部分：
■    根据实际的例子了解架构和设计原则。
■     总结这章内容的好处和挑战架构和设计原则
■     测试现有的架构框架
■     选择现有的框架并且从零开始
我认为并相信一个好理解的架构和设计模式没有一个特定的架构或微架构去参考,我们将在一个公正的基础上去比较现有的框架,一旦通过我们的基本要求,我们就能选择出比较好的框架。
在这本书中我们不会去区别架构模式和设计模式，因为我们不需要这样做。
采用架构和设计模式
本节会用一些常用的方式去解决常用的问题，一般称为设计模式或简单模式，它们有时超出架构设计范围。正式的分类喜欢去按以前的架构去分类，像架构、微架构，概念架构.在这本书中，我们仅仅是帮助你怎么应用这些模式，以使你下一个项目成功。我们要建立一个健壮的、可维护的应用程序就需要一个好的模式。
首先你可能会问，这些模式是别人写好的并且已经有很多人用，为什么我们不马上就开始写一些应用程序实例呢？为什么我们会先犯一些错误，然后回过头来再来纠正这些错误呢？像模式世界中的其它问题一样，这些问题的答案既不是统一的，也不是很好理解的。从著名的四人帮写的书（《Design Patterns: Elements of Reusable Object-Oriented Software》作者：Erich Gamma, Richard Helm, Ralph Johnson 和 John Vlissides,基于C++和Smalltalk）开始，形成了一股对重复出现的问题进行归类的潮流,导致了模式数量的增长，从23种模式增长到了数百种，它也导致了分类模式成为一种具体的技术，举个例子来说：J2EE的设计模式相关与具体应用案例，就有AJAX模式。丰富的模式会使许多开发者在有简单的解决方案的时候还要去过度的设计和架构。它误导我们花过多的精力在这上面，导致我们的应用程序不好理解并有很多问题。然而这并不意味着它们是无用的或没有价值的。我们需要有效地利用模式的做法和经验，并不仅仅是知道理论上的的模式是什么。
一个良好开始的第一原则——了解需求，并建立一个简单明了的解决方案以满足他们。如果你这样做了会使用到一些模式而你并不知道。在这个时候，你最好了解基本的架构和设计模式，这样你会从模式中找到一个解决方案，避免做重复的劳动。说起来容易做起来难，因为这是一个反复，并常常涉及到耐心、决心、勇气，并愿意不断学习的过程。
通过实际的讲解，本节将帮助你零起步。
回到基础
当使用到用户界面时，MVC是最唯一也是最重要的一种设计模式，所以我们从它开始。MVC模式由三个元素组成——model、view、和 controller。model是保存数据和状态的，view是用来看和交互的，controller是用户操作之后更新model的。
每一种模式是用一个已知的方式去解决一个重复的问题。如果你一直认为的model和view是一个紧密耦合单元，那么MVC能解决这个问题。如果model和view在同一个类中，那么它们紧耦合的，model中一个很小的修改会导致view中做大量的修改，如果有两个或更多的view要使用同一个model，会导致model会重复定义。这会导致矛盾和维护问题影响程序的进度。为同一个model增加一个新的view增加了障碍。
因此，MVC的第一个原则是保持view和model的相互独立。事实上model是完全不知道view的，model提供数据（状态）的访问接口并发布改变消息，view去使用它。为了实现这个目标，model的元素、状态和状态的逻辑改变时，model定义的应用程序接口（API）保持不变。这并不意味意API是静态的。这意味着修改一个重载或增加一个新函数支持新的参数和数据类型。也意味着你现有的接口保持不变。想要view了解model，你还需要一个中介来控制一个model实例。
一个典型的view允许使用者去创建、读、更新并删除model元素。读是一个最简单的操作，这个操作可以获得model的所有东西。对于创建，更新并且删除，view需要修改model元素，而且大多数情况下影响model的状态。这个时候我们需要controller。controller是一个中介，在用户操作后更新model(或其它的view)。一个controller可还有作为第三方管理多个view绑定一个model。
controller可以和view写在一个类或分开写成多个类。根据经验，除了最简单的情况下，其它的都应该写成分开的多个类。在简单的情况下，当view和controller一起在一个类时，模式经常称文档视图（Document View）模式。
下节继续!
(转载请注明出处,请勿使用商业用途!)
]]></description>
		<wfw:commentRss>http://blog.smilecn.net/?feed=rss2&amp;p=42</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[other]Flash cs4 正式版(破解)下载</title>
		<link>http://blog.smilecn.net/?p=39</link>
		<comments>http://blog.smilecn.net/?p=39#comments</comments>
		<pubDate>Fri, 26 Sep 2008 02:22:12 +0000</pubDate>
		<dc:creator>arrowyoung</dc:creator>
				<category><![CDATA[Other]]></category>

		<guid isPermaLink="false">http://blog.smilecn.net/?p=39</guid>
		<description><![CDATA[Flash cs4 已经出来了,下面是个BT种子文件,可以下载,我已下载安装.
点击下载

]]></description>
		<wfw:commentRss>http://blog.smilecn.net/?feed=rss2&amp;p=39</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[Flash Media Server]一步一步学Flash Media Server(八)</title>
		<link>http://blog.smilecn.net/?p=37</link>
		<comments>http://blog.smilecn.net/?p=37#comments</comments>
		<pubDate>Wed, 30 Jul 2008 09:44:42 +0000</pubDate>
		<dc:creator>arrowyoung</dc:creator>
				<category><![CDATA[Flash Media Server]]></category>
		<category><![CDATA[一步一步学Flash Media Server]]></category>

		<guid isPermaLink="false">http://blog.smilecn.net/?p=37</guid>
		<description><![CDATA[在上一节中,我们将一些方法进一步封装到了UserList类中了,这样做是有很多好处的,以前经常有朋友问我像聊天室怎么做成多房间,像斗地主怎么做成多个桌子在打,其实原理都是一样的,我们只需要对UserList类做一些改造,就可以达到这个功能了,首先把类的名字改成ChatRoom,这样更好认一些,先看ChatRoom.asc,是由UserList.asc改造而来的:

function ChatRoom(id){
&#160; &#160; this.id = id;
&#160; &#160; this.listArray = [];
&#160; &#160; this.chatMsgArray = [];
}
&#160;
ChatRoom.prototype.addUser = function(user){
&#160; &#160; this.listArray.push(user);
&#160; &#160; this.sendUserList();
}
&#160;
ChatRoom.prototype.delUser = function(userName){
&#160; &#160; var&#160;len = this.listArray.length;
&#160; &#160; for(var&#160;i=0;i&#60;len;i++){
&#160; &#160; &#160; &#160; if(this.listArray[i].userName == userName){
&#160; &#160; &#160; &#160; &#160; &#160; this.listArray.splice(i,1);
&#160; &#160; &#160; &#160; &#160; &#160; break;
&#160; &#160; &#160; &#160; }
&#160; &#160; }
&#160; &#160; this.sendUserList();
}
&#160;
ChatRoom.prototype.checkOnline = [...]]]></description>
		<wfw:commentRss>http://blog.smilecn.net/?feed=rss2&amp;p=37</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>[Flash Media Server]一步一步学Flash Media Server(七)</title>
		<link>http://blog.smilecn.net/?p=36</link>
		<comments>http://blog.smilecn.net/?p=36#comments</comments>
		<pubDate>Tue, 22 Jul 2008 10:26:52 +0000</pubDate>
		<dc:creator>arrowyoung</dc:creator>
				<category><![CDATA[Flash Media Server]]></category>
		<category><![CDATA[一步一步学Flash Media Server]]></category>

		<guid isPermaLink="false">http://blog.smilecn.net/?p=36</guid>
		<description><![CDATA[在上一节中,我们学会了在FMS中使用类,虽然不是正式意义上的类,但也会使我们的程序看起来更结构化,这一节我们继续用类的方式改造之前的代码,首先我们要加个用户类(User.asc):

function User(client,userName){
&#160; &#160; this.client = client;
&#160; &#160; this.userName = this.client.userName = userName;
}
很简单的一个类,只有构造,没有方法,其实是当用户的信息更多时,我们通常会将用户的所有信息都封装起来,这样便于我们使用,这里我们只是比前面多加了一个client对象,这个对象是代表连接进来的客户端,我们把它封装到User里面.
接着,UserList.asc也要做相应该的修改,并且把之前在main.asc里面的sendUserList和sendMsgToClient也封装到UserList这个类中.
function UserList(){
&#160; &#160; this.listArray = [];//也可以用new Array(),不过听说[]效率更高;
}
&#160;
UserList.prototype.addUser = function(user){
&#160; &#160; this.listArray.push(user);
&#160; &#160; this.sendUserList();
}
&#160;
UserList.prototype.delUser = function(userName){
&#160; &#160; var&#160;len = this.listArray.length;
&#160; &#160; for(var&#160;i=0;i&#60;len;i++){
&#160; &#160; &#160; &#160; if(this.listArray[i].userName == userName){
&#160; &#160; &#160; &#160; &#160; &#160; this.listArray.splice(i,1);
&#160; &#160; &#160; &#160; &#160; &#160; break;
&#160; &#160; &#160; &#160; }
&#160; &#160; [...]]]></description>
		<wfw:commentRss>http://blog.smilecn.net/?feed=rss2&amp;p=36</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Flash Media Server]一步一步学Flash Media Server(六)</title>
		<link>http://blog.smilecn.net/?p=35</link>
		<comments>http://blog.smilecn.net/?p=35#comments</comments>
		<pubDate>Mon, 21 Jul 2008 10:28:53 +0000</pubDate>
		<dc:creator>arrowyoung</dc:creator>
				<category><![CDATA[Flash Media Server]]></category>
		<category><![CDATA[一步一步学Flash Media Server]]></category>

		<guid isPermaLink="false">http://blog.smilecn.net/?p=35</guid>
		<description><![CDATA[当我们要加的功能越来越多时,就会发现程序会越写越大,这样我们就需要更好的组织我们的程序,用类是最好方法,但FMS用的是AS1.0的语法,没有真正意义的类,但也能完成类的简
单功能,不管怎么样,总比没有类好,今天我们就来看一下如果在AS1.0里使用类,当然这不是真正的类.
现在我们将上一节中用到的用户列表做一下修改,写成一个类,上一节中我们用了userListArray这样一个数组来存储用户列表,现在我们把用户列表写成一个类:

先建一个UserList.asc文件,这就是我们要用的类的文件名,当然UserList也是类名(其实并不需要文件名和类名相同,因为这不是真正意义上的类)
function UserList(){
&#160; &#160; this.listArray = [];//也可以用new Array(),不过听说[]效率更高;
}
&#160;
UserList.prototype.addUser = function(userName){
&#160; &#160; this.listArray.push(userName);
}
&#160;
UserList.prototype.delUser = function(userName){
&#160; &#160; var&#160;len = this.listArray.length;
&#160; &#160; for(var&#160;i=0;i&#60;len;i++){
&#160; &#160; &#160; &#160; if(this.listArray[i] == userName){
&#160; &#160; &#160; &#160; &#160; &#160; this.listArray.splice(i,1);
&#160; &#160; &#160; &#160; &#160; &#160; break;
&#160; &#160; &#160; &#160; }
&#160; &#160; }
}
&#160;
UserList.prototype.checkOnline = function(userName){
&#160; &#160; var&#160;len = this.listArray.length;
&#160; &#160; for(var&#160;i=0;i&#60;len;i++){
&#160; &#160; &#160; &#160; if(this.listArray[i] [...]]]></description>
		<wfw:commentRss>http://blog.smilecn.net/?feed=rss2&amp;p=35</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[Flash Media Server]一步一步学Flash Media Server(五)</title>
		<link>http://blog.smilecn.net/?p=34</link>
		<comments>http://blog.smilecn.net/?p=34#comments</comments>
		<pubDate>Sun, 20 Jul 2008 04:21:12 +0000</pubDate>
		<dc:creator>arrowyoung</dc:creator>
				<category><![CDATA[Flash Media Server]]></category>
		<category><![CDATA[一步一步学Flash Media Server]]></category>

		<guid isPermaLink="false">http://blog.smilecn.net/?p=34</guid>
		<description><![CDATA[今天我们的讲解的是在昨天代码的功能上加上在线列表的功能,同时会去掉共享对象,用另一种方法向客户端发消息.
先看看服务端代码我们更改些什么代码:

application.onAppStart = function() {
&#160; &#160; this.chatMsgArray = new&#160;Array();
&#160; &#160; this.userListArray = new&#160;Array();
}
&#160;
application.onConnect = function(client, userName)&#160;{
&#160; &#160; if(checkOnline(userName)){
&#160; &#160; &#160; &#160; this.rejectConnection(client);
&#160; &#160; &#160; &#160; return;
&#160; &#160; }
&#160; &#160; this.acceptConnection(client);
&#160; &#160; client.userName = userName;
&#160; &#160; this.userListArray.push(userName);
&#160; &#160; sendUserList();
&#160; &#160; //客户端调用方法
&#160; &#160; client.getMsg = function(){
&#160; &#160; &#160; &#160; return&#160;application.chatMsgArray;
&#160; &#160; }
&#160; &#160; client.sendMsg = function(msg){
&#160; &#160; &#160; [...]]]></description>
		<wfw:commentRss>http://blog.smilecn.net/?feed=rss2&amp;p=34</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[Flash Media Server]一步一步学Flash Media Server(四)</title>
		<link>http://blog.smilecn.net/?p=33</link>
		<comments>http://blog.smilecn.net/?p=33#comments</comments>
		<pubDate>Sun, 20 Jul 2008 04:17:38 +0000</pubDate>
		<dc:creator>arrowyoung</dc:creator>
				<category><![CDATA[Flash Media Server]]></category>
		<category><![CDATA[一步一步学Flash Media Server]]></category>

		<guid isPermaLink="false">http://blog.smilecn.net/?p=33</guid>
		<description><![CDATA[今天我们讲一个非常简单的多人聊天功能,同样我们也没有服务端代码,今天要用到一个新东西&#8212;-SharedObject
先看一段代码,更改一下上一节中的代码:

package net.smilecn.chat{
&#160; &#160; 
&#160; &#160; import&#160;flash.display.Sprite;
&#160; &#160; import&#160;flash.net.NetConnection;
&#160; &#160; import&#160;flash.net.SharedObject;
&#160; &#160; import&#160;flash.events.NetStatusEvent;
&#160; &#160; import&#160;flash.events.SyncEvent;
&#160; &#160; import&#160;flash.events.MouseEvent;
&#160; &#160; import&#160;fl.controls.TextArea;
&#160; &#160; import&#160;fl.controls.Button;
&#160; &#160; import&#160;fl.controls.TextInput;
&#160;
&#160; &#160; 
&#160; &#160; public&#160;class Chat extends Sprite{
&#160; &#160; &#160; &#160; 
&#160; &#160; &#160; &#160; private&#160;var nc:NetConnection;
&#160; &#160; &#160; &#160; private&#160;var rtmpUrl:String = &#34;rtmp://localhost/chat&#34;;
&#160; &#160; &#160; &#160; private&#160;var button:Button;
&#160; &#160; &#160; &#160; private&#160;var textArea:TextArea;
&#160; [...]]]></description>
		<wfw:commentRss>http://blog.smilecn.net/?feed=rss2&amp;p=33</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
