??xml version="1.0" encoding="utf-8" standalone="yes"?>国产欧美日韩综合一区在线播放,美女视频一区免费观看,欧美在线观看日本一区http://www.shnenglu.com/eXile/archive/2010/01/11/105422.htmleXileeXileMon, 11 Jan 2010 11:48:00 GMThttp://www.shnenglu.com/eXile/archive/2010/01/11/105422.htmlhttp://www.shnenglu.com/eXile/comments/105422.htmlhttp://www.shnenglu.com/eXile/archive/2010/01/11/105422.html#Feedback11http://www.shnenglu.com/eXile/comments/commentRss/105422.htmlhttp://www.shnenglu.com/eXile/services/trackbacks/105422.html     1.什么是Go语言

    Go语言是Google推出的新的一个致力于pȝU的~程语言。很多h说它?C + PythonQ既有c的灵z高效,又有Python的简单易用,它的原则?Simple && Fast。它的语法规则很单。其官方|站上有一个《三天学会Go语言》的教程Q包括三部分Q基本结构,面向对象Qƈ发。一个周末的旉差不多可以掌握其基本面貌。相Ҏ_W三部分“q发”g难接受一些。但是如果你对多U程Q同步,消息队列q些东西很有l验的话Q对它的概念也会Ҏ理解?br>
     2.Go语言的面向对?/span>

     Go语言在C语言语法的基上,以最z的形式加入了面向对象?br>    关于l承QGo语言没有l承。但是它支持嵌入Q这个有点类g其它语言的mixinQ可以用来模拟ѝ?br>    关于多态:Go 语言的最大特Ҏ它的接口定义。所?#8220;接口”Q就是一l方法的集合。Q何一个类只要实现了一个接口的所有方法,则是该接口的实现者,不需要显式声明实现该接口。所以一个没有Q何方法的I接口可以代表Q何类型?br style="FONT-WEIGHT: bold">   
     3.Go语言的ƈ?/span>

     Go语言提出一个新的概念—Go例程Q有点类gU程Q但是更加轻量,更省资源。Go例程之间的通信方式 ——信道,q是GO 语言的核心概念,有点cM于UNIX的Pipe。在Go语言中,不需要接触线E,锁这些低阶概c?br>
     4.Go语言可以用来做什?/span>

     Go语言目前最强的是它的网l功能。它的package中已l实C最常见的网l协议和~码处理。Go的官方网站用的是Go语言Q实际上它就是Go的文系lgodoc?br>      q没有官方对数据库支持,不过因ؓ通过某种办法可以在Go语言中直接调用C函数Q所以很Ҏ的实现对MYSQL 或?Sqlite q些数据库的支持?br>      至于GUIQ这估计目前q不在设计者的考虑范围之内Q因Z们连Windows都不舍得支持。不q可以通过它的http包和template包等{,已经构成了一个WEB框架Q可以用来实现WEB GUI的开发,使用Go写一个带有\径分zHttp服务器也几行代码的事?br>    




eXile 2010-01-11 19:48 发表评论
]]>
[T] ICE实例学习QLet's Chat! (2) 实现服务?/title><link>http://www.shnenglu.com/eXile/archive/2009/03/26/77897.html</link><dc:creator>eXile</dc:creator><author>eXile</author><pubDate>Wed, 25 Mar 2009 16:54:00 GMT</pubDate><guid>http://www.shnenglu.com/eXile/archive/2009/03/26/77897.html</guid><wfw:comment>http://www.shnenglu.com/eXile/comments/77897.html</wfw:comment><comments>http://www.shnenglu.com/eXile/archive/2009/03/26/77897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/eXile/comments/commentRss/77897.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/eXile/services/trackbacks/77897.html</trackback:ping><description><![CDATA[<br><span style="FONT-SIZE: 18pt"><strong>服务器实玎ͼ</strong></span><br><br>       服务器用C++。注意它的结构:c?ChatRoom 实现了大部分的应用逻辑。ؓ了支持推模型与拉模型Q服务器实现了类ChatSession 和类 PollingChatSession?ChatRoom 调用 ChatRoomCallbackAdapter 对象?send 函数来传递客h息,该对象隐藏了两种模型之间的差异?br><br>ChatRoom 实现Q?br><br>      ChatRoom是一个普通的C++对象Q而不是一个Servant.<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> C++ </span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ChatRoomCallbackAdapter { </span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> <img src="http://www.shnenglu.com/Images/dot.gif"> </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"> }; <br>typedef IceUtil::Handle</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">ChatRoomCallbackAdapter</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> ChatRoomCallbackAdapterPtr; <br> <br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ChatRoom : </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> IceUtil::Shared <br>{ <br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">: <br>    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> reserve(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">); <br>    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> unreserve(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">); <br>    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> join(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ChatRoomCallbackAdapterPtr</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">); <br>    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> leave(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">); <br>    Ice::Long send(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">); <br> <br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">: <br>    typedef map</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">, ChatRoomCallbackAdapterPtr</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> ChatRoomCallbackMap; <br> <br>    ChatRoomCallbackMap _members; <br>    </span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> _reserved; <br>    IceUtil::Mutex _mutex; <br>}; <br>typedef IceUtil::Handle</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">ChatRoom</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> ChatRoomPtr;</span></div> <p>      成员_reserverd是一个字W串集合Q它存储已经建立回话Q但是还没有加入聊天室的客户名。_members存储当前聊天室的所有用P已经调用qjoin函数的用P?br><br>     成员函数 reserve ?unreserve l护 _reserved 集合?/p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> C++ </span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> <br>ChatRoom::reserve(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> name) <br>{ <br>    IceUtil::Mutex::Lock sync(_mutex); <br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(_reserved.find(name) </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> _reserved.end() </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> _members.find(name) </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> _members.end()) <br>    { <br>        </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">The name </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> name </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> is already in use.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); <br>    } <br>    _reserved.insert(name); <br>} <br> <br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> <br>ChatRoom::unreserve(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> name) <br>{ <br>    IceUtil::Mutex::Lock sync(_mutex); <br>    _reserved.erase(name); <br>}</span></div> <p><br>     join操作d用户到聊天室?/p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> C++ </span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> <br>ChatRoom::join(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> name, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ChatRoomCallbackAdapterPtr</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> callback) <br>{ <br>    IceUtil::Mutex::Lock sync(_mutex); <br>    IceUtil::Int64 timestamp </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> IceUtil::Time::now().toMilliSeconds(); <br>    _reserved.erase(name); <br> <br>    Ice::StringSeq names; <br>    ChatRoomCallbackMap::const_iterator q; <br>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(q </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> _members.begin(); q </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> _members.end(); </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">q) <br>    { <br>        names.push_back((</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">q).first); <br>    } <br> <br>    callback</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">init(names); <br> <br>    _members[name] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> callback; <br> <br>    UserJoinedEventPtr e </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> UserJoinedEvent(timestamp, name); <br>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(q </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> _members.begin(); q </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> _members.end(); </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">q) <br>    { <br>        q</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">second</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">join(e); <br>    } <br>}<br></span></div> <p><br>      send实现Q同join实现非常cMQ?/p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> C++ </span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">Ice::Long <br>ChatRoom::send(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> name, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> message) <br>{ <br>    IceUtil::Mutex::Lock sync(_mutex); <br>    IceUtil::Int64 timestamp </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> IceUtil::Time::now().toMilliSeconds(); <br> <br>    MessageEventPtr e </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> MessageEvent(timestamp, name, message); <br>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(ChatRoomCallbackMap::iterator q </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> _members.begin(); q </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> _members.end(); </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">q) <br>    { <br>        q</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">second</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">send(e); <br>    } <br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> timestamp; <br>}</span></div> <p> </p> <p> c?ChatRoomCallbackAdapter<br><br></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> C++ </span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ChatRoomCallbackAdapter : </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> IceUtil::Shared <br>{ <br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">: <br>    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> init(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::StringSeq</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; <br>    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> join(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> UserJoinedEventPtr</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; <br>    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> leave(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> UserLeftEventPtr</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; <br>    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> send(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> MessageEventPtr</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; <br>};</span></div> <br>推模?CallbackAdapter 实现Q? <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> SessionCallbackAdapter : </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> ChatRoomCallbackAdapter <br>{ <br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">: <br>    SessionCallbackAdapter(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ChatRoomCallbackPrx</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> callback, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ChatSessionPrx</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> session)    : _callback(callback), _session(session) <br>    { <br>    } <br> <br>    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> init(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::StringSeq</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> users) <br>    { <br>        _callback</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">init_async(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> AMICallback</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">AMI_ChatRoomCallback_init</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">(_session), users); <br>    } <br> <br>    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> join(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> UserJoinedEventPtr</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> e) <br>    { <br>        _callback</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">join_async(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> AMICallback</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">AMI_ChatRoomCallback_join</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">(_session), <br>                              e</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">timestamp, <br>                              e</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">name); <br>    } <br> <br>    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> leave(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> UserLeftEventPtr</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> e) <br>    { <br>        _callback</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">leave_async(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> AMICallback</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">AMI_ChatRoomCallback_leave</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">(_session), <br>                               e</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">timestamp, <br>                               e</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">name); <br>    } <br> <br>    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> send(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> MessageEventPtr</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> e) <br>    { <br>        _callback</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">send_async(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> AMICallback</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">AMI_ChatRoomCallback_send</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">(_session), <br>                              e</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">timestamp, <br>                              e</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">name, <br>                              e</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">message); <br>    } <br> <br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">: <br>    </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ChatRoomCallbackPrx _callback; <br>    </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ChatSessionPrx _session; <br>};<br></span></div> <br>      看一下SessionCallbackAdapter的四个成员函敎ͼ当异步调用完成时Q都使用cAMICallback来接攉知。它的定义如下:<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> AMICallback : </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> T <br>{ <br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">: <br>    AMICallback(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ChatSessionPrx</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> session) : _session(session) <br>    { <br>    }<br>    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> ice_response() <br>    { <br>    } <br> <br>    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> ice_exception(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::Exception</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">) <br>    { <br>        </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> <br>        { <br>            _session</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">destroy(); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Collocated </span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">        } <br>        </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::LocalException</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">) <br>        { <br>        } <br>    } <br> <br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">: <br>    </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ChatSessionPrx _session; <br>};<br></span></div>        当用户回调操作抛出异常,服务器立即销毁客户会话,x该用戯天室。这是因为,一旦客L回调对象出现了一ơ异常,它以后也׃可能再正常?br><br><br><span style="FONT-SIZE: 14pt">推模式会话创?/span>Q?br><br>     现在来看一下会话创建。推模式的客户用Glacier2Q所以要使用Glacier2的会话创建机制。Glacier2 允许用户通过提供一个Glacier2::SessionManager对象的代理来自定义会话创建机制。通过讄Glacier2.SessionManager属性来配置Gloacier2Q就可以使用自己的会话管理器。会话管理器除了一个trivial构造函敎ͼ讄聊天室指针)Q只有一个操作,createQGlacier2调用它来代理应用的会话创建?create 操作必须q回一个会话代理(cd为Glacier2::Session*Q。实现如下:<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Glacier2::SessionPrx <br>ChatSessionManagerI::create(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> name,<br>                            </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Glacier2::SessionControlPrx</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">, <br>                            </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::Current</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> c) <br>{ <br>    </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> vname; <br>    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> <br>    { <br>        vname </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> validateName(name); <br>        _chatRoom</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">reserve(vname); <br>    } <br>    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> reason) <br>    { <br>       </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> CannotCreateSessionException(reason); <br>    } <br> <br>    Glacier2::SessionPrx proxy; <br>    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> <br>    { <br>        ChatSessionIPtr session </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ChatSessionI(_chatRoom, vname); <br>        proxy </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> SessionPrx::uncheckedCast(c.adapter</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">addWithUUID(session)); <br> <br>        Ice::IdentitySeq ids; <br>        ids.push_back(proxy</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">ice_getIdentity()); <br>        sessionControl</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">identities()</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">add(ids); <br>    } <br>    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::LocalException</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">) <br>    { <br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(proxy) <br>        { <br>            proxy</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">destroy(); <br>        } <br>        </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> CannotCreateSessionException(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Internal server error</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); <br>    } <br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> proxy; <br>}</span></div> <br>     首先调用一个简单的帮助函数 validateName, 来检查传递的用户名是否包含非法字W,q把它{为大写,然后调用 reserver函数把它加到聊天室的_reserved集合中。我们要监视q些操作抛出的消息,q把它{化ؓGlacide2::CannotCreateSessionException异常Q即在create操作的异常规范声明的异常?br>     接着实例化一个ChatSessionI对象Q见下面Q来创徏会话。注意这个会话用UUID作ؓ对象标识Q所以保证标识符唯一?br>    最后,dq个新创建的会话标识QGllacier2只通过它来转发l过q个会话的请求。实际上Q?#8220;只{发经q这个会话的q且只到q个会话的请?#8221;Q这是一U安全的办法Q如果有恶意客户能猜出另一个客户会话的标识Q它也不能向别的对象发送请求(可能在除了聊天服务器之外的服务器上)。如果出错,销毁刚创徏的会话对象,q样避免了资源泄霌Ӏ?br>       q就是利用Glacier2创徏会话的全部。如果你希望使用Glacier2的认证机Ӟ可以讄属性Glacier2.PermissionsVerifier为执行认证的对象代理。(Glacier2提供一个内|的权限验证器,NullPermissionsVerifierQ可以检查用户名和密码)?br>       图:会话创徏交互图(略)<br><br>       ChatSessionIcdCChatSession接口?br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ChatSessionI : </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> ChatSession <br>{ <br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">: <br>    ChatSessionI(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ChatRoomPtr</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">); <br> <br>    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> setCallback(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ChatRoomCallbackPrx</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::Current</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">); <br>    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> Ice::Long send(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::Current</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">); <br>    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> destroy(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::Current</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">); <br> <br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">: <br>    </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ChatRoomPtr _chatRoom; <br>    </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> _name; <br>    ChatRoomCallbackAdapterPtr _callback; <br>    </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> _destroy; <br>    IceUtil::Mutex _mutex; <br>}; <br>typedef IceUtil::Handle</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">ChatSessionI</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> ChatSessionIPtr;</span></div>          构造函数设|聊天室和用户名Qƈ把_destroy讄为False.<br>       <br>        ׃Glacier2::create操作不允怼递代理,必须把创Z话和讄回调分成两步。这是setCallback的实玎ͼ<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> <br>ChatSessionI::setCallback(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> ChatRoomCallbackPrx</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> callback, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::Current</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> c) <br>{ <br>    IceUtil::Mutex::Lock sync(_mutex); <br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(_destroy) <br>    { <br>        </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> Ice::ObjectNotExistException(__FILE__, __LINE__); <br>    } <br> <br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(_callback </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">callback) <br>    { <br>        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">; <br>    } <br> <br>    Ice::Context ctx; <br>    ctx[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">_fwd</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">o</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">; <br>    _callback </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> SessionCallbackAdapter(callback</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">ice_context(ctx), <br>                                           ChatSessionPrx::uncheckedCast( <br>                                               c.adapter</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">createProxy(c.id))); <br>    _chatRoom</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">join(_name, _callback); <br>}</span></div> <p>      注意Q在使用join传递代理之前,向客户代理添加了一个gؓ "o" 的_fwd上下文。它提示Glacier使用单向调用来{发客户回调。这h双向调用更加有效。因为所有的回调操作均ؓvoidq回|所以可以单向调用?br>     服务器的回调为普通的双向调用。这样当出错时可以通知服务器。当客户端出错时Q这个对l束客户会话很有用?br><br>     一旦客戯用了setCallbackQ就可以接收聊天室的各种行ؓ通知。下为send实现Q?/p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Ice::Long <br>ChatSessionI::send(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> message, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::Current</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">) <br>{ <br>    IceUtil::Mutex::Lock sync(_mutex); <br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(_destroy) <br>    { <br>        </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> Ice::ObjectNotExistException(__FILE__, __LINE__); <br>    } <br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">_callback) <br>    { <br>        </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> InvalidMessageException(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">You cannot send messages until you joined the chat.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); <br>    } <br>    </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">; <br>    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> <br>    { <br>        msg </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> validateMessage(message); <br>    } <br>    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> reason) <br>    { <br>        </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> InvalidMessageException(reason); <br>    } <br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> _chatRoom</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">send(_name, msg); <br>}</span></div> <p> <br>    客户要离开聊天室,只要调用 destory.</p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> <br>ChatSessionI::destroy(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::Current</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> c) <br>{ <br>    IceUtil::Mutex::Lock sync(_mutex); <br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(_destroy) <br>    { <br>        </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> Ice::ObjectNotExistException(__FILE__, __LINE__); <br>    } <br>    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> <br>    { <br>        c.adapter</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">remove(c.id);<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(_callback </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) <br>        { <br>            _chatRoom</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">unreserve(_name); <br>        } <br>        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> <br>        { <br>            _chatRoom</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">leave(_name); <br>        } <br>    } <br>    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> Ice::ObjectAdapterDeactivatedException</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">) <br>    { <br>        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> No need to clean up, the server is shutting down. </span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    } <br>    _destroy </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">; <br>}</span></div> <p> </p> <p> </p> <img src ="http://www.shnenglu.com/eXile/aggbug/77897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/eXile/" target="_blank">eXile</a> 2009-03-26 00:54 <a href="http://www.shnenglu.com/eXile/archive/2009/03/26/77897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[T] ICE实例学习QLet's Chat! 节译 (1)http://www.shnenglu.com/eXile/archive/2009/03/25/77890.htmleXileeXileWed, 25 Mar 2009 15:52:00 GMThttp://www.shnenglu.com/eXile/archive/2009/03/25/77890.htmlhttp://www.shnenglu.com/eXile/comments/77890.htmlhttp://www.shnenglu.com/eXile/archive/2009/03/25/77890.html#Feedback0http://www.shnenglu.com/eXile/comments/commentRss/77890.htmlhttp://www.shnenglu.com/eXile/services/trackbacks/77890.htmlhttp://www.zeroc.com/articles/index.html

需?br>
      1Q一个典型的聊天室应用,使用客户?服务器架构,客户发送消息到中心服务器,然后Q消息发送给其它客户?br>      2Q尽量减服务器理Q甚臛_以不需要?br>      3Q通信必须安全Q通过公共|络时必要保护个h隐私?br>      4Q当客户端和服务器有防火墙保护时也能正常q行Q客L不用修改它的|络或者防火墙讄?br>      5Q客L可以在各U^C利用多种语言实现Q比如说利用Web览器作为客L?br>      6Q客L可能|络带宽有限Q所以应该尽量减网l流量?br>      只支持单个聊天室。(多个聊天室只是代码多了点Qƈ没有增加M隑ֺQ?br>
设计

      在本文中Q将会演C多U客L的设计和实现。包括:
      1QC++命o行客LQ?br>      2QJAVA SWing GUI客户端;
      3Q?NET WPF客户端;
      4QPHP|页客户端;
      5QSilverlight |页客户端;
     
     注意Q对于ICE3.3, PHP和Ruby只提供了客户端的Run Time。我们在考虑当连接的客户如何从服务器获得消息Ӟ必须要想到这一炏V对于消息发布,有两U通信模型Q?br>     1Q推模型Q略
     2Q拉模型Q略
     推模型比较简单,Ҏ实现Q我们的Chat 客户端中QC++QJava, .Net, Silverlight(0.3)都用该模型。PHP客户端用拉模型?br>
推模型定?br>     每个客户端中提供一?ChatRoomCallback cd的ICE对象到服务器。当发生事gӞ服务器调用该对象的操作通知客户。SLICE定义如下Q?br>
// Slice 
module Chat 

// Implemented by clients 
interface ChatRoomCallback 

    [
"ami"void init(Ice::StringSeq users); 
    [
"ami"void join(long timestamp, string name); 
    [
"ami"void leave(long timestamp, string name); 
    [
"ami"void send(long timestamp, string name, string message); 
}; 
};

     1Q当用户首次q接到聊天室Ӟ服务器调?init 操作.     users参数告诉用户目前q接到聊天室的所有用户信息?br>     2Q有用户q接到聊天室Ӟ服务器调?join 操作?br>     3Q有用户断开q接Ӟ服务器调?nbsp;leave 操作?br>     4Q有用户发送消息时Q服务器调用 send 操作?br>     注意设计使用异步事g。元数据指o ["ami"] 标明服务器异步调用回调操作。当客户端行为异常时Q这Ҏ务器是一个保护:客户端可能长旉dQ服务器调用期间不会因此失去对线E的控制?br>
与防火墙协作
      ?.....

      Glacer2是ICE针对q种情况的预建的解决ҎQ它扮演一个服务器前端。Glacer2h以下特征Q?br>      1Q支持会话概念,API支持认证机制Q可实现自定义的会话创徏和认证?br>      2Q单个Glacer2可进行Q意数量的服务器和客户端{发。服务器只要有一个端口接受外来连接,而不用管具体服务器个数?br>     3Q对于具有防火墙的客LQ服务器也可调用其提供的回调?br>
     因ؓ Glacer2会话概念是面向连接的Q只有当客户端同Glacer2的连接打开Ӟ更精的_同Glacer2保持一个激zȝ会话Ӟ服务器才可以对客戯行回调。换句话_当客L同Glacer2失去q接QGlacer2自动销毁会话。ؓ了阻止客L到Glacer2的连接被意外关闭Q客L必须要禁用ACMQAutomic Connection Management, 自动q接理Q。而且QGlacer2通常寚w旉I闲的会话设|超时。当聊天室长旉没有动作ӞZ防止Glacer2销毁会话,客户端必d期性进行激z,比如Q调?ice_ping, 来对Glacer2的会话超时进行重|?br>
     Chat客户端通过服务器提供的 ChatSession接口来和服务器通信?ChatSession 从Glacer2::Sessionz?br>
// Slice 
module Chat 

exception InvalidMessageException 

    
string reason; 
}; 
 
interface ChatSession extends Glacier2::Session 

    
void setCallback(ChatRoomCallback* cb); 
    [
"ami"long send(string message) throws InvalidMessageException; 
}; 
};

      q就是推模型QChat客户端调用ChatSession的send来发送消息,服务器调用每一个客LChatRoomCallback的send操作q行分发?br>
拉模型定?br>
TODO




eXile 2009-03-25 23:52 发表评论
]]>
用ICE实现一个简单的聊天?/title><link>http://www.shnenglu.com/eXile/archive/2009/01/04/ice.html</link><dc:creator>eXile</dc:creator><author>eXile</author><pubDate>Sat, 03 Jan 2009 17:32:00 GMT</pubDate><guid>http://www.shnenglu.com/eXile/archive/2009/01/04/ice.html</guid><wfw:comment>http://www.shnenglu.com/eXile/comments/71099.html</wfw:comment><comments>http://www.shnenglu.com/eXile/archive/2009/01/04/ice.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/eXile/comments/commentRss/71099.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/eXile/services/trackbacks/71099.html</trackback:ping><description><![CDATA[     摘要: 聊天室是一U典型的|络应用Q这个程序演CZICE框架的基本结构?nbsp; <a href='http://www.shnenglu.com/eXile/archive/2009/01/04/ice.html'>阅读全文</a><img src ="http://www.shnenglu.com/eXile/aggbug/71099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/eXile/" target="_blank">eXile</a> 2009-01-04 01:32 <a href="http://www.shnenglu.com/eXile/archive/2009/01/04/ice.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用boost::asio实现一个简单的服务器框?/title><link>http://www.shnenglu.com/eXile/archive/2008/05/28/51430.html</link><dc:creator>eXile</dc:creator><author>eXile</author><pubDate>Wed, 28 May 2008 13:00:00 GMT</pubDate><guid>http://www.shnenglu.com/eXile/archive/2008/05/28/51430.html</guid><wfw:comment>http://www.shnenglu.com/eXile/comments/51430.html</wfw:comment><comments>http://www.shnenglu.com/eXile/archive/2008/05/28/51430.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.shnenglu.com/eXile/comments/commentRss/51430.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/eXile/services/trackbacks/51430.html</trackback:ping><description><![CDATA[     摘要: 利用boost::asio实现一个简单的服务器框?nbsp; <a href='http://www.shnenglu.com/eXile/archive/2008/05/28/51430.html'>阅读全文</a><img src ="http://www.shnenglu.com/eXile/aggbug/51430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/eXile/" target="_blank">eXile</a> 2008-05-28 21:00 <a href="http://www.shnenglu.com/eXile/archive/2008/05/28/51430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Reactor模式中网l事件分z探?/title><link>http://www.shnenglu.com/eXile/archive/2008/05/22/50767.html</link><dc:creator>eXile</dc:creator><author>eXile</author><pubDate>Thu, 22 May 2008 07:27:00 GMT</pubDate><guid>http://www.shnenglu.com/eXile/archive/2008/05/22/50767.html</guid><wfw:comment>http://www.shnenglu.com/eXile/comments/50767.html</wfw:comment><comments>http://www.shnenglu.com/eXile/archive/2008/05/22/50767.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.shnenglu.com/eXile/comments/commentRss/50767.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/eXile/services/trackbacks/50767.html</trackback:ping><description><![CDATA[<br>原文地址: <a href="http://www.shnenglu.com/eXile">http://www.shnenglu.com/eXile</a><br><br>   对于使用U程池的Reactor模式Q针Ҏ一个SOCKET句柄的事件处理器handler可能被分zֈ不同的线E当中,q就要求handler的每一个操作都是线E安全的?br>  可以使用一U办法一个handler的操作只能分zֈ一个线E中Qؓ每一个handler讑֮一个线E所有者テQ,一开始テQؓI,则每个线E都可以分派Q第一ơ分z之后,则设定ؓ该线EテQ,以后只分zֈ该线E中。这P可以保证handler操作的单U程性,化以后handler的具体实现。这个テQ也可以灉|讄Q以适应具体事务的要求?br>  但这样ƈ不能保证handlerd无锁Q因会有两个U程会出现竟争,除了q个事g处理U程以外Q还有事件分zE(即事件侦听线E)。对于这个问题的解决办法如下Qؓ每个handler讑֮一个原子计敎ͼ事g分派U程在分z事件前Q首先设定该原子计数Q若讄p|Q表明此时正有其它线E在处理该handlerQ则q不分派该事Ӟ而是它|于一个pending队列中,{待以后分派?br>   q有一U简单的ҎQ就是将该handler直接挂vQ处理完后才允许q行事g分派? <img src ="http://www.shnenglu.com/eXile/aggbug/50767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/eXile/" target="_blank">eXile</a> 2008-05-22 15:27 <a href="http://www.shnenglu.com/eXile/archive/2008/05/22/50767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost::asioCZHTTP Servercdhttp://www.shnenglu.com/eXile/archive/2008/05/07/49072.htmleXileeXileTue, 06 May 2008 16:50:00 GMThttp://www.shnenglu.com/eXile/archive/2008/05/07/49072.htmlhttp://www.shnenglu.com/eXile/comments/49072.htmlhttp://www.shnenglu.com/eXile/archive/2008/05/07/49072.html#Feedback1http://www.shnenglu.com/eXile/comments/commentRss/49072.htmlhttp://www.shnenglu.com/eXile/services/trackbacks/49072.html



eXile 2008-05-07 00:50 发表评论
]]>
高性能服务器的多线E策?/title><link>http://www.shnenglu.com/eXile/archive/2008/03/06/multithread.html</link><dc:creator>eXile</dc:creator><author>eXile</author><pubDate>Wed, 05 Mar 2008 16:09:00 GMT</pubDate><guid>http://www.shnenglu.com/eXile/archive/2008/03/06/multithread.html</guid><wfw:comment>http://www.shnenglu.com/eXile/comments/43780.html</wfw:comment><comments>http://www.shnenglu.com/eXile/archive/2008/03/06/multithread.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.shnenglu.com/eXile/comments/commentRss/43780.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/eXile/services/trackbacks/43780.html</trackback:ping><description><![CDATA[     摘要: Q一Q线E数量与U程池模?Q二Q多U程的内存池优化  <a href='http://www.shnenglu.com/eXile/archive/2008/03/06/multithread.html'>阅读全文</a><img src ="http://www.shnenglu.com/eXile/aggbug/43780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/eXile/" target="_blank">eXile</a> 2008-03-06 00:09 <a href="http://www.shnenglu.com/eXile/archive/2008/03/06/multithread.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <a href="http://www.shnenglu.com/">青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品</a> <div style="position:fixed;left:-9000px;top:-9000px;"><font id="pjuwb"></font><button id="pjuwb"><pre id="pjuwb"></pre></button><sub id="pjuwb"></sub><tbody id="pjuwb"><var id="pjuwb"><address id="pjuwb"></address></var></tbody><listing id="pjuwb"><label id="pjuwb"><strong id="pjuwb"></strong></label></listing><wbr id="pjuwb"><small id="pjuwb"><tbody id="pjuwb"></tbody></small></wbr><ins id="pjuwb"><xmp id="pjuwb"></xmp></ins><style id="pjuwb"></style><label id="pjuwb"><em id="pjuwb"><li id="pjuwb"></li></em></label><samp id="pjuwb"></samp><menu id="pjuwb"><input id="pjuwb"></input></menu><pre id="pjuwb"><tbody id="pjuwb"><tfoot id="pjuwb"><button id="pjuwb"></button></tfoot></tbody></pre><form id="pjuwb"></form><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"><sup id="pjuwb"></sup></label></style></i><li id="pjuwb"><table id="pjuwb"><abbr id="pjuwb"></abbr></table></li><video id="pjuwb"></video><dfn id="pjuwb"></dfn><progress id="pjuwb"></progress><strong id="pjuwb"></strong><mark id="pjuwb"></mark><em id="pjuwb"></em><tbody id="pjuwb"><p id="pjuwb"><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike></p></tbody><option id="pjuwb"></option><strike id="pjuwb"></strike><u id="pjuwb"></u><td id="pjuwb"><center id="pjuwb"><tr id="pjuwb"></tr></center></td><em id="pjuwb"><mark id="pjuwb"><em id="pjuwb"><tt id="pjuwb"></tt></em></mark></em><strong id="pjuwb"></strong><wbr id="pjuwb"></wbr><s id="pjuwb"></s><strong id="pjuwb"></strong><legend id="pjuwb"></legend><nav id="pjuwb"></nav><dl id="pjuwb"><th id="pjuwb"><dl id="pjuwb"></dl></th></dl><noframes id="pjuwb"><ins id="pjuwb"></ins></noframes><font id="pjuwb"></font><strike id="pjuwb"><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"></label></style></i></strike><output id="pjuwb"></output><thead id="pjuwb"><pre id="pjuwb"></pre></thead><source id="pjuwb"></source><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem><pre id="pjuwb"><span id="pjuwb"><pre id="pjuwb"><big id="pjuwb"></big></pre></span></pre><cite id="pjuwb"><fieldset id="pjuwb"><s id="pjuwb"><rt id="pjuwb"></rt></s></fieldset></cite><big id="pjuwb"><progress id="pjuwb"><big id="pjuwb"></big></progress></big><samp id="pjuwb"><delect id="pjuwb"></delect></samp><dl id="pjuwb"></dl><strike id="pjuwb"><nav id="pjuwb"><dl id="pjuwb"><strong id="pjuwb"></strong></dl></nav></strike><tbody id="pjuwb"><b id="pjuwb"><optgroup id="pjuwb"><rp id="pjuwb"></rp></optgroup></b></tbody><em id="pjuwb"></em><xmp id="pjuwb"><blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote></xmp> <i id="pjuwb"><abbr id="pjuwb"><i id="pjuwb"><abbr id="pjuwb"></abbr></i></abbr></i><center id="pjuwb"><acronym id="pjuwb"><center id="pjuwb"></center></acronym></center><pre id="pjuwb"></pre><ul id="pjuwb"><thead id="pjuwb"></thead></ul><blockquote id="pjuwb"><pre id="pjuwb"><sup id="pjuwb"></sup></pre></blockquote><acronym id="pjuwb"></acronym><big id="pjuwb"><s id="pjuwb"></s></big><th id="pjuwb"></th><th id="pjuwb"></th><tbody id="pjuwb"></tbody><thead id="pjuwb"><strike id="pjuwb"></strike></thead><th id="pjuwb"><dl id="pjuwb"><wbr id="pjuwb"></wbr></dl></th><dl id="pjuwb"><strong id="pjuwb"></strong></dl><abbr id="pjuwb"><noframes id="pjuwb"><noscript id="pjuwb"></noscript></noframes></abbr><td id="pjuwb"><ol id="pjuwb"></ol></td><li id="pjuwb"><noscript id="pjuwb"><abbr id="pjuwb"></abbr></noscript></li><small id="pjuwb"><bdo id="pjuwb"><nav id="pjuwb"></nav></bdo></small><style id="pjuwb"></style><optgroup id="pjuwb"><table id="pjuwb"></table></optgroup><center id="pjuwb"><tr id="pjuwb"><dfn id="pjuwb"></dfn></tr></center><th id="pjuwb"></th><u id="pjuwb"></u><tfoot id="pjuwb"><legend id="pjuwb"><i id="pjuwb"></i></legend></tfoot><mark id="pjuwb"></mark><meter id="pjuwb"></meter><nav id="pjuwb"></nav><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><nobr id="pjuwb"></nobr><sub id="pjuwb"><th id="pjuwb"><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem></th></sub><thead id="pjuwb"><sub id="pjuwb"></sub></thead><ul id="pjuwb"><address id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></address></ul><dfn id="pjuwb"></dfn><pre id="pjuwb"></pre><input id="pjuwb"><cite id="pjuwb"><fieldset id="pjuwb"></fieldset></cite></input><u id="pjuwb"><form id="pjuwb"><u id="pjuwb"></u></form></u><kbd id="pjuwb"><em id="pjuwb"><mark id="pjuwb"></mark></em></kbd><tr id="pjuwb"></tr><del id="pjuwb"><form id="pjuwb"><address id="pjuwb"></address></form></del><tfoot id="pjuwb"><legend id="pjuwb"><ol id="pjuwb"><dl id="pjuwb"></dl></ol></legend></tfoot><menu id="pjuwb"><nobr id="pjuwb"><th id="pjuwb"><nobr id="pjuwb"></nobr></th></nobr></menu><fieldset id="pjuwb"></fieldset><pre id="pjuwb"><blockquote id="pjuwb"><samp id="pjuwb"></samp></blockquote></pre><xmp id="pjuwb"><sup id="pjuwb"><pre id="pjuwb"></pre></sup></xmp><span id="pjuwb"><progress id="pjuwb"></progress></span><font id="pjuwb"></font><var id="pjuwb"><abbr id="pjuwb"></abbr></var><strong id="pjuwb"><label id="pjuwb"><i id="pjuwb"><legend id="pjuwb"></legend></i></label></strong><tr id="pjuwb"><em id="pjuwb"><em id="pjuwb"><output id="pjuwb"></output></em></em></tr><thead id="pjuwb"><strike id="pjuwb"></strike></thead> <acronym id="pjuwb"></acronym><i id="pjuwb"></i><tt id="pjuwb"></tt><rt id="pjuwb"><source id="pjuwb"><rt id="pjuwb"></rt></source></rt><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike><del id="pjuwb"></del><font id="pjuwb"><output id="pjuwb"><ins id="pjuwb"><output id="pjuwb"></output></ins></output></font><kbd id="pjuwb"><tr id="pjuwb"><kbd id="pjuwb"></kbd></tr></kbd><pre id="pjuwb"><sup id="pjuwb"><delect id="pjuwb"><samp id="pjuwb"></samp></delect></sup></pre><samp id="pjuwb"></samp><track id="pjuwb"></track><tr id="pjuwb"></tr><center id="pjuwb"></center><fieldset id="pjuwb"></fieldset><i id="pjuwb"></i><td id="pjuwb"></td><rt id="pjuwb"></rt><object id="pjuwb"></object><pre id="pjuwb"><progress id="pjuwb"><sub id="pjuwb"><thead id="pjuwb"></thead></sub></progress></pre><kbd id="pjuwb"><tr id="pjuwb"><option id="pjuwb"></option></tr></kbd><output id="pjuwb"><ins id="pjuwb"></ins></output><ol id="pjuwb"></ol><source id="pjuwb"></source><strong id="pjuwb"></strong><ruby id="pjuwb"></ruby><sub id="pjuwb"><meter id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></meter></sub><pre id="pjuwb"></pre><center id="pjuwb"></center><tr id="pjuwb"><tbody id="pjuwb"><xmp id="pjuwb"><dd id="pjuwb"></dd></xmp></tbody></tr><video id="pjuwb"></video><pre id="pjuwb"></pre><form id="pjuwb"><optgroup id="pjuwb"></optgroup></form><samp id="pjuwb"></samp><kbd id="pjuwb"></kbd><strong id="pjuwb"><option id="pjuwb"></option></strong><object id="pjuwb"></object><abbr id="pjuwb"><noframes id="pjuwb"><abbr id="pjuwb"></abbr></noframes></abbr><ul id="pjuwb"><del id="pjuwb"><button id="pjuwb"><pre id="pjuwb"></pre></button></del></ul><abbr id="pjuwb"></abbr><strong id="pjuwb"><code id="pjuwb"><strong id="pjuwb"></strong></code></strong><option id="pjuwb"></option><optgroup id="pjuwb"><bdo id="pjuwb"><code id="pjuwb"></code></bdo></optgroup><mark id="pjuwb"><em id="pjuwb"><font id="pjuwb"></font></em></mark><acronym id="pjuwb"><code id="pjuwb"></code></acronym><dl id="pjuwb"></dl><em id="pjuwb"></em><object id="pjuwb"><input id="pjuwb"><object id="pjuwb"></object></input></object><output id="pjuwb"><dd id="pjuwb"></dd></output><option id="pjuwb"><button id="pjuwb"><option id="pjuwb"></option></button></option><small id="pjuwb"></small></div> <a href="http://chinasck.com" target="_blank">޵Ӱ߲</a>| <a href="http://91x8.com" target="_blank">ŷŷ</a>| <a href="http://k8m9.com" target="_blank">Ļһ</a>| <a href="http://vipaqdx29.com" target="_blank">ҹƷ</a>| <a href="http://jxjx11.com" target="_blank">ŷպŷƷ</a>| <a href="http://filark.com" target="_blank">ձĻ߲</a>| <a href="http://ddh345.com" target="_blank">ŷһƵۿ</a>| <a href="http://mysuteng.com" target="_blank">avۺ</a>| <a href="http://www-273111.com" target="_blank">պƵ</a>| <a href="http://44ie.com" target="_blank">һŮƵ߹ۿ</a>| <a href="http://tao62bao.com" target="_blank">Ůһ</a>| <a href="http://mytopvogue.com" target="_blank">ŷƵ </a>| <a href="http://www48929.com" target="_blank">þ˽˹Ʒvaҩ</a>| <a href="http://www-452.com" target="_blank">þþƷ </a>| <a href="http://3dmh145.com" target="_blank">ŷ</a>| <a href="http://tizenkorea.com" target="_blank">ŷһƬ߹ۿ</a>| <a href="http://621765.com" target="_blank">þþùƷһ </a>| <a href="http://2015xiaomingkankan.com" target="_blank">Ʒ</a>| <a href="http://seanzhau.com" target="_blank">þþþþ9999</a>| <a href="http://fcponteggi.com" target="_blank">ŷƷƵ</a>| <a href="http://fengxinye.com" target="_blank">ŷһ</a>| <a href="http://92ebook.com" target="_blank">˾a߾Ʒ</a>| <a href="http://www-787788.com" target="_blank">ٸһ</a>| <a href="http://97seee.com" target="_blank">þþùƷһ</a>| <a href="http://337105.com" target="_blank">һ</a>| <a href="http://qqszdq.com" target="_blank">ŷպ</a>| <a href="http://bby99.com" target="_blank">þˬ</a>| <a href="http://szzzzzzz.com" target="_blank">ŷպ</a>| <a href="http://yye321.com" target="_blank">þþþһ</a>| <a href="http://8332777.com" target="_blank">ŷƷ߹ۿ91</a>| <a href="http://bjygp.com" target="_blank">þþþ</a>| <a href="http://9ctv2.com" target="_blank">Ʒþþþ91</a>| <a href="http://0999555.com" target="_blank">ŷ</a>| <a href="http://tongrenyaoye.com" target="_blank">ŷһ</a>| <a href="http://vvvv81.com" target="_blank">˳վɫww</a>| <a href="http://mom8888.com" target="_blank">ŷպһ</a>| <a href="http://yxtczx.com" target="_blank">9iƬѸ</a>| <a href="http://kongtou8.com" target="_blank">ۺɫۺϾþۺ</a>| <a href="http://4448884.com" target="_blank">ó߹ۿ</a>| <a href="http://musicshq.com" target="_blank">Ůɫ</a>| <a href="http://wo6wo.com" target="_blank">þվ</a>| <a href="http://9511331.com" target="_blank">þþۺ㽶ۺ</a>| <a href="http://49234c.com" target="_blank">Ʒþþþþþ9999</a>| <a href="http://y7y7s.com" target="_blank">޹ŷ˳</a>| <a href="http://xigou666.com" target="_blank">߹ۿavӰ</a>| <a href="http://leohacks.com" target="_blank">Ƶ ŷƵ</a>| <a href="http://3dmh329.com" target="_blank">պҹavӰ</a>| <a href="http://bbbbyb.com" target="_blank">ŷ/һ</a>| <a href="http://www-493049.com" target="_blank">þþþþ91</a>| <a href="http://kissgz.com" target="_blank">պŷӰ߹ۿ</a>| <a href="http://7776701.com" target="_blank">һþþþþ</a>| <a href="http://301110.com" target="_blank">ѹۿ߹ۿ</a>| <a href="http://www-440447.com" target="_blank">þƵ߹ۿ</a>| <a href="http://44cgcg.com" target="_blank">þþ999</a>| <a href="http://7269003.com" target="_blank">պƵһ</a>| <a href="http://xjj733.com" target="_blank">һպƷƵ</a>| <a href="http://794278.com" target="_blank">պƵ</a>| <a href="http://music444.com" target="_blank">ŷĻһ </a>| <a href="http://kasimcoal.com" target="_blank">һɫþ88ۺ޾Ʒ </a>| <a href="http://687989.com" target="_blank">ŷպ</a>| <a href="http://poqsoft.com" target="_blank">Ƭһһ߹ۿ</a>| <a href="http://tk263.com" target="_blank">޸Ƶһ</a>| <a href="http://52sougou.com" target="_blank">þֹƷ</a>| <a href="http://xfrlyy.com" target="_blank">þ޷</a>| <a href="http://666043.com" target="_blank">Ʒպav</a>| <a href="http://246767.com" target="_blank">þۺϸϾþúݺݺ97ɫ69</a>| <a href="http://tuokuba520.com" target="_blank">þҹѹۿ</a>| <a href="http://aimashe.com" target="_blank">һëƬ</a>| <a href="http://5gn4y.com" target="_blank">þþƷƵ</a>| <a href="http://www-136445.com" target="_blank">Ů޾Ʒһ</a>| <a href="http://quanfadq.com" target="_blank">ӰȷƷ</a>| <a href="http://yw9677.com" target="_blank">Ѿþ99Ʒ</a>| <a href="http://sauske.com" target="_blank">޵һɫ</a>| <a href="http://zgztby.com" target="_blank">һŷƷ</a>| <a href="http://zhhtianyi.com" target="_blank">ŷ˽վ</a>| <a href="http://montnove.com" target="_blank">ҹ޾Ʒ</a>| <a href="http://9a5x.com" target="_blank">鶹Ʒһ </a>| <a href="http://www55avav.com" target="_blank">ҹԴһ</a>| <a href="http://cibocentre.com" target="_blank">þùһ</a>| <a href="http://340996.com" target="_blank"></a>| <a href="http://zhijiasd.com" target="_blank">պһվ</a>| <a href="http://jnjpsm.com" target="_blank">Ʒþþһ</a>| <a href="http://987328.com" target="_blank">ŷպ߹ۿa</a>| <a href="http://pfpf662.com" target="_blank">þav</a>| <a href="http://holotu.com" target="_blank">ŷ޾Ʒһ</a>| <a href="http://xfrlyy.com" target="_blank">ŷպ߹ۿ</a>| <a href="http://www227zh.com" target="_blank">þþҹӰ</a>| <a href="http://sththg.com" target="_blank">Ʒþþþþþ9999 </a>| <a href="http://tjpzgs.com" target="_blank">һӰ߹ۿ</a>| <a href="http://free18teen.com" target="_blank">ŷһ</a>| <a href="http://dacellflex.com" target="_blank">Ӱȷ޾Ʒ</a>| <a href="http://hsxinbao.com" target="_blank">ŷձƵ</a>| <a href="http://hwgjcm.com" target="_blank">ŷһպ</a>| <a href="http://wewe520.com" target="_blank">޳</a>| <a href="http://www5566szy.com" target="_blank">ŷ߲</a>| <a href="http://335848.com" target="_blank">޹Ʒۺ</a>| <a href="http://0855dyw.com" target="_blank">ŷػһ</a>| <a href="http://xingmaokeji.com" target="_blank">þƵƵ</a>| <a href="http://2938423.com" target="_blank">һþaþѾƷ</a>| <a href="http://ckk755.com" target="_blank">þseƷһ</a>| <a href="http://kk8c.com" target="_blank">պҹavӰ</a>| <a href="http://cqrebo.com" target="_blank">һ߹ۿվ </a>| <a href="http://hsxinbao.com" target="_blank">߹ۿһ</a>| <a href="http://www-988900.com" target="_blank">ŷպ</a>| <a href="http://77777de.com" target="_blank">þƬҹӰ</a>| <a href="http://668www.com" target="_blank">av</a>| <a href="http://sclddn.com" target="_blank">þۺϾɫŷۺϺݺ</a>| <a href="http://csmgxun.com" target="_blank">ҹɫ</a>| <a href="http://vvvv81.com" target="_blank">޹Ʒva߿˶ </a>| <a href="http://zhuankee.com" target="_blank">ŷ997þۺ</a>| <a href="http://kk5551.com" target="_blank">ŷ߹ۿ</a>| <a href="http://767296.com" target="_blank">ŷӰԺ</a>| <a href="http://k82net.com" target="_blank">ƵƷһ</a>| <a href="http://cuucs.com" target="_blank">ŷպ</a>| <a href="http://www224558.com" target="_blank">鶹Ʒһ</a>| <a href="http://3dmh133.com" target="_blank">ҹƬһ</a>| <a href="http://jkllkg.com" target="_blank">պҹ</a>| <a href="http://444al.com" target="_blank">պav</a>| <a href="http://749996.com" target="_blank">߹ۿ</a>| <a href="http://jjy891.com" target="_blank">ģ˽Ƶһ</a>| <a href="http://sdxinqi.com" target="_blank">Ʒ</a>| <a href="http://ff9222.com" target="_blank">ŷպ߲һ</a>| <a href="http://henhenai1.com" target="_blank">ѳav߿</a>| <a href="http://www-401313.com" target="_blank">ŷջƵ</a>| <a href="http://1000078.com" target="_blank">ŷպƷ</a>| <a href="http://caokk1.com" target="_blank">av</a>| <a href="http://www-401313.com" target="_blank">ձƵ</a>| <a href="http://mkaqiu.com" target="_blank">޼¶</a>| <a href="http://ynjzwh.com" target="_blank">һŷƬ߲</a>| <a href="http://aa56789.com" target="_blank">þþ999Ʒ</a>| <a href="http://b1768.com" target="_blank">þðwww.</a>| <a href="http://456dv.com" target="_blank">ŷĻ߲</a>| <a href="http://85181890.com" target="_blank">ԴۿվƵѲ</a>| <a href="http://booyitech.com" target="_blank">޹av</a>| <a href="http://maogo666.com" target="_blank">˳ۺϵӰ</a>| <a href="http://idc0558.com" target="_blank">ŷ997þۺ</a>| <a href="http://710191.com" target="_blank">Ʒ߹ۿ</a>| <a href="http://491342.com" target="_blank">ŷҹƵվ</a>| <a href="http://9a5x.com" target="_blank">ŷҹƬ߹ۿ</a>| <a href="http://216667.com" target="_blank">ŷҹլӰԺ</a>| <a href="http://rxbbei.com" target="_blank">Ʒ2ҳ</a>| <a href="http://js6996.com" target="_blank">Ʒ۲99a</a>| <a href="http://444398.com" target="_blank">Ʒ</a>| <a href="http://428368.com" target="_blank">ҹƷþþþþ</a>| <a href="http://www-36900.com" target="_blank">Ʒý</a>| <a href="http://5588gww.com" target="_blank">ŷպۺ</a>| <a href="http://8868866.com" target="_blank">ŷһɫͷ</a>| <a href="http://tareandshare.com" target="_blank">պŷһ</a>| <a href="http://ydpszcn.com" target="_blank">ŷձһ</a>| <a href="http://188267.com" target="_blank">һ߹ۿ </a>| <a href="http://yujiaosanye.com" target="_blank">պŷƵ</a>| <a href="http://88848885.com" target="_blank">վ</a>| <a href="http://lctongda.com" target="_blank">һ</a>| <a href="http://xxx444vip.com" target="_blank">һҹ</a>| <a href="http://17kfe.com" target="_blank">ҹƷþþþ99ҵ</a>| <a href="http://7788444.com" target="_blank">ȷӰһ</a>| <a href="http://995688.com" target="_blank">ŷһѹۿ</a>| <a href="http://580078.com" target="_blank">þùھƷƵ</a>| <a href="http://74w4.com" target="_blank">ŷһ߹ۿ</a>| <a href="http://hbstjsgc.com" target="_blank">ŷ1ҳ</a>| <a href="http://chunshanketang.com" target="_blank">ŷ</a>| <a href="http://huaihuaihuai.com" target="_blank">һƵ</a>| <a href="http://wwwhaodd116.com" target="_blank">˱˸߳</a>| <a href="http://free18teen.com" target="_blank">ҹҹҹþþ</a>| <a href="http://44779c.com" target="_blank">þøһ</a>| <a href="http://1194123.com" target="_blank">޹һ߲</a>| <a href="http://188267.com" target="_blank">պ޹Ʒ</a>| <a href="http://avjj80.com" target="_blank">ŷһһ</a>| <a href="http://www149aa.com" target="_blank">þһ</a>| <a href="http://ewaygou.com" target="_blank">ŷ߹ۿ</a>| <a href="http://hafenchen.com" target="_blank">һ߹ۿƵ</a>| <a href="http://2323nn.com" target="_blank">߾Ʒۺ</a>| <a href="http://jybiotek.com" target="_blank">Ƶŷ</a>| <a href="http://337791.com" target="_blank">þþþþþۺϺݺۺ</a>| <a href="http://caobenfan1891.com" target="_blank">޵һҳ</a>| <a href="http://qqkanp.com" target="_blank">һ߹ۿѹۿӰ</a>| <a href="http://10669p.com" target="_blank">þavԴ</a>| <a href="http://scqike.com" target="_blank">ŷպйר߿</a>| <a href="http://www-xj788.com" target="_blank">ó˾þavѸ </a>| <a href="http://844985.com" target="_blank">޾Ʒ͵</a>| <a href="http://ju5556.com" target="_blank">þþƷһ</a>| <a href="http://wwdd44.com" target="_blank">޹þþۺ</a>| <a href="http://aass123.com" target="_blank">һ</a>| <a href="http://238918.com" target="_blank">ŷˮƵ</a>| <a href="http://667996.com" target="_blank">߾Ʒһ</a>| <a href="http://26thb.com" target="_blank">ŷ</a>| <a href="http://48655aa.com" target="_blank">޾ѡ</a>| <a href="http://www442222.com" target="_blank">þһ</a>| <a href="http://163263.com" target="_blank">һƷþ99</a>| <a href="http://3333577.com" target="_blank">99Ʒþþþþþ</a>| <a href="http://lovehefei.com" target="_blank">þþۺ</a>| <a href="http://www-55655.com" target="_blank">ٸһ</a>| <a href="http://ssis378.com" target="_blank">ŷþþž</a>| <a href="http://5456yy.com" target="_blank">޹ѿ</a>| <a href="http://2502255.com" target="_blank">þþþúݺ50</a>| <a href="http://j88866.com" target="_blank">һ岻</a>| <a href="http://gx2020.com" target="_blank">ŷɫƬ</a>| <a href="http://liuyangzi.com" target="_blank">޸岻av</a>| <a href="http://155fck.com" target="_blank">þƵ</a>| <a href="http://3233328.com" target="_blank">ҹþӰԺ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>