??xml version="1.0" encoding="utf-8" standalone="yes"?> Construction是组件构造阶D,lg的构造器不能有必ȝ参数。在构造函C可以d事g监听器,初始化属性。这个阶D只做很的事情? Configuration是组件的配置阶段Q组件的属性,事g回调函数Q样式和效果定义都在q个阶段完成。你不应该把q些d推迟到Attachment和Initlization阶段之后? Attachment阶段是把该组件追加到昄列表当中Q一个Flexlg会被一个Flex容器IContianer以addChildҎd到显C列表当中? 在Initlization初始化阶D,lg会执行一ơ完整的invalidation/validation周期。这个阶D做的工作流E是Q? 用户可能会与lg产生交互Q组件的位置大小可能改变Q样式可能被重新赋|也可能获得焦Ҏ者被用{等。这些情늚发生都用影响到组件外观的变化。所以组仉要重l自w来响应q些变化? 如果一个组件的属性改变,它可能就会标记组件ؓ失效状态? 一个组件被标记失效后,会验证是否需要更新组Ӟ如果需要会调用相关的方法来更新。组件有三个极其重要的方法来更新自己Q? 除了q三个方法,q有一个重要的Ҏ是styleChanged(styleName)Q当某个样式改变ӞstyleChanged被调用,然后执行Invalidation标记lg。如果你有自定义一个组Ӟ有一些法则必要得遵守Q? 不要在子cM昑ּ调用commitPropertiesQmeasure和updateDisplayListq三个方法,你要做的是overrideQ而不是call。如果你d了新的样式,同样是要l承styleChangedҎQ加入自q逻辑? 当不需要这个组件时Q把它从昄列表中移出。把lg从一个容器中Ud再添加到另一个容器中比创建新的组件有更小的开销? 如果lg不再被引用时Q它成为符合垃圑֛收的对象了,所以垃圑֛收的W一条准则是不再有活动的引用?br>更加值得注意的是W二条准则,即不包含使用了强引用的事件监听器QDictionary和Timer?br>所以尽量用弱引用是多么重要,但是同样Q小心你的弱引用在不该回收的时刻被回收了。例如对函数中的临时变量使用弱引用,你可能得不到你想要的异步l果?/p> 但很有趣的是虽然官方已提供了详细?FAQ 回答常见的问题,但仍然有许多误解存在Q也因此我特别针对这些问题请教了 Gordon Smith (from Adobe Flex team) 两h一?email 往q后Q大概已得出最佛_的答案,下面我试者将学到的资讯整理出来? QActionscrīpt 3 ?Javascrīpt 2 的差? AS3 ?JS2 都是依@ Ecmacript 4 规格所实作出来的语aQ它们的 core language 是完全一L? Core language 包含: sealed classes, interfaces, namespaces, method closures, exceptions, strong typing, E4X {,所以像 Array, String, int {也都包含在内? 但在 core language 之上Q就会依它执行的环境不同Q而加上不同的 extension? AS3: ?flash player 里执行,因此会加?flash所需?DOM (Document Object Model) 例如 Sprite, MovieClip, Socket{? JS2: ?Browser 里执行,׃加上 Browser 相关?DOM, 例如 Document, Form{? QTamarin 是什么? Tamarin 是由 AVM2 延而来Q它只负责执?Ecmacript 4 core language 的部份? 因此 Mozilla Foundation 拿到 Tamarin engine 后,W一件要做的事就是在上面实作 Browser 相关?DOMQ例?Form 要怎么生成、Document 物g要如何存取? Adobe 要做的事则是在上面实?Flash 相关?DOM, 例如 Sprite 要如何画出来QVideo 要怎么串流与播放?Audio 的蝲入与音量控制{?很显然的Q这部䆾工作已经做完Q不然你手上?flash player 9 是打那儿来的Q? QAdobe ?Tamarin 往后的关系 如果日后QMozilla ?developer community 针对 Tamarin 做了某些最佛_Q例如有童出现?E4X 的执行效率提高了100?例如他写了一?routine/library 可以?xml ?processing time ~短为原本的1/100)Q这些改变一旦被加入 Tamarin ?codebaseQAdobe 也就可以׃n成果? 因此每当 Tamarin 有重大升U或改版ӞFlash Player 可能也跟者推出新版,因ؓ它内部的 core language scrīpt engine 也需要升U才能整?Tamarin 的改变? Q这代表 Adobe 也将 Flash Player open source了吗Q? 不? Flash Player = Tamarin + Flash-specific DOM 而这ơ开攑ևȝ只有核心?Tamarin engineQ因此跟 open source flash player 完全没关pR? 实际上做Z?universal platformQ最好也不要有太多的 branch/forkQ所以在可见的将来也不太可能见到官方做这件事? Q将?Firefox 不再需?flash player 了吗Q? 不,从上面可知,Firefox + Tamarin 只是取得了一个快速的 Ecmascrīpt 4 core language engine, 但它q没有内?flash DOMQ所以用 Flash 开发的E式(swf)q是要乖乖在 flash player 里跑? 不然Qadobe q投入h力开?64bit ?linux playerQ难不成是做心酸的吗Q? QTamarin 可以用在其它地方吗? 可以? ?Dreamweaver ZQ它有内?javascrīpt engineQ可以让user写一些巨集之cȝ指oQ自动化做某些事? 目前它是?javascrīpt 1.5 语法Q底层则是内Z SpiderMonkey engineQ然后在q之上,加入?Dreamweaver 独有?DOM, 例如 MenuCommand, EditorWindowQ让user可以?js1.5 L?Dreamweaver 的某些行为? 来QDreamweaver 可以选择改用 Tamarin 取代?SpiderMonkey 做ؓ内徏?scrīpt engine, q样user可以写 OO 式的 JS2 巨集? q就是一个不同的应用实例Q而实际上 Fireworks, Flash, Acrobat {也都有q样的能力,知名?Red5 目前?Rhino 来也可以考虑改用 TamarinQ毕竟有?0倍速的免钱 scrīpt engineQ何乐不为呢Q? QTamarin ?Flex developer 的媄? q部份就很有,单来_影响都是正面的,只是要把旉N来看Q正面的效应大概要一Cq后才会出现Q但最多三q?2009)后就可以看出q步下的完全正,而且可能是决定性的一步?br>以上文字来自Q?a >http://ria.richtechmedia.com/ 刚才q是忍不住到V8的官|读了些文档Q想看看到底它的技术特Ҏ什么? 引用 - Jscre, located under third_party/jscre. This code is copyrighted Jscre我没怎么听说q,不知道跟PCREQPerl Compatible Regular ExpressionsQ的关系是怎样的。在Jscre源码的目录里看到?pcre"的字P不过详细情况q是以后再看看好了。Apple Webkit里的JavaScriptCore应该是直接用了PCRE的吧Q还是说我看漏了…? Brendan Eich 写道 Q向叛_的是TraceMonkey比较快,向左多的是V8比较快) 查询Jenny的祖?/p>
查询Robert的子?/p>
http://www.program-transformation.org/Transform/AnnotationProcessingTool Javalobby: JavaLobby: JavaOne 2005: 1. Intiliazition
2. Updating
3. Destruction
V8官网Q?a >Google V8 JavaScript Engine
设计概念的文档:Design Elements
有h初试V8的经q:http://d.hatena.ne.jp/amachang/20080903/1220405193
V8是BSD许可证的Q比较自由,方便用在各种目中?
它是一个相当快的JavaScript实现。根据其设计概念的文档,它的高性能主要来自Q?
其中前两点应该是紧密相关联的。在JavaScript引擎的实CQV8特别q别在“隐藏类”(hidden classQ的使用。Hidden class的概念可以到那篇文档ȝQ解释得比较生动。简单来_对于某个对象Q每ơ属性的数量Q或cdQ这个得回头仔细研究下)发生改变Ӟ虚拟机就会新创徏一个对应的隐藏c,记录下其中各个属性的相对偏移量,q将原本的隐藏类与新的隐藏类之间建立一个关联。当再次有同一cd的对象创建时则不会重复创建隐藏类Q而能复用前面已经出现的隐藏类?
其它JavaScript引擎Q以及许多其它脚本语a的实玎ͼ一般用某UŞ式的兌容器来储存所有变量;通常叫字典,也会被称为映表或者关联数l,典型的实现方式是哈希表或者红黑树{。对象中的成员变量(下面称为“属性”)一般也是这样与某个对象兌在一L。访问某个对象的某个属性时需要动态查询这L兌容器Q是不可忽视的开销?
V8则不使用兌容器来储存属性,而是采用更接q于静态编译的cȝ形式Q将对象中每个属性的相对偏移量记下来Q在生成机器码时直接把偏U量写到指o中。这P讉K某个对象的某个属性就只需要很量的指令就能完成,比v兌容器的方式高效许多?
V8使用动态机器码生成Q先把要执行的JavaScript代码直接~译为机器码Q而不使用字节码也不通过解释的方式来执行。这样在执行一些被大量重读执行的代码时效果会特别好。与之相对,Apple Webkit的JavaScriptCore/SquirrelFish是先JavaScript~译到字节码Q然后以U解释的方式执行字节码;Mozilla/Adobe?a >Tamarin则是先将JavaScript~译到字节码Q然后以x~译QJITQ的方式执行。SquirrelFish与Tamarin的字节码设计思\又不一P前者是Z寄存器的Q而后者是Z栈的。一般认为基于寄存器形式的字节码比较快,而基于栈形式的字节码比较,M也是各有特点?
与“隐藏类”相关的是,V8会预先猜某D代码中的对象对应的隐藏c,如果命中的话p直接用已l生成到机器码里的偏U量Q如果没有命中,则用实际的隐藏cM的信息来修改已生成的机器码。这P如果多次执行中对象的“实际类型”都与猜一P执行速度可以非常的快?
Mozilla的新JavaScript执行引擎QTraceMonkey则通过别的方式来提高执行速度。通过记录代码执行的\径,当发现某条执行\径回C某个早先l过的节点,发C一个“trace”;然后对trace花时间做重点优化Q编译ؓ高效的机器码。与HotSpot JVM不同的是Qtrace不是以函敎ͼ或者说ҎQؓ单位的,可以在更的范围内做_的优化,减少不必要的优化开销?
在垃圾收集器斚wQV8采用的是一个两代的分代式准垃圾收集器。相对的QJavaScriptCore的GCl承自KJSQ没记错的话是一个没有分代的准确M&S式(mark-and-sweepQ垃圾收集器QTamarin使用的则是Adobe提供?a >MMgcQ主要算法是“gq的引用计数”(DRCQDeffered Reference CountingQ,外加增量式保守M&S的垃圾收集器。这三种实现方式各有特点Q实际效果要比较h恐怕比较难。准式的垃圾收集器必须知道堆的位置和布局Q所以难以做成通用的;保守式收集器则可以做得很通用Q著名的Boehm GC是个典型的例子。但保守式收集器有潜在的内存泄漏的危险,因ؓ可能会把q不是对象指针的数据识别为指针,使本来应该已l可以释攄I间无法被释放?
===========================================================================
V8中用了下列W三方库Q?
by the University of Cambridge and Apple Inc. and released under a
2-clause BSD license.
- Dtoa, located under third_party/dtoa. This code is copyrighted by
David M. Gay and released under an MIT license.
- Strongtalk assembler, the basis of the files assembler-arm-inl.h,
assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h,
assembler-ia32.cc, assembler-ia32.h, assembler.cc and assembler.h.
This code is copyrighted by Sun Microsystems Inc. and released
under a 3-clause BSD license.
===========================================================================
今天Mozilla斚w也没忘记对Chrome/V8的发布作出反应。Brendan EichQJavaScript的创始者,在其blog上发表了一相兌论:
Brendan Eich: TraceMonkey Update
可以看到在Brendan做的SunSpider试中,TraceMonkey在递归密集的程序中速度会比V8慢许多,而在正则表达式等斚w则比V8快。据BrendanUͼTraceMonkey的开发时间还不长Q递归斚w的traceq没多少q度Q所以在q部分是比较慢的。但下一步将会解册个问题? CREATE
TABLE FAMILY
(
PERSON_ID INTEGER,
NAME VARCHAR(50),
AGE INTEGER,
GENDER CHARACTER(1),
PARENT_ID INTEGER
)
insert into FAMILY (PERSON_ID, NAME, AGE, GENDER, PARENT_ID) values
(1, 'Apple', 10, 'F', 10),
(2, 'Zoe', 11, 'F', 3),
(3, 'John', 30, 'M', 13),
(4, 'Mary', 25, 'F', 24),
(5, 'Peter', 14, 'M', 4),
(6, 'Jenny', 13, 'F', 4),
(24, 'Robert', 60, 'M', 30);
WITH temptab (person_id, name, parent_id, LEVEL) AS
(SELECT person_id, name, parent_id, 0
FROM FAMILY
WHERE name = 'Jenny'
UNION ALL
SELECT SUPER.person_id, SUPER.name, SUPER.parent_id, CHILD.LEVEL+1
FROM FAMILY SUPER, temptab CHILD
WHERE SUPER.person_id = CHILD.parent_id
) SELECT * FROM temptab
WITH temptab (person_id, name, parent_id, level) AS
(SELECT person_id, name, parent_id, 0
FROM FAMILY
WHERE name = 'Robert'
UNION ALL
SELECT CHILD.person_id, CHILD.name, CHILD.parent_id, SUPER.LEVEL+1
FROM FAMILY CHILD, temptab SUPER
WHERE SUPER.person_id = CHILD.parent_id AND level < 2
) SELECT * FROM temptab WHERE LEVEL<>0
飞鹆传书作ؓ免费的开源YӞ在全世界各国享有声誉Q其原作者是H.ShirouzuQ其windowsq_的C++源码下蝲地址?a >http://www.azhi.net/IPMsg/ipmsg206src.zip。除windowsq_的实C外,q存在大量其它^台的飞鸽实现Q如MacQLinuxQ甚臌存在q_无关的Java版本?br>本h开发的飞鸽传书Q实际上是在M8q_上实C该协议子集。从而能够实现局域网内用户发玎ͼ接收PC版飞鸽传入的消息、文件、文件夹?br>本h实现的飞鸽,可参考如下两个帖子:
1 http://bbs.meizu.com/thread-791903-1-1.html
2 http://bbs.meizu.com/thread-814371-1-1.html
飞鸽能够实现q种异构q_之间的通信Q在于它的源码和协议是开攄Q只要遵守相应的传输协议Q就可以实现通信?br>q里要强调一个概念,|络传输cd用程序,协议是重中之重。那么,协议到底是什么呢Q协议可以让q行于两个不同^台的E序之间做到“心有灵犀一炚w”,也有点像黑帮内部的切口:A说了天王盖地虎,Bp说宝塔镇荷妖?br>有点扯远了,计算机网l应用中的协议,是要解决一些很实际的问题,比如Q以飞鸽ZQ计机A向计机B可以发消息,也可以传文g。都是通过|络传递数据,B如何能知道,q些数据中什么是消息Q什么是文g呢?q就需要设计通信协议Q通过一些命令字描述当前或即传送的数据是什么内宏V从而得接收方Q能够正理解发送方发出的内宏V?br>|络基础QTCP/IP协议?br>TCP/IP是很复杂的,要介l这个已l远q超出我的能力范_但我仍然可以对它的上层用做单的介绍?br>前面我们׃大量的篇q加口水协议在网l应用中的重要性。那所谓的飞鸽协议Q与我们qx常常听到的TCP/IP有什么区别和联系呢?q个问题问的好(我自己问的)Q?br>计算机网l的设计有着非常多的成功的可取之处,其中之一是分层。按照问题所在的领域Q将问层划分C同的层中去解冻I读者可自行参考OSI的七层模型以及TCP/IP的五层模型)。TCP/IP协议在传输层提供的UDP和TCP传输协议Q成Z我们构徏应用层YӞ如,聊天Q下载,邮gQhttp{等Q的基础?br>TCP传输协议规定了通信双方需要一个“连?接受”这Lq接认q程Q既所谓的三次握手q程。一但连接徏立成功,双方可以通过该连接,q行可靠的数据通信?br>UDP传输协议不需要双方进行连接,发送方只需要指定接收方的地址和端口,若接收方此时正在该端口等待接Ӟ那接收方有可能Q网l质量不好的话,可能会丢Q不q局域网里通常不会发生q样的情况)收到消息?br>除此之外Q还有一个重要的概念是广播,数据包发送到q播地址Q用UDP协议发送)Q则该网D늚所有用P都可以收到这条数据?br>飞鸽协议分析
飞鸽的协议也属于应用层协议,它描qC飞鸽E序通信时的语法和语义?br>其语法定义如下(所有的命o字,都必需W合q样的格式要求)Q?br>Ver(1): PacketNo:SenderName:SenderHost:CommandNo:AdditionalSection
每部分分别对应ؓQ版本号Q现在是1Q?数据包编?发送主?命o:附加数据
其中Q?br>数据包编P一般是取毫U数。利用这个数据,可以唯一的区别每个数据包Q?br>SenderName指的是发送者的늧Qm8飞鸽被我l一的写Mؓm8Q现在知道怎么定制了吧Q)Q?br>发送主机,指的是发送主机的L名;
命oQ指的是飞鸽协议中定义的一pd命oQ具体见下文Q?br>附加数据Q指的是对应不同的具体命令,需要提供的数据Q具体见下文?br>上面介绍了数据包的语法,x式,q些命o都是通过UDP协议向其它主机发送的?br>接下来列出协议的命oQ包括命令字及附加选项Q?br> 1) Command functions (Low 8 bits from command number 32 bits)
IPMSG_NOOPERATION No Operation
IPMSG_BR_ENTRY Entry to service (Start-up with a Broadcast command)
IPMSG_BR_EXIT Exit from service (End with a Broadcast command)
IPMSG_ANSENTRY Notify a new entry
IPMSG_BR_ABSENCE Change absence mode
IPMSG_BR_ISGETLIST Search valid sending host members
IPMSG_OKGETLIST Host list sending notice
IPMSG_GETLIST Host list sending request
IPMSG_ANSLIST Host list sending
IPMSG_SENDMSG Message transmission
IPMSG_RECVMSG Message receiving check
IPMSG_READMSG Message open notice
IPMSG_DELMSG Message discarded notice
IPMSG_ANSREADMSG Message open confirmation notice(added from version-8)
IPMSG_GETFILEDATA File Transfer request by TCP
IPMSG_RELEASEFILES Discard attachment file
IPMSG_GETDIRFILES Attachment hierarchical file request
IPMSG_GETINFO Get IPMSG version info.
IPMSG_SENDINFO Send IPMSG version info.
IPMSG_GETABSENCEINFO Get absence sentence
IPMSG_SENDABSENCEINFO Send absence sentence
IPMSG_GETPUBKEY RSA Public Key Acquisition
IPMSG_ANSPUBKEY RSA Public Key Response
2) Option flag (High 24 bits from command number 32 bits)
IPMSG_ABSENCEOPT Absence mode(Member recognition command)
IPMSG_SERVEROPT Server(Reserved)
IPMSG_DIALUPOPT Send individual member recognition command
IPMSG_SENDCHECKOPT Transmission check
IPMSG_SECRETOPT Sealed message
IPMSG_READCHECKOPT Sealed message check(added from ver8)
IPMSG_PASSWORDOPT Lock
IPMSG_BROADCASTOPT Broadcast message
IPMSG_MULTICASTOPT Multi-cast(Multiple casts selection)
IPMSG_NEWMUTIOPT New version multi-cast(reserved)
IPMSG_AUTORETOPT Automatic response(Ping-pong protection)
IPMSG_NOLOGOPT No log files
IPMSG_NOADDLISTOPT Notice to the members outside of BR_ENTRY
IPMSG_FILEATTACHOPT File attachment
IPMSG_ENCRYPTOPT Code
IPMSG_NOPOPUPOPT (No longer valid)
IPMSG_RETRYOPT Re-send flag(Use when acquiring HOSTLIST)
3) Extended code flag (hex format combination)
IPMSG_RSA_512
IPMSG_RSA_1024
IPMSG_RSA_2048
IPMSG_RC2_40
IPMSG_RC2_128
IPMSG_RC2_256
IPMSG_BLOWFISH_128
IPMSG_BLOWFISH_256
IPMSG_SIGN_MD5
4) Extended files for attachment (fileattr low 8 bits)
IPMSG_FILE_REGULAR
IPMSG_FILE_DIR
IPMSG_FILE_RETPARENT
IPMSG_FILE_SYMLINK
IPMSG_FILE_CDEV
IPMSG_FILE_BDEV
IPMSG_FILE_FIFO
IPMSG_FILE_RESFORK
5) Attachment file extended attribute(fileattr high 24 bits)
IPMSG_FILE_RONLYOPT
IPMSG_FILE_HIDDENOPT
IPMSG_FILE_EXHIDDENOPT
IPMSG_FILE_ARCHIVEOPT
IPMSG_FILE_SYSTEMOPT
6) Extended file attribute for attachment file
IPMSG_FILE_UID
IPMSG_FILE_USERNAME
IPMSG_FILE_GID
IPMSG_FILE_GROUPNAME
IPMSG_FILE_PERM
IPMSG_FILE_MAJORNO
IPMSG_FILE_MINORNO
IPMSG_FILE_CTIME
IPMSG_FILE_MTIME
IPMSG_FILE_ATIME
IPMSG_FILE_CREATETIME
IPMSG_FILE_CREATOR
IPMSG_FILE_FILETYPE
IPMSG_FILE_FINDERINFO
IPMSG_FILE_ACL
IPMSG_FILE_ALIASFNAME
IPMSG_FILE_UNICODEFNAME
Z上面介绍的内容,我们可以判断Q?br>1:100:shirouzu:jupiter:32:Hello 表示 shirouzu用户发送了 Hello q条消息Q?2对应为IPMSG_SEND_MSGq个命oQ具体需要看源码中的宏定义)?br>==========================================
以下内容未完待箋Q困了,明天再写
好,接下来我们进入具体场景的分析Q?br>d/ȝ通知
dq程需要实现向局域网内的用户q播Q告诉他们,“我来也Q”。收到这条消息的用户则立卛_复,“知道了Q我在这里”,同时新d的用户加入到用户列表中。发送方也可Ҏ收到的回复信息,了解到当前网l中Q都有哪些已l登录了的用戗?br>具体的数据包如下Q?br>d?要发送到q播地址Q如255.255.255.255)Q?br>1:XXX:m8:<L名称>:IPMSG_BR_ENTRY:
接收方回?发送到发送方的IP地址)Q?br>1:XXX:<接收方主机名>:IPMSG_ANSENTRY:
相应的,用户ȝӞ应向q播地址发送,“我MQ”,收到q条消息的用P需要将发送方从自q用户列表中移除,q且不需要回复?br>具体的数据包如下Q?br>卛_ȝ用户Q?br>1:XXX:m8:<L名称>:IPMSG_BR_EXIT:
发?接收消息
发送消息是飞鸽协议中最重要的部分,通过和一些命令选项Q可以实现复杂的功能Q?br>最基本的情况下Q发送方通过 IPMSG_SEND_MSG 命oQ可以将消息发送到接收?br>1:12345:m8:<L名称>:IPMSG_SEND_MSG:你好Q飞?br>使用命oӞ“附加数据”开使发挥作用了它里面包含了要发送的消息?br>通常情况下,׃UDP的不可靠性,q需要ؓ IPMSG_SEND_MSG 命o讑֮ IPMSG_SENDCHECKOPT选项Q也是要求接收方回复回执信息?br>1:12345:m8:<L名称>:IPMSG_SEND_MSG|IPMSG_SENDCHECKOPT:你好Q飞?br>接收Ҏ到IPMSG_SEND_MSGӞ如果遇到IPMSG_SENDCHECKOPT选项Q就要立卛_复如下信息:
1:XXX:<用户?gt;:<L?gt;:IPMSG_RECVMSG:12345
IPMSG_RECVMSG命o通过附加数据D中的数据(12345Q,告诉发送方Q我收到了你的编号ؓ12345的消息包?br>除了上面介绍的IPMSG_SENDCHECKOPT选项Q飞鸽还支持加密得选项Q现有的m8版本没有实现该功能,所以暂不对q一块进行介l?br>发?接收文g
文g的传输,要稍微复杂一些,它是通过 IPMSG_SEND_MSG 命o?IPMSG_FILEATTACHOPT选项的组合,通知接收方“现在有文g要发l你了?同时要将一些描q文件属性的数据Q如文g名、大、创建时间、类别属性如文g夹)Q发送给接收方,具体格式如下Q?br>file1ID:filename:size:mtime:fileattr[:extend-attr=val1[,val2...][:extend-attr2=...]]:\a:file2ID...
q里需要注意的有几点,W一Q一条文件传送命令,可以携带多条文g信息Q第二,多个文g信息之前Q要用\a分割Q第三,size, mtime和fileattr 是用十六q制数描q的Q;W四Q如果文件名中包含?”,则需要将其{义ؓ?:”?br>相应的,接收Ҏ到文件传送命令后Q首先需要从文g属性的数据中解析出要接收的文g的属性。然后向发送方相同的端口进行TCPq接Q连接成功后Q通过TCP通道向发送方发送IPMSG_GETFILEDATA命o用于接收文g或发送IPMSG_GETDIRFILES命oQ用于接收文件夹。具体接收文件的命o如下Q?br>1:XXX:m8:<L?gt;:IPMSG_GETFILEDATA:packetID:fileID : offset
q条命o通过packetIDQ让发送方明白Ҏh的文件是源于哪个命o包;通过fileId让发送方定要发哪个文g;通过offsetQ让发送方明白要从哪个字节开始发送?br>发送方的TCP通道收到上面的命令,׃发送对方请求的文gQ而接收方收到的数据保存到磁盘上卛_?/p>Annotation Processing Tool
Annotations
Official Documentation
Online Articles
Application of Annotations: EJB
Annotation Processing
Official Documentation
Online Articles
Presentations
Blog Entries
Discussions