??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品天天影视久久综合网,久久香蕉国产线看观看精品yw,午夜人妻久久久久久久久http://www.shnenglu.com/gnupython/category/723.html<font color=blue>......酒干倘卖无!......</font> <img src=http://services.nexodyne.com/email/icon/dcyohY1Q.RaZMinI0A%3D%3D/7.703%2BQ%3D/R01haWw%3D/0/image.png></img>zh-cnThu, 22 May 2008 21:13:46 GMTThu, 22 May 2008 21:13:46 GMT60如何~译Q配|ACEhttp://www.shnenglu.com/gnupython/articles/3450.htmlheart in the worldheart in the worldThu, 23 Feb 2006 11:53:00 GMThttp://www.shnenglu.com/gnupython/articles/3450.htmlhttp://www.shnenglu.com/gnupython/comments/3450.htmlhttp://www.shnenglu.com/gnupython/articles/3450.html#Feedback0http://www.shnenglu.com/gnupython/comments/commentRss/3450.htmlhttp://www.shnenglu.com/gnupython/services/trackbacks/3450.htmlACE是个很有用的开放源代码的C++|络~程开发包Q利用它比直接用API更有利于代码的健壮性,可移植性,q相对简单?BR>估计大家刚接触ACEӞ都有一定难度,说不定就半途放弃了Q这是我学ACE两天中的ȝQ基本上不成文,但我想研I到ACE的你一定会明白下文的意思?BR>
一、ACE官方主页Q?A >http://www.cs.wustl.edu/~schmidt/ACE.html
    下蝲地址Q?A >http://deuce.doc.wustl.edu/Download.html
   
    我下载的是Latest Beta Kit中的ACE.zipQLatest Release中的压羃包好像有问题Q我有WinRAR3.30解压~报错)

二、解压羃后放在D?BR>    D:\ACE_wrappers

三、在D:\ACE_wrappers\ace目录下新建文件config.h加入一?BR>    #include "ace/config-win32.h"
   
四、编译:用VC6.0打开D:\ACE_wrappers\ace\ace.dsw
    左侧昄    ACE DLL classes
               ACE LIB classes
    ?、从菜单上选择“编译”,“放|可q行配置”,选择你需要的工程配置
        “编译”,“重建全部”(或Q一Q如ACE DLL - Win32 MFC DebugQ?BR>        此过E可能持l半时至一个小时不{?BR>    ?、从菜单上选择“编译”,“批构徏”,选择你需要的工程配置
        此过E可能持l二臛_个钟?BR>       
    产生?lib文g位于D:\ACE_wrappers\ace\下,
    产生?dll文g位于D:\ACE_wrappers\bin\?BR>   
   
    同样打开ace_static.dsw
    ~译
    ACEs.lib
    ACEsd.lib
    ACE_RMCasts.lib
    ACE_RMCastsd.lib
    TMCasts.lib
    TMCastsd.lib

    ACE生成的dll和lib文g的命名规则:Qd = debugQs = staticQ?BR>
    debug - aced.lib、debug+static - acesd.lib、release - ace.lib?release+static - aces.lib


五、样例程序的~译
    用VC打开D:\ACE_wrappers\tests\tests.dsw
    “编译”,“批构徏?BR>   
六、自写程序的工程配置
   
    中篇QACEE序员教E?pdf中的样例E序Q?BR>    |址Q?A >http://www.cs.wustl.edu/~schmidt/ACE_wrappers/docs/tutorials/guide-tutorials.html
   
    网上的原代码复制C新徏文gQƈ命名为server.cpp
    用)Q打开Q编译,重徏全部Q弹出对话框Q“This build command require ...“,点”是?BR>   
    会出C下错?BR>   
    如果有“Cannot open include file: 'ace/SOCK_Acceptor.h': No such file or directory?BR>    工程-讄-C/C++: Preprocessor,附加包含路径QD:/ACE_wrappers
   
    如果有?You must link against multi-threaded libraries when using ACE (check your project settings)?BR>    工程-讄-C/C++: Code Generation - Use run-time library : Debug Multithreaded Dll
   
    如果有“error C2065: 'ACE_ERROR' : undeclared identifier?BR>            error C2065: 'ACE_DEBUG' : undeclared identifier
    #include "ace/Log_Msg.h"

    error C4716: 'ace_main_i' : must return a value
        在main中加?BR>            return 0;
   
    “error LNK2001: unresolved external symbol "__declspec(dllimport) int __cdecl?BR>    工程-讄-Link-Input: 对象/库模块:daced.lib                         附加库\径:D:\ACE_wrappers\ace
                       
   
                       
    ~译client中遇到的问题
    1、error C2039: 'sprintf' : is not a member of 'ACE_OS'
       
        #include "ace/OS_NS_stdio.h"
       
    2、error C2039: 'strlen' : is not a member of 'ACE_OS'
   
        #include "ace/OS_NS_string.h"
    3、error C2059: syntax error : '?'
        错误在这一句:  ACE_DEBUG((LM_DEBUG,?Usage egX <hostname> <port_number>\n?));
        ?改ؓ"
       
    4、无法找到动态链接库aced.dll于指定的路径
        为系l变量PATH加上D:\ACE_wrappers\bin
            
    静态包含:
       工程-讄-C/C++-预处理程序定义中加入 ,ACE_AS_STATIC_LIBS
      
      
例1server~译后生?BR>    server.exe 16K  serverd.exe 97K     servers.exe 124K serversd.exe 669K
    Qservers.exe较适合发布Q?BR>   
? client~译后生?BR>    client.exe 16K  clientd.exe 97K     clients.exe 124K clientsd.exe 669K
   Qclients.exe较适合发布Q?BR>   
    试 clients 127.0.0.1 1919
        servers 1919


下面是马l达老师写的Q?转自huihoo)

发表于: 3/31/2003 - 04:24
译的一点小东西Q希望能对大家有帮助?BR>其实也不敢称为是译的,水^太烂了,大家就着看吧 Q)

使用Microsoft Visual C++ 在win32q_上生成和安装ACEQ?BR>
注意Q关于MSVC5.0和Service Pack 3的用有一些问题,q去一些用户在sp2中用良好的代码在sp3U却会引发一些问题。感谢Bill 的细心查找,q一秘的问题被解决了。答案?Q哦Q这儿有一个好{案。。。)q可能是因ؓ有多个版本的sp3较早版本的sp3有一些bugQ而后来的版本修正了这些错误,从微软网站上下蝲?998q??6日版本的sp3是一个良好的版本。如果X03-50158是那些拥有sp3的光盘序列号的一部分Q那么这些版本也是良好的。但是不Q何版本的sp3Q其STL的实现都有错误,详细情况h览http://www.dinkumware.com/vc_fixes.html。感谢Ben Eng对这些错误的修正?BR>现在的SP4(希望只有一个版?已经修正了STL中的死锁问题?BR>我们现在不再积极的支持MSVC 4.X以及以前的版本,ACE可和q些~译器一起工作但是可能会丢失一些好处?BR>1. ACE分发包界压羃C个目录中Q这在那个目录中生成一个包含ACE的目录ACE_wrappers。接下来的步骤中假设ACE分发包被解压~到ACE_ROOT=C:\ACE_wrappers中,因此ACE会存在于ACE_ROOT\ace目录中?BR>2. 在ACE_ROOT\ace目录中创Z个文Ӟ命名为config.hQ其内容为:
#include "ace/config-win32.h"
3. 在VC++中加载ACE的工E文ӞACE_ROOT\ace\ace.dswQ?BR>4. 每个工程都会包含多个配置Q这些配|是Debug/Release, MFC/Non-MFCh和Static/Dynamic库版本等选项的؜合。确定你所需要的构?例如Q调试代码需要ACE的调试版?。所有这些不同的配置可以Z提供一些便利,你可以或者采用不同的模式以构造不同配|的应用Q或者通过改变ace\config.h来改变在NT上的不同配置?BR>注意Q如果你使用动态连接,请保证ACE_ROOT\bin被添加到你的path环境变量中,否则你将在运行程序的时候碰到寻找ace.dll或者aced.dll的问题?BR>5. 如果你在Windows NT或者Windows 2k上构建ACEQ你可以马上开始构造她而不需M改变Q如果你在Windows 9x/me上构建,那么你必d
ACE_ROOT\ace\config.h.?include块之前添加一行:
#define ACE_HAS_WINNT4 0
q将在ACE中移掉一些WinNT/Win2K中特有的代码?BR>6. 如果你希望用MSVC自带的标准C++头文ӞC++ Standard Draft 2U定义的iostream,cstdio?.Q?则应该在
ACE_ROOT\ace\config.h.?include块之前添加一行:
#define ACE_HAS_STANDARD_CPP_LIBRARY 1
7. 如果需要和MFC一起用,增加如下定义C的config.h文g中,注意Q如果你想用spawn一个新的线E,则必M证用THR_USE_AFX标志来spawnU程?BR>#define ACE_HAS_MFC 1
~省的,ACE工程使用MSVCq行时的动态DLL版本Q你也可以选择使用ACE的不兛_q行时库的静态(LIBQ版本。我们选择仅与动态运行时库连接的原因在于基本上所有的NT机器上都会安装这些库Q而我们则可以因此而减代码的大小。如果你希望ACE与MFC的静态版本连接,则可以在config.h中定义ACE_USES_STATIC_MFC。然而,如果你希望静态的q接所有的库(包括MSVCq行时库Q,需要自׃改工E文件了?BR>8. 如果要构建ACE的静态版本,则需要在config.h中定义ACE_AS_STATIC_LIBSQ此宏在那些希望使用ACE的静态版本的应用工程中也必须定义?BR>作ؓ一个可选项Q你可以?BR>#include statement in ACE_ROOT\ace\config.h.之前d一行:
#define ACE_NO_INLINE
来取消函数内联从而减静态库Q和你的q行码)的大?BR>9. ACE DLL和LIB库的命名规则Q?BR>我们使用如下的规则明明用MSVC的ACE的DLL和LIB文g?BR>"Library/DLL name" + (是静态库?? "s" : "") + (包含调试信息 ? "d" : "") + {".dll"|".lib"}
在MSVC环境中用ACE的更多信息可以在q里扑ֈ?BR>


-----------------------------------------------------------------------
一、安装TAOQ需要先~译q安装ACE?BR>
二、ACE的编译和安装步骤见http://www.cs.wustl.edu/~schmidt/ACE_wrappers/ACE-INSTALL.html。TAO的编译和安装步骤见http://www.cs.wustl.edu/~schmidt/ACE_wrappers/TAO/TAO-INSTALL.html。如果你英文E度q可以的话,最好直接阅读这两篇文。说到底Q中文文只是“权宜之计”;汉语q不太适合q行逻辑性的表述?BR>
但我q是把其中的一些段落编译如下(VC 6.0 + ACE-5.2.1 + TAO-1.2.1Q:

ACE的编译与安装

一般规?BR>
ACE中的许多Ҏ可以通过?ACE_ROOT/ace/config.h中定义一些宏来进行修攏V这些宏应该L在包括针对你的^台的配置文g之前出现?BR>
但是Q如果你惌取消/重定义在针对特定q_的配|文件中定义的宏Q?undef应该在配|文件之后出现?BR>
如果你计划在多种q_上编译ACEQ你也许需要考虑克隆源码树?BR>
步骤Q?BR>
1. ACE发布文g解压~到某个目录中,在其中将会创建含有所有文件的ACE_wrappers目录。在下面的步骤中QACE_wrappers目录以ACE_ROOT为名来指U?BR>
2. 在ACE_ROOT\ace目录中创Z个名为config.h的文Ӟ在其中包含:

#include “ace/config-win32.h?BR>
3. 现在加蝲ACE的项目文ӞACE_ROOT\ace\ace.dswQ?BR>
4. 其中的每个项目都含有若干不同的配|(可؜合Debug/Release、MFC/Non-MFC、Static/Dynamic library版本Q。你可以从中选择你所需的配|,或是使用ace/config.h来进行调整?BR>注意Q如果你使用动态链接库Q在q行使用ACE的程序时Q确定你在PATH中包括了ACE_ROOT\bin?BR>
5. 如果你的pȝq_是WinNT?000Q那么无需M改动你就可以开始编译了。如果是Windows 9x/MeQ你需要在ACE_ROOT\ace\config.h中的#include语句之前增加Q?BR>
#define ACE_HAS_WINNT4 0

6. 如果你想要用MSVC标准C++_iostream、cstdio……)Q在ACE_ROOT\ace\config.h中的#include语句之前增加Q?BR>
#define ACE_HAS_STANDARD_CPP_LIBRARY 1

7. 要与MFC一起用ACEQ再增加下面的定义:

#define ACE_HAS_MFC 1

注意如果你想要通过CWinThreadz新线E,一定要讄THR_USE_AFX。在~省情况下,所有的ACE目都用DLL版本的MSVCq行时库。尽如此,你仍然可以选择使用staticQLIBQ版本的ACE库。如果你惌MFC作ؓ静态库链接qACEQ你可以在config.h文g中定义ACE_USES_STATIC_MFC。但如果你想要静态链接所有的东西Q包括MSVCq行时库Q,你就需要自׃改ACE的项目文件?BR>
8. ACE的静态版本是通过定义ACE_AS_STATIC_LIBS来编译的。在链接静态ACE库的应用目中也应该使用q个宏?BR>你也可以在config.h文g中增?BR>
#define ACE_NO_INLINE

来取消函数内联ƈ减小静态库Q和你的可执行程序)的大?BR>
9. ACE DLL和LIB的命名方案:

"Library/DLL? + (是否为静态库 ? "s" : "") + (是否启用了Debugging ? "d" : "") + {".dll"|".lib"}

10. 配置完毕后编译即可。选择dll版本Q编译生成的dll文g在ACE_ROOT\bin中,相应的lib文g在ACE_ROOT\ace中?BR>
ACE试

各测试程序在ACE_ROOT\tests中。在其中也有一个工作空间文件可用来~译所有的试E序Qtests.dswQ?BR>一旦你~译了所有测试程序(可用批~译Q,你可以运行tests目录中的perl脚本run_test.pl或批处理文grun_tests.bat来进行所有测试?BR>
TAO的编译与安装

定VC的CL.EXE在你的访问\径上。设|ACE_ROOT或TAO_ROOT环境变量。例如:

set ACE_ROOT=C:\ACE_wrappers

TAO最好放|在ACE_wrappersQ这也是~省情况Q?BR>
1.定ACE已经~译和安装?BR>
2.定ACE_wrappers\bin已在“Tools|Options”中的“Executable Directories”中列出。如果在MSVC下用TAO_IDL~译器就需要进行此讄?BR>
3.加蝲tao\TAO.dswQƈ~译TAO库?BR>
4.要编译Cubit试Q加载performance-tests\Cubit\TAO\IDL_Cubit\IDL_Cubit.dswQƈ~译客户和服务器?BR>
TAOACE.dsw

TAOACE.dsw是一个Visual C++ 5.0/6.0工作I间文gQ它加蝲的项目包括ACE、TAO、TAO_IDLQ编译器Q、gperf、orb服务库,以及一些单独的可执行程序(比如Naming ServiceQ等{)。它可以用于~译所有的用于~译/q行TAO应用的文件?BR>
三、我选择~译的是dll版本QReleaseQ,q在ACE的config.h文g中定义了?define ACE_HAS_STANDARD_CPP_LIBRARY 1”。编译后我所得到的ace.dll的大是1.13MBQ相应的ace.lib的大是1.77MBQTAO.dll的大是1.47MBQ相应的TAO.lib的大是2.74MB。所有文件约?MBQ包括源E序、编译生成的中间文gQ等{,但有些例子及服务我没有编译?BR>
学有所成!

马维?BR>
-------------------------------------
ACE与VC6集成在一?BR>
一.打开 Tools>Options>Directories
加入以下内容:
Executable File:
C:\ACE_wrappers\bin

Include File:
C:\ACE_wrappers\
C:\ACE_wrappers\TAO
C:\ACE_wrappers\TAO\orbsvcs

Library Files:
C:\ACE_wrappers\ace
C:\ACE_wrappers\TAO\tao
C:\ACE_wrappers\TAO\orbsvcs\orbsvcs

Source Files:
C:\ACE_wrappers\ace
C:\ACE_wrappers\TAO\tao
C:\ACE_wrappers\TAO\orbsvcs\orbsvcs

?加入 C:\ACE_wrappers\bin 到系l环境变?path?BR>
?讄pȝ变量
ACE_ROOT=C:\ACE_wrappers
TAO_ROOT=C:\ACE_wrappers\TAO



heart in the world 2006-02-23 19:53 发表评论
]]>
设计不受传统|络限制?P2P pȝhttp://www.shnenglu.com/gnupython/articles/2405.htmlheart in the worldheart in the worldTue, 03 Jan 2006 12:02:00 GMThttp://www.shnenglu.com/gnupython/articles/2405.htmlhttp://www.shnenglu.com/gnupython/comments/2405.htmlhttp://www.shnenglu.com/gnupython/articles/2405.html#Feedback0http://www.shnenglu.com/gnupython/comments/commentRss/2405.htmlhttp://www.shnenglu.com/gnupython/services/trackbacks/2405.html声明一下:在reprinting栏目中的文章完全是{载,来自互联|,本h完全是学习之用,如果Q{载R犯了您的版权Q请l我联系一下,我会作相应处理。Email:gaoyuanxue118@gmail.com
设计不受传统|络限制?P2P pȝ

随着Ud计算的普及和嵌入式可联网微处理器的无处不在的应用QTCP/IP l于N出它已经昑־q时。设?Jxta 的初衷就是要H破当今Z TCP/IP 的网l的限制Q从而扩展因特网所能触及的范围。在 developerWorks 的讨?Jxta 的系列的q最后一文章中QSing Li 举例说明了体现这U扩展的pȝQƈ解决了一个实际问题。您看?Jxta 不受客户机/服务器网l的典型U束的限制。请单击本文剙或底部的讨论Q在讨论论坛与作者及其他读者共享关于本文的心得?br>
到本pd文章? q里为止Q我们仔l考察?JxtaQ一?Java 参考实现的?P2P q_Q是如何工作的。在W一部分中,我们了解?Jxta 的互操作特征。Jxta 被定义ؓ一l互操作协议Q可以跨gq_、操作系l和~程语言实现。我们也讨论?Jxta 的操作模型和包括对等机、对{组、服务和道在内的许多重要概c在W二部分中,我们的着眼点是徏立和q行 Jxta。我们探讨了一?Jxta 应用E序 ?Jxta shell ?q经历了创徏道q从一个对{机发送消息到另一个对{机的情形。在我们~写 Jxta shell 扩展Ӟ我们W一ơ获得了?Jxta API ~程的经验。迄今ؓ止,我们讨论 Jxta 的方式都是从下到上的。对于像我们q样hpȝ~程和网l工E背景的人来_q是再自然不q的?br>
在本pd的这W三也x后一文章中Q我们要把事情颠倒过来。从那些从事应用U设计和体系l构的h的角度来_本文是自上而下看待 Jxta 的。我们从一个特定的CZ问题开始,对这个问题进行分析ƈ设计Z个解x案,从而展C?Jxta 是如何自然地解决该问题的?br>
随着本文的进行,我们讨论 Jxta 如何通过q列QjuxtapositionQ改变联|的前景展望Q我们还提供一?Jxta 服务和客h的设计和代码?br>
解决一个分布式数据攉问题
? 想一下我们需要创Z个大规模的气象数据收集和分析pȝ。在q个pȝ中,我们有数百个气象数据攉点;每个攉炚w备一个微型气象站Q这些气象站当前温 度(和其它大气状态)提供l一l数据集中器。收集器遍布世界各地Q这些收集器q不是都直接q接到因特网QQ何时候都可能有新的数据收集器q接上来或脱开q? 接。在q个目中,参与q来的收集器的确切数量经常在变化Q数据分析和处理Z区域q_倹{?

开始时只有 10 个集中器。每个集中器监视来自许多个收集器的数据,q些数据被实时提供给关系数据库。随后,来自关系数据库的数据被提供给q行气象分析和预的仿真模型? 计算机ƈ由它处理。集中器的数量和位置会发生变化,但它们的行ؓ则大多更E_。一旦安装后Q集中器׃保持q{Q除非碰到系l失效?

我们必须解决的问题:我们的系l如何能够持l运转,q能考虑到在几乎不媄响整体性能的条件下Q允许动态添加或除去攉器和集中器?br>
初始分析Q特定网l的复杂?br>p? l中的某些收集器可直接访问因特网Q其它的通过无线电传输技术进行连接,它们处在恶劣的外部环境中。事实上Q在q些Z无线늚攉器中Q许多都被设计成 了节能的Q以廉甉|寿命Q收集器的有效范围仅够与下一个最q的攉器或基站联系。这些收集器中许多都不支? TCP/IPQ而是使用基本的分l无U技术。一些更独立的收集器仅仅靠其太阳能电池板获得能量Qƈ使用卫星传输q行通信。还有另外一些收集器则连接到标准 蜂窝电话上,?SMSQshort message serviceQ短消息服务Q消息传递来发送消息?

在项目的整个生命周期中, 可用的收集器的数量会发生变化Q在目开始时Q我们无法预将会构建到未来攉器中的连接类型,也无法预收集器用的技术。例如,在项目的某个阶段Q? 在一个超U计机集内用Y件仿真来仿真数量巨大的收集器。我们的解决Ҏ必须能适应所有收集器Q不是真正的还是仿真的Q现在的q是来的?

解决ҎQƈ列(JuxtapositionQ?br>?1 昄用来解决q个问题的高层次设计?

?1. 解决数据攉问题

image? 注意Qƈ?P2P |络用来适应|络的多U不同情况,而集中器提供 P2P |络和传l的客户机/服务器网l之间的q接Q数据库服务器和计算机驻留在客户机/服务器网l。集中器充当两个|络之间的网??每个集中器在 P2P |络上具有动态特性,在客hQ服务器|络h静态特性?

q个体系l构反映?Jxta 对传l系l的补充作用和提供ƈ行于q些传统pȝ的增值的能力 ?通过q列QjuxtapositionQ,Jxta 的名U就源于q个词语?

我们不想深入讨论q里的客hQ服务器|络的细节,因ؓ其中q没有什么独特之处;我们甚至可以使用 VPN 技术在因特|上q行它。有的部分?P2P |络。图 2 昄了它的组成,它可随将来的变化而变化。请注意其中用到的多U不同技术?

?2. 数据攉器网l的l成


image在实现这?P2P |络Ӟ我们可以利用 JxtaQ从而获得以下优点:

Ҏ地添加或除去新的攉器或集中器,q得益于 Jxta 的统一分散d


设计单性,q得益于 Jxta 的网l虚拟化


持箋q{Q这得益?Jxta 支持故障Ҏ?br>

免维护运转,q得益于 Jxta 支持动态自我组l网l?br>

支持跨越许多gq_和编E语a的多U不同实玎ͼ支持所用的各种不同通信协议
让我们来更详l地研究一下其中几个益处,q看?Jxta 如何Zpȝ构的各个斚w作出独特的A献?br>
l一分散d
l一分散d的字面意思是Q对{机可以q成一?ID q立卛_入到|络Q而不必与M注册人或中央认证机构联系Q而当今的 DNS 则必这栗这一特征使我们Q何时候都可以向网l添加收集器和集中器?

? 本文附带的代码包中(您可以从参考资料下载它Q,我们提供了名?mdidgen 的实用程序,它可以用来ؓ新的 Jxta 服务和管道生成地址。(要更多了?mdidgenQ请参阅旁注 mdidgen 实用E序。)您可以阅Lpd的第一文章,了解 Jxta ID 是如何用来对 Jxta 对象Q例如:对等机、对{组、服务和道Q进行统一d的?

h意,Jxta |络中的对等Z一定要有一个独立的物理存在。在我们的示例中Q我们用一个超U计机集来仿真数量巨大的攉器,每个攉器有它自ql一地址。这些仿 真收集器的每一个在 P2P |络的其它部分看来都是一个与那些h物理存在的对{机没有什么差别的对等机?

|络虚拟?br>通过分散d为所有收集器和集中器赋予|络中唯一的标识后Q它们立卛_成ؓ|络中的对等机ƈ开始彼此通信。尽它们可能通过许多U不同的消息传递机制进行相互联p,但在 Jxta U别上,它们都只是一个虚拟网状网l中的节点,如图 3 所C?

?3. |络虚拟?br>

image? 注意Q将攉器和对等机实际相互连接v来的所有不同的传输和寻址模式都被虚拟化了Q只留下一个网状网l,其中的每个对{机都与其它每一个对{机相连接? Jxta 通过使用l一d模式和极q绑定(very late bindingQ,在多个端点协议上d一个智能消息\由层做到q一炏V从本质上说Q每一个端点协议或传输协议栈都成ؓ虚拟 Jxta |络的一个驱动程序,虚拟网l映到物理|络上。图 4 昄了这U设|?

?4. 端点协议作ؓ驱动E序


image? 信协议要成ؓ合格的端点协议,只需要它能够在两个物理节点之间发送或接收 XML 消息。对传输可靠性或消息q播支持没有什么要求。因而,最单的分组无线协议也可以用作端点协议驱动程序,与像 TCP/IP q样的复杂多层协议ƈ列。这也解释了Z?HTTP ?TCP/IP ?Jxta 协议栈内都是同一U别的端点协议,管它们的物理别非怸同。HTTP 是一个受支持的端点协议,因ؓ只要有必要,它就能够I越可能多的防火墙Q从而获取从一?Jxta 对等Z送到另一个的消息?

Jxta |络中的每个对等机可以同时支持多个端点协议,Jxta 虚拟|络机制会以一U尽可能q的方式虚拟化的统一|络地址映射到物理网l地址Q在 Jxta 中称为网l端点)。从本质上说Q一个对{机对应于一l物理端点,其中的每个物理端点可以在完全不同的物理通信协议上实现。较高别的虚拟化和路由服务隐藏 了这一炏V许多h或许能看是多协议\由器的一个非帔RU的形式 ? 正是q相同的讑֤使当今的因特|成为现实。这一概念的发展将把我们带向一个更加普遍的因特|,q是再自然不q的了?

让我们更详细地研I一下图 5 所C的CZ。对{机 A 是网l中的一个收集器Q它试图通过一pd中介攉器(对等?B、C ?DQ将其数据发送到集中器(对等?EQ。在图中每个对等机的下面是该对等机所支持的一l协议?

?5. Jxta 路由CZ


image因ؓ对等?A 不直接连接到对等?EQ所以它的消息必通过中介对等?B、C ?D q行路由。Jxta 自动对消息q行路由Q?

使用 TCP/IP 从对{机 A 到对{机 B


使用分组无线协议从对{机 B 到对{机 C


使用 SMS 从对{机 C 到对{机 D


使用 HTTP 从对{机 D 到对{机 E
? {机 E 在它创建的道上接收来自对{机 A 的消息,完全未觉?Jxta 为它所执行的复杂工作。请注意Q对{机 C 到对{机 D 的\径是非对U的QJxta 是专门设计来处理这U状늚。如果有条消息要从对{机 E 发送回对等?AQ则 Jxta 用拨可制解调器 PPP 自动C对等?D 路由到对{机 C?

故障Ҏ?br>管上面所描述的\由功能已lo人非常惊奇,但更为重要的是, Jxta 必须能够适合 P2P |络不断变化的拓扑结构。特别是它必能够处理充当消息\׃理的 P2P 对等Z生俱来的不可靠性。在我们的例子中Q如果中l收集器不可用,那么Q依赖另一个收集器来\由它的消息的攉器将不能q行通信?

? 有对{机加入或离开|络ӞJxta 要能够实时对消息q行重\由。再考虑一下图 5 中的路由CZ。请设想一下,׃某些原因Q就在对{机 A 已经发送出消息Q现在正在传输)而尚未到辑֯{机 C Ӟ对等?C 和对{机 D 之间的卫星链路却断了。Jxta 必须能够动态地通过某些替代路径Q可能是通过另一l中间节点)该消息重\由到对等? E。这U动态重路由是基于最大努力(best-effortQ完成的Q偶而有q样的情况,如果没有可能的\由(除非中介传输支持持久队列Q,则消息可能会 被丢失。由于这U重路由能够Ҏ实际用来到达对等?E 的端点协议(例如Q从 HTTP ? TCP/IPQ,所以,要一直达到\q最后一个蟩数时Q对{机到物理端点的l定才会发生。这是 Jxta 的极q绑定的本质?

在对{组U别上(请参阅本pd的第一文章了解有兛_{组的更多知识)QJxta 通过支持对等l服??在对{组内L可用的、冗余地实现的服??支持故障Ҏ?

动态自我组l网l?br>当具有统一虚拟|络 ID 的对{机插入?Jxta |络中时Q它必须q样来自我引|

定位本地对等机ƈ发现它们的功?br>

发现可用的对{组q加入其中一?br>

发现对等l中可用的服务ƈ开始用它?br>? 们从本系列的W二文章中了解刎ͼq一切都是在消息U别上通过发布、中l、中介高速缓存和搜烦UCؓq告的不同类型的消息完成的。Jxta ?Java 参考实现有一个解析器和发布-高速缓?搜烦Qpublish-cache-searchQ过E简便的集中服务层?

Jxta 中的对等l的作用是作为网l分区(network-partitioningQ机Ӟ保q告只被中到能够用这些广告的l成员。不同的对等l可以包含对{机和对{组服务的不同组合,充当功能性的捆束机制。对{组也可以v到特定应用程序的认证域的作用?

mdidgen 实用E序


? 用类 com.ibm.jxta.mdidgen 可以用来以分散方式ؓ Jxta 对象生成l一地址。它生成一个新? ModuleClassID、一个相应的 ModuleSpecID 和一个与某个l(在启动时被读取的配置文g中指定)兌的新 PipeID。所生成的这?ID 是立卛_以用的 Java 声明形式Qƈ且立卛_以插入到您的代码中。这是我们? ModuleSpecAdvertisement 和集中器服务道生成 ID 的方式?br>
设计 Jxta 服务?Jxta 客户?br>让我们回到气象站CZ上来。从概念上说Q集中器实现必须Q?br>
dq处理适当的配|文Ӟq个文g告诉集中器加入到哪个 Jxta l。(h代码包中包含有我们示例的配置文g。)


启动 Jxta?br>

加入到配|文件所指定的组?br>

q行搜烦Q以判断集中器服务的服务q告是否存在Q如果不存在Q就创徏一个ƈ发布它?br>

创徏一条相应于该服务的输入道?br>

在管道等待来自收集器的消息?br>

一旦消息到达,处理它q存储到 RDBMS 中?br>

回到W?6 步?br>q个逻辑?com.ibm.jxta.Concentrator cM实现。您可以从参考资料部分下载这个类及所有来自本文的代码?

攉器实现必:

dq处理上q配|文件?br>

启动 Jxta?br>

加入到配|文件所指定的组?br>

发现集中器服务的服务q告Q如果服务广告不可用Q我们就无法l箋?br>

从服务广告抽取管道信息?br>

每隔一D|间收集数据?br>

创徏包含攉器位|和数据的消息?br>

通过道消息发送到集中器服务?br>

回到W?6 步?br>上述逻辑?com.ibm.jxta.Collector cM实现?

公׃Q务分解到 DwJxtaPeer 类
有很多Q务对攉器和集中器角色都是公q。ؓ了消除不必要的代码重复ƈ使将来的l护更简单,让我们把q些公共d分解出来攑օ名ؓ com.ibm.jxta.DWJxtaPeer 的超cR?

其中一个公׃Q务是执行 ModuleSpecAdvertisement 的发玎ͼ请参阅旁?JXTA 中的服务q告了解关于q个q告的更多知识)。这由清?1 中的 findModuleSpecAdv() Ҏ执行Q?

清单 1. findModuleSpecAdv()
protected ModuleSpecAdvertisement findModuleSpecAdv() {
return (ModuleSpecAdvertisement) findAdv("ModuleSpecAdvertisement",
"Name",ModuleSpecName, new ModuleSpecAdvValidator(), false );
}



h意,findModuleSpecAdv() 调用另一个名?findAdv() 的通用ҎQ我们用q个Ҏ发现q告。findAdv() 的参数是Q?

参数 描述
AdvType q告cd的字W串描述 ?例如QPipeAdvertisement?
Attr 搜烦q告时要匚w的标??例如QName?
Value 与所指定的属性匹配的倹{?
Validator 一个实?FindValidate 接口的对象。这个接口有一个方?checkAdv()Q当扑ֈ一条广告时Q这个方法就被用来立卛_q条q告q行验证?
LocalOnly 一个布标志,表明该发现是否只应在本地执行Q还是跨|络在远E执行?

如清?2 所C,该方法的W一部分通过使用l的发现服务?getLocalAdvertisement() ҎQ仅Ҏ本地q告高速缓存执行对q告的发现。请注意?validator.checkAdv() 调用Q用来对所扑ֈ的Q何广告进行验证?

清单 2. findAdv()Q第 1 部分
protected Advertisement findAdv(String advType, String attr, String val,
FindValidate validator, boolean localOnly) {
Enumeration enum = null;
System.out.println("Looking for " + advType + ", please wait...");
// First look in the local storage
try {
enum = discovery.getLocalAdvertisements(DiscoveryService.ADV,
attr, val);

} catch (Exception e) {
}



if ((enum != null) && (enum.hasMoreElements())) {
Advertisement adv = null;
while (enum.hasMoreElements()) {
try {
adv = (Advertisement) enum.nextElement();
if( validator.checkAdv(adv))
return adv;
} catch(Exception e) {
continue;
}
} // while
} // if



如果该发现是本地的,则逻辑在q里停止。否则,我们发送一条查询到|络Q执行远E发现。发现服务将把所扑ֈ的Q何广告都存储到本地高速缓存。我们只要给Ҏ间就可以让远E发现发生。在清单 3 中,循环大约持箋了五U钟Q?

清单 3. findAdv()Q第 2 部分
if (localOnly)
return null;

System.out.println(" cannot find it locally, trying remote");
// Now, search remote
discovery.getRemoteAdvertisements(null, DiscoveryService.ADV,
attr, val, 2, null);

// Wait a bit in order to get an answer.
int i=0;
while (true) {
try {
if (i>MAXRETRIES){
System.out.print(".");
break;
}
Thread.sleep(WaitingTime);
i++;
} catch (Exception e) {
}
System.out.println("");



此时Q已发现的Q何广告都应可在本地高速缓存中扑ֈ。在清单 4 中,我们再次执行一个本地检查?

清单 4. findadv()Q第 3 部分
// Look in the local storage again
try {
enum = discovery.getLocalAdvertisements(DiscoveryService.ADV,
attr, val);

if ((enum != null) && (enum.hasMoreElements())) {
Advertisement adv = null;

while (enum.hasMoreElements()) {
try {
adv = (Advertisement) enum.nextElement();
if( validator.checkAdv(adv))
return adv;
} catch(Exception e) {
continue;
}
} // while
}
} catch (Exception e) {
}
}
return null;
}



类中的另两个公共方法的描述在下表中Q您可以作ؓl习完成对它们的分析?

Ҏ 描述
PublishModuleSpecAdv() 如果发现q程没有为服务找到现有的 ModuleSpecAdvertsiementQ则q个Ҏ被集中器调用。这个方法将创徏一个服务(Ҏ我们所生成的、固定的服务 IDQ。这条广告将在本地和q程发布。仅在集中器W一ơ启动时Q当配置改变Ӟ或者在本地高速缓存被清除后,才有创徏q告的必要?
JoinGroupIfExists() q个Ҏ为收集器和集中器所调用Q它试加入C个已命名的子l(subgroupQ,q个子组是全局 NetPeerGroupQ缺省情况下大家都在q个l)的子QchildQ组?

L一下清?5Q它?DwJxtaPeer cȝ常数声明部分的一部分Q?

清单 5. 模块 ID 定义
public static final String ClassID =
"urn:jxta:uuid-EE99266A1DE84E3DB34D9CC842EC889105";
public static final String SpecID =
"urn:jxta:uuid-EE99266A1DE84E3DB34D9CC842EC8891B9EB13ECA6FE44DDA112B5F5E357763006";


Jxta 中的服务q告


服务q告概念分解成一l相互联pȝq告Q共三条Q:
ModuleClassAdvertiseent
ModuleSpecAdvertisement
MdouleImplAdvertisement

Z减小在系l中循环的广告的大小Q也Z服务的通用c(例如Q银行)、该cȝ特定规范Q例如:存款和提?APIQ和该服务(例如QAPI Z Java 的实玎ͼ的实C间的关系规格化,q样做都是必要的?

应用E序?Jxta 服务不必使用所有这些广告,只要使用它所需要的p了。在我们的系l中Q我们只需要ModuleSpecAdvertisementQ我们用它将服务q到道上,qɘq条q告是远E可发现的?

ModuleClassID ?ModuleSpecID ?mdidgen 实用E序生成q以编码方式置于模块中Q它们与一个集中器服务?ID 相对应。所有的集中器都知道q个服务?IDQ而且q个 ID 一旦生成就一直保持不变,所以组中的攉器肯定能够找到这个集中器服务。因为生? ModuleSpecID 旉?ModuleClassIDQ所以这里有 ModuleClassID。ؓ了轻杄成这?IDQ我们用一个名? AdvCooker 的库Q它?W.R. BauerQvasha@jxta.orgQ创建的名ؓ jxta-wire ?Jxta 目的一部分?

|络中运行的所有集中器实例对同一个集中器对等l服务(通过使用相同?ModuleSpecID 和侦听广播管道的同一个逻辑实例Q作出应{。这U冗余实现将保集中器服务在对等l中始终可用?

集中器:一?Jxta 对等l服?br>我们来看一?com.ibm.jxta.Concentrator 实现。我们已l提到过Q它l承Q扩展)?DwJxtaPeer cR这里是逐个Ҏ地对 Concentrator q行的描qͼ

Ҏ 描述
init() 它应该是该类被调用的W一个方法。这个方法调用私?jxtaInit() ҎQ然后创入集中器服务道的一个实例?
process() q个Ҏq入一个无限@环。它在输入集中器服务道上侦听传入的攉器数据提交。对每一个提交,它都调用 processData() Ҏ据进行处理?
findPipeAdv() q个ҎҎ务管道广告执行本地发玎ͼ也就是说Q它查本地高速缓存)?
jxtaInit() q个Ҏ首先d配置文gq设定我们想要加入到的组。接着Q它启动 Jxta ?NetPeerGroup |络Q然后调用超cȝ joinGroupIfExist() 加入到指定的l。接着Q如果能够,它就从本地高速缓存检索服务管道广告;否则Q它创Z个新的服务管道广告(通过使用 createInputPipeAdvIfNotExist()Q。最后,它执行发玎ͼ看看是否可以扑ֈ ModuleSpecAdvertisementQ如果不能找刎ͼ它就创徏一个ƈ发布它?
processData() q个Ҏ是占位符。在实际的项目中Q它用后端客hQ服务器|络所攉到的数据提交l?RDBMSQ可能?JDBCQ?
createInputPipeAdvIfNotExist() q个助手Ҏ首先查高速缓存,看看服务道q告是否可用。如果不可用Q它创q告q将它存储到高速缓存中。在MU情况下都返回正的q告?

静态类型定义如下:


public static String servicePipeID =
"urn:jxta:uuid-969610EE8945417CA56F9771197EE3965207E4C303154E7EB5878751AE22761804";




q? 是由 mdidgen 实用E序生成的管? ID。它是该服务道的统一地址Q被所有集中器使用。它是一条广播管道,因而侦听消息的所有集中器都应接收到那些来自收集器的消息。收集器从作? ModuleSpecAdvertisement 的一部分的管道广告中获得q个道 IDQ收集器通过发现q程扑ֈ该广告?

攉器:~写 Jxta 客户机逻辑的代?br>最后,我们来看一?com.ibm.jxta.Collector cȝ本地Ҏ?

Ҏ 描述
init() 它应该是从这个类中调用的W一个方法。这个方法调用私?jxtaInit()Q然后创建用来将所攉到的数据发送到集中器服务的输出道?
process() q个Ҏ有一个无限@环,q个循环首先调用 collectData() 获得量的数据,接着Q创Z?Jxta 消息q沿集中器服务管道将它发送到正在{待的集中器。@环内每次采样都gq一D固定时间?
jxtaInit() q个Ҏ首先d配置文gq对我们惌加入到的l进行设|,接着定攉器的位置。接着Q它启动 Jxta ?NetPeerGroup |络Q然后调用超cȝ joinGroupIfExist() 加入到指定的l。接着Q它执行发现Q看看是否可以找到相应于众所周知的集中器服务? ModuleSpecAdvertisementQ如果找不到Q则退出。一旦找C ModuleSpecAdvertismentQ它将抽取集中器服务管道广告ƈ出管道的创徏做好准备?
collectData() q个Ҏ是一个占位符Q用于实际的数据攉。在实际的项目中Q这个方法将讉K各种数据输入通道Q可能用输入/输出端口或本Z码)q将所攉到的数据q回l调用者?

实际q{ JxtaQ在您自q机器上测试这个动态网l?br>本文附带的源代码包中有一个便于您实验的目录结构。下面的目录?code 子目录下Q?

目录 描述
lib 来自 Jxta 核心最新稳定版的所?jar 文gQ用?Jxta shell 的所?jar 文g以及来自 jxta-wire 目? jxta-wire.jar 文g都放在这里。(请参阅参考资料了解关?Jxta shell ?jxta-wire 的更多信息。)
src 包含我们pȝ的源代码?
classes 包含我们pȝ的编译好的类文g?
shell1 W一个实验目录。我们将在这个目录创Z个带有一个集中器?shell。我们还在q里充分考查 mdidgen 实用E序?
shell2 讄为网l中的第二个对等机。这运行另一个集中器?
shell3 讄为网l中的第三个对等机。这运行一个收集器?

要编译这些代码,您需要安?JDK 1.3 或更新版本。在 code 目录Ӟ执行 MAKEIT.BAT 批处理文件。这编译代码ƈ?classes 目录中创建类文g?

接着Q运?MAKEJAR.BAT 批处理文件。这创Z个包含所有代码的 dwjxta.jar 文gQ将它放?lib 目录Qؓ实验做好准备?

现在Q请启动三个不同的命令窗口。将它们的目录分别改?shell1、shell2 ?shell3?

?shell1 目录中编?runshell.bat 文gQ将您在配置期间用来讄安全性的用户标识和密码反映出来(密码必须臛_八个字符长)。编?runconc.bat ?mdidgen.bat 文gQ同栯有这个用h识和密码?

使用 runshell.bat q行q个 shellQƈ按以下所C配|这个对{机Q?

对等机名Q?node1
传输Q?TCP/IP 启用QHTTP 用Q选中作ؓ集中点,无中l?
所?TCP 端口Q?9701
安全性用户名和密码: 如在批处理文件中所定制

因ؓ我们的系l假讑ַl创Z一个用于操作的l,所以我们需要在?shell 中创个组。在q个 shell 中时Q用以下命令创?dwtest l:


Jxta> myadv = mkadv -g dwtest
Jxta> mygrp = mkpgrp -d myadv dwtest



q将创徏我们用的 dwtest l。您可以q样来确认它已经被创建:


Jxta>groups
group0: name = dwtest



现在您可以退 shell?

现在Q请使用 mdidgen.bat 文g试验l一地址QIDQ的分散生成。当您运行这个文件时Q应得到cMq样的输出:

清单 6. mdidgen.bat 的输?
remote group discovery message sent
group joined successfully
public static final String ClassID =
"urn:jxta:uuid-DCDD418FCC194040AA13A52A334B967105";
public static final String SpecID =
"urn:jxta:uuid-DCDD418FCC194040AA13A52A334B96716C515B975C2941AD9FBC90178B6918A806";
public static final String PipeID =
"urn:jxta:uuid-2184CACA259B42E0A866AEA788A923054C519D304E07415195B0917C81238FD004";



h意所生成?ModuleClassID、ModuleSpecID ?PipeID。这是我们获得在集中器服务用到?ID 的办法?

通过执行 runconc.bat 文g启动集中器。这读?dwConfig 文gQ这个文件告诉集中器加入?dwtest l。您的输出应与此有些怼Q?

清单 7. 1 号集中器Qrunconc.batQ的输出
Starting Jxta...
Joining default NetPeerGroup...
Attempting to join group: dwtest
remote group discovery message sent
group joined successfully
group dwtest joined successfully
Look for previously created Pipe Adv, create one if not exist
Looking for PipeAdvertisement, please wait...
Previously published pipe advertisement not found, creating a new one.
Locally caching the new pipe advertisement...
Checking to see if MSA previously published...
Looking for ModuleSpecAdvertisement, please wait...
cannot find it locally, trying remote
... MSA not found, need to create it
Creating new MSA
Locally and remotely publish the MSA
Creating pipe for data collection...
pipe created successfully
Waiting for data from collector...



到这里,集中器实例就建立好了Qƈ且ؓ接收来自攉器的数据做好了准备?

现在Q到 shell2 命oH口中编?runconc.bat 文gQ将您的安全性用h识和密码反映出来。接着Q?runconc.bat 文gq行集中器实例。在配置q程中设|以下参敎ͼ

对等机名Q?node2
传输Q?TCP/IP 启用QHTTP 用Q无集中点,无中l?
所?TCP 端口Q?9702
安全性用户名和密码: 如在批处理文件中所定制

如果一切都正确q行Q则您应看到与此怼的输出:

清单 8. 2 号集中器Q来?Shell2 ?runconc.bat 输出Q?
Starting Jxta...
Joining default NetPeerGroup...
Attempting to join group: dwtest
remote group discovery message sent
group joined successfully
group dwtest joined successfully
Look for previously created Pipe Adv, create one if not exist
Looking for PipeAdvertisement, please wait...
Checking to see if MSA previously published...
Looking for ModuleSpecAdvertisement, please wait...
.. found previously published MSA
Creating pipe for data collection...
pipe created successfully
Waiting for data from collector...



h意,集中器的 ModuleSpecAdvertisement 被找CQ所以这个集中器实例不必另外创徏一?ModuleSpecAdvertisement。现在它也在{待来自攉器的输入?

最 后,?shell3 命oH口中编?runcoll.bat 文gQ将您的安全性用h识和密码反映出来。接着Q?runcoll.bat 文gq行攉器实例。这个实例将使用 shell3 目录中的 dwColConfig 文gQ该文g告诉攉器应加入?dwtest l,q个l的位置是“Timbuktu North”。在配置q程中设|以下参敎ͼ

对等机名Q?node3
传输Q?TCP/IP 启用QHTTP 用Q无集中点,无中l?
所?TCP 端口Q?9703
安全性用户名和密码: 如在批处理文件中所定制

q个攉器实例将开始查?ModuleSpecAdvertisement q且应该能找到。然后,它将创徏一条管道与已经q行的集中器通信。您应看C此相似的输出Q?

清单 9. 攉器(来自 Shell3 ?runcoll.bat 的输出)
Reading config file, dwColConfig, and processing...
group to join will be dwtest
collector location is Timbuktu North
Starting Jxta...
Joining default NetPeerGroup...
Attempting to join group: dwtest
remote group discovery message sent
group joined successfully
group dwtest joined successfully
Searching for collector's MSA...
Looking for ModuleSpecAdvertisement, please wait...
cannot find it locally, trying remote
.. found collector's MSA
Extracting pipe adv from MSA...
Connecting to concentrator network...
pipe created successfully
... collecting data....
... data collected, sending to concentrator
waiting until next sample...
... collecting data....
... data collected, sending to concentrator
waiting until next sample...



h意,数据被收集v来ƈ定期发送到集中器服务。当数据I过 P2P |络以及两个集中器接收这些数据ƈq行处理Ӟh意观察?

高难度的应用模式
? 们的气象攉CZ说明了这样一个应用模式:在一般的斚wQ它使用普遍行的应?P2P pȝQ从特定的方面,它? Jxta。这个模式包含两个耦合极其松散的群体:消费者和生者。当消费者想要生产者所生的品时Q消费者不愿作出坚定的许诺Q也不愿受限于特定生? 者。在q种x背后可能有几个现实动机。消费者可能想Q?

可以在Q意时间进行选择Q以选择最佳的可用生?br>

降低Ҏ个生产者的成功或失败的依赖风险


从非常庞大的动态社Z选择Q这U社区的大小和拓扑结构在物理上是难于理?br>? 消费者群体和生者群体出Cq时Q这U模式变得十分有,当前可用的、流行的、世界范围内的文件共享系l就例证了这一炏V与传统的联|技术不同,P2P pȝ从一开始就是设计来适应q种应用模式的。特别地Q与使用传统的客hQ服务器技术进行设计时Q必L供的复杂的解x案不同,Jxta 使得创徏q些pȝ既容易又L?

越 TCP/IP 的联|?br>Z真正H出 Jxta 带来的h|我选择了全球气象信息收集系l作Z个示例。然而,q个问题及解x案具有许多业务模式(business scenarioQ的典型特征Q这些业务情形如Ud销售队伍自动化、商品N易、内容分发和企业C业电子商务等{,可以列出很多。您可以同时使用 P2P |络和传l的客户机/服务器网l,从而构建大大超出当今静态边界的新型|络解决Ҏ。开放源代码?Jxta q_是q些新型解决Ҏ的实现工兗我希望本系列已l激h探烦 Jxta 提供的可能性的愿望?

from-ibm developer



heart in the world 2006-01-03 20:02 发表评论
]]>
Ʒþþþù| þþƷˬ97 | Ʒһþ㽶߿| þþƷþһ| Ʒþþþþ| Ʒþһ| AVþþþò| ŷ޷avþò| vaþþþ| Ʒþþþþ| þþþþþòҰ¸߳| ձɫվWWWþ | þþþAVȥ| ƷþþþþĻ| 91þ㽶Ů߿| ˾Ʒþۺ| Ʒ˾þþþӰԺ| Ʒպҹþ| ĻhdþþƷ | ŷ޹Ʒþ| þþ뾫Ʒպ˳| ۺϾþþƷɫ| ĻþòҰav| ޾Ʒһþ| ޹ŷۺϾþ| 2022Ʒþþþ| ɫۺϾþ| AVӰƬþþþþ| պݺݾþ͵͵ɫۺ| ƷþþþaӰԺ| ޾Ʒרþþ| þùƷһ| Ʒþþþþۺձ| þþƷƷ| þþ뾫Ʒպ˳| þþƷɧ| Ʒþþþþþþþ | 7777þĻ| þþWWW˳ɾƷ| ޹ŷۺ997þ| Ʒŷ޺ձþ|