??xml version="1.0" encoding="utf-8" standalone="yes"?>国产欧美日韩综合一区在线播放,美女视频一区免费观看,欧美在线观看日本一区http://m.shnenglu.com/eXile/archive/2010/01/11/105422.htmleXileeXileMon, 11 Jan 2010 11:48:00 GMThttp://m.shnenglu.com/eXile/archive/2010/01/11/105422.htmlhttp://m.shnenglu.com/eXile/comments/105422.htmlhttp://m.shnenglu.com/eXile/archive/2010/01/11/105422.html#Feedback11http://m.shnenglu.com/eXile/comments/commentRss/105422.htmlhttp://m.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://m.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://m.shnenglu.com/eXile/archive/2009/03/26/77897.html</guid><wfw:comment>http://m.shnenglu.com/eXile/comments/77897.html</wfw:comment><comments>http://m.shnenglu.com/eXile/archive/2009/03/26/77897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/eXile/comments/commentRss/77897.html</wfw:commentRss><trackback:ping>http://m.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://m.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://m.shnenglu.com/eXile/aggbug/77897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/eXile/" target="_blank">eXile</a> 2009-03-26 00:54 <a href="http://m.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://m.shnenglu.com/eXile/archive/2009/03/25/77890.htmleXileeXileWed, 25 Mar 2009 15:52:00 GMThttp://m.shnenglu.com/eXile/archive/2009/03/25/77890.htmlhttp://m.shnenglu.com/eXile/comments/77890.htmlhttp://m.shnenglu.com/eXile/archive/2009/03/25/77890.html#Feedback0http://m.shnenglu.com/eXile/comments/commentRss/77890.htmlhttp://m.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://m.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://m.shnenglu.com/eXile/archive/2009/01/04/ice.html</guid><wfw:comment>http://m.shnenglu.com/eXile/comments/71099.html</wfw:comment><comments>http://m.shnenglu.com/eXile/archive/2009/01/04/ice.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://m.shnenglu.com/eXile/comments/commentRss/71099.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/eXile/services/trackbacks/71099.html</trackback:ping><description><![CDATA[     摘要: 聊天室是一U典型的|络应用Q这个程序演CZICE框架的基本结构?nbsp; <a href='http://m.shnenglu.com/eXile/archive/2009/01/04/ice.html'>阅读全文</a><img src ="http://m.shnenglu.com/eXile/aggbug/71099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/eXile/" target="_blank">eXile</a> 2009-01-04 01:32 <a href="http://m.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://m.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://m.shnenglu.com/eXile/archive/2008/05/28/51430.html</guid><wfw:comment>http://m.shnenglu.com/eXile/comments/51430.html</wfw:comment><comments>http://m.shnenglu.com/eXile/archive/2008/05/28/51430.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://m.shnenglu.com/eXile/comments/commentRss/51430.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/eXile/services/trackbacks/51430.html</trackback:ping><description><![CDATA[     摘要: 利用boost::asio实现一个简单的服务器框?nbsp; <a href='http://m.shnenglu.com/eXile/archive/2008/05/28/51430.html'>阅读全文</a><img src ="http://m.shnenglu.com/eXile/aggbug/51430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/eXile/" target="_blank">eXile</a> 2008-05-28 21:00 <a href="http://m.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://m.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://m.shnenglu.com/eXile/archive/2008/05/22/50767.html</guid><wfw:comment>http://m.shnenglu.com/eXile/comments/50767.html</wfw:comment><comments>http://m.shnenglu.com/eXile/archive/2008/05/22/50767.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://m.shnenglu.com/eXile/comments/commentRss/50767.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/eXile/services/trackbacks/50767.html</trackback:ping><description><![CDATA[<br>原文地址: <a href="http://m.shnenglu.com/eXile">http://m.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://m.shnenglu.com/eXile/aggbug/50767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/eXile/" target="_blank">eXile</a> 2008-05-22 15:27 <a href="http://m.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://m.shnenglu.com/eXile/archive/2008/05/07/49072.htmleXileeXileTue, 06 May 2008 16:50:00 GMThttp://m.shnenglu.com/eXile/archive/2008/05/07/49072.htmlhttp://m.shnenglu.com/eXile/comments/49072.htmlhttp://m.shnenglu.com/eXile/archive/2008/05/07/49072.html#Feedback1http://m.shnenglu.com/eXile/comments/commentRss/49072.htmlhttp://m.shnenglu.com/eXile/services/trackbacks/49072.html



eXile 2008-05-07 00:50 发表评论
]]>
高性能服务器的多线E策?/title><link>http://m.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://m.shnenglu.com/eXile/archive/2008/03/06/multithread.html</guid><wfw:comment>http://m.shnenglu.com/eXile/comments/43780.html</wfw:comment><comments>http://m.shnenglu.com/eXile/archive/2008/03/06/multithread.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://m.shnenglu.com/eXile/comments/commentRss/43780.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/eXile/services/trackbacks/43780.html</trackback:ping><description><![CDATA[     摘要: Q一Q线E数量与U程池模?Q二Q多U程的内存池优化  <a href='http://m.shnenglu.com/eXile/archive/2008/03/06/multithread.html'>阅读全文</a><img src ="http://m.shnenglu.com/eXile/aggbug/43780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/eXile/" target="_blank">eXile</a> 2008-03-06 00:09 <a href="http://m.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://m.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://feiniao168.com" target="_blank">þþþø</a>| <a href="http://wwwok1965.com" target="_blank">޾þ</a>| <a href="http://hengbang50.com" target="_blank">ŷպ</a>| <a href="http://7a6a.com" target="_blank">ͼƬ͵</a>| <a href="http://smiczbb.com" target="_blank">߹ۿ</a>| <a href="http://482896.com" target="_blank">ŷƷһҳ</a>| <a href="http://7234hh.com" target="_blank">˾޾Ʒ</a>| <a href="http://044925.com" target="_blank">ŷҹ</a>| <a href="http://zzchanke.com" target="_blank">ŷҹþþ</a>| <a href="http://seyuav4.com" target="_blank">Ʒh߹ۿ</a>| <a href="http://apap77.com" target="_blank">Ʒһ</a>| <a href="http://www-699603.com" target="_blank">Ʒ</a>| <a href="http://ju5558.com" target="_blank">͵͵޸97cao</a>| <a href="http://551692.com" target="_blank">ŷպ߲</a>| <a href="http://fengboll.com" target="_blank">ŷպˮ</a>| <a href="http://xajtyd.com" target="_blank">ŷպߴ߶</a>| <a href="http://wwww20.com" target="_blank">ŷպva</a>| <a href="http://2016dp5330.com" target="_blank">ŷƷvպƷvƷv</a>| <a href="http://aimashe.com" target="_blank">ҾƷþþþþþӰԺ</a>| <a href="http://qmynong.com" target="_blank">ȾƷƵ߹ۿһ</a>| <a href="http://649929.com" target="_blank">ŷӰѹۿ</a>| <a href="http://www44448.com" target="_blank">ŷ߹ۿ</a>| <a href="http://chukewang.com" target="_blank">ŷƷþþþa</a>| <a href="http://jinlijun.com" target="_blank">ŷպ߲</a>| <a href="http://92ye.com" target="_blank">ƷDɫӴӴ</a>| <a href="http://mfgun.com" target="_blank">ѼƵ </a>| <a href="http://wansilv.com" target="_blank">˾þô߽ۺ</a>| <a href="http://9955377.com" target="_blank">߾Ʒۺ</a>| <a href="http://sihu121.com" target="_blank">ywҹƷƵ</a>| <a href="http://bkksd.com" target="_blank">޵һɫ</a>| <a href="http://oudaole.com" target="_blank">ҹƵ߹ۿ</a>| <a href="http://cn1357.com" target="_blank">þþƷۺ</a>| <a href="http://guanghezixun.com" target="_blank">Ƶվ</a>| <a href="http://77427xyz.com" target="_blank">޸Ƶһ</a>| <a href="http://baoyou118.com" target="_blank">һƷþ99</a>| <a href="http://scqike.com" target="_blank">ŷϵоƷ</a>| <a href="http://xxxx48.com" target="_blank">Ůһ</a>| <a href="http://aass22.com" target="_blank">Ƶһ</a>| <a href="http://ww323.com" target="_blank">ҹƷþ</a>| <a href="http://junmatek.com" target="_blank">Ƶһ</a>| <a href="http://211186.com" target="_blank">߾ƷƷ884a</a>| <a href="http://hankanzhan.com" target="_blank">Ʒۺɫ߹ۿ</a>| <a href="http://www-888593.com" target="_blank">þþþþþþþþþþþþþ</a>| <a href="http://85041960.com" target="_blank">޾ƷƵۿ</a>| <a href="http://7373se.com" target="_blank">ŷһպһ</a>| <a href="http://whrcjy.com" target="_blank">þþƷ30</a>| <a href="http://667996.com" target="_blank">þûɫӰԺ</a>| <a href="http://bgdete.com" target="_blank">ŷ</a>| <a href="http://6k7a.com" target="_blank">ŷavһ</a>| <a href="http://www-919198.com" target="_blank">޼Ӱ</a>| <a href="http://mishangmi.com" target="_blank">ŷպһ </a>| <a href="http://dk13studio.com" target="_blank">޾Ʒһ</a>| <a href="http://99999zc.com" target="_blank">ŷһƬþþþþþ</a>| <a href="http://unrealcopgmail.com" target="_blank">ŷvavaƵva</a>| <a href="http://ztsctgs.com" target="_blank">Ʒþþþþþþþþþ</a>| <a href="http://syruili.com" target="_blank">һɫݾƷ㽶վ</a>| <a href="http://gjjlzs.com" target="_blank">ڲһ</a>| <a href="http://3333328.com" target="_blank">aŹ˾Ʒ</a>| <a href="http://yp8882.com" target="_blank">ҹƷþ</a>| <a href="http://77mcn.com" target="_blank">ŷƵ</a>| <a href="http://qq5621.com" target="_blank">պƷ</a>| <a href="http://www895pao.com" target="_blank">һav</a>| <a href="http://ca88tv.com" target="_blank">Ƶһ</a>| <a href="http://e789a.com" target="_blank">޼</a>| <a href="http://www-65581.com" target="_blank">ŷһ˽ӰԺձ</a>| <a href="http://77smsm.com" target="_blank">ŷֻ</a>| <a href="http://zjjieda.com" target="_blank">޾ƷĻŮͬ</a>| <a href="http://ztsctgs.com" target="_blank">ŷȫ</a>| <a href="http://czjrby.com" target="_blank">þþۺϾƷ</a>| <a href="http://sdgs6788.com" target="_blank">ŷղ99</a>| <a href="http://aqdw2021.com" target="_blank">ƵƷһ</a>| <a href="http://8331651.com" target="_blank">޹av߲</a>| <a href="http://zz-777.com" target="_blank">ŷպۺ</a>| <a href="http://mm910.com" target="_blank">ŷҹĻ</a>| <a href="http://h7yy.com" target="_blank">޾Ʒþ۲վɫ</a>| <a href="http://sdhanm.com" target="_blank">ŷӰ߹ۿ</a>| <a href="http://pansinobbs.com" target="_blank">þþ91Ʒһ </a>| <a href="http://jafzjz.com" target="_blank">ëƬ</a>| <a href="http://lzklpc.com" target="_blank">þ޾ѡ</a>| <a href="http://ssis378.com" target="_blank">һ߲</a>| <a href="http://127mingdao.com" target="_blank">Ʒ99þþþþþŮ </a>| <a href="http://www-00468.com" target="_blank">ҹһ߹ۿ</a>| <a href="http://649929.com" target="_blank">ƷþþþþӰ </a>| <a href="http://xiaocao-av.com" target="_blank">þþƷƵ</a>| <a href="http://xsjgxx.com" target="_blank">ݺɫݺɫۺtg</a>| <a href="http://yh-hy.com" target="_blank">þþþþó</a>| <a href="http://486be.com" target="_blank">þþƷƵ</a>| <a href="http://119552.com" target="_blank">޹ŷһ</a>| <a href="http://konwoosh.com" target="_blank">ҹ</a>| <a href="http://www17bxbx.com" target="_blank">ҹҹavɫۺϾþþۺ</a>| <a href="http://gdvapar.com" target="_blank">þþþþҹ</a>| <a href="http://hu62.com" target="_blank">պavƬ</a>| <a href="http://7776701.com" target="_blank">ҹһ</a>| <a href="http://8946286.com" target="_blank">һëƬ</a>| <a href="http://97caoporm.com" target="_blank">þˬ</a>| <a href="http://sz-changrong.com" target="_blank">þƵۿ</a>| <a href="http://678255.com" target="_blank">޾</a>| <a href="http://b46n.com" target="_blank">޾Ʒһ </a>| <a href="http://lexueit.com" target="_blank">ȾƷƵѹۿ</a>| <a href="http://laoyewo.com" target="_blank">޹Ʒһ</a>| <a href="http://zztto7.com" target="_blank">ŷ˾Ʒ</a>| <a href="http://478884.com" target="_blank">ŷƵ߲</a>| <a href="http://m10669.com" target="_blank">99߾Ʒۿ</a>| <a href="http://337105.com" target="_blank"></a>| <a href="http://by3787.com" target="_blank">߾ƷƵһ</a>| <a href="http://436212.com" target="_blank">ŷ</a>| <a href="http://qq5621.com" target="_blank">Ӱ</a>| <a href="http://85995m.com" target="_blank">ۺƵ1</a>| <a href="http://av0333.com" target="_blank">ŷһƵѹۿ</a>| <a href="http://ywbst8g4tukcsqhioikc.com" target="_blank">ۺ</a>| <a href="http://syddzs.com" target="_blank">޹㶮</a>| <a href="http://7a6a.com" target="_blank">ƷŮջ</a>| <a href="http://by4433.com" target="_blank">Ƶ</a>| <a href="http://k82net.com" target="_blank">ŷɫƷ߹ۿƵ</a>| <a href="http://www-988900.com" target="_blank">ŷһƵ</a>| <a href="http://www-964664.com" target="_blank">þó˾ƷƵ</a>| <a href="http://by2735.com" target="_blank">һŷ</a>| <a href="http://4545www.com" target="_blank">þùƷһ</a>| <a href="http://missav88.com" target="_blank">99Ʒ99þþþþլ</a>| <a href="http://www89999.com" target="_blank">վƵ</a>| <a href="http://mmmm26.com" target="_blank"></a>| <a href="http://ynzhuoyi.com" target="_blank">ŷһƵ</a>| <a href="http://mimi78.com" target="_blank">һƷ</a>| <a href="http://obatshaka.com" target="_blank">þþþþþ999</a>| <a href="http://zytxkj.com" target="_blank">ƬƵ</a>| <a href="http://ju255.com" target="_blank">ůůƵ</a>| <a href="http://diao66.com" target="_blank">þþƷһ</a>| <a href="http://cfqcgw.com" target="_blank">ŷɫ</a>| <a href="http://feiniao168.com" target="_blank">þһ</a>| <a href="http://haochen072.com" target="_blank">Ʒ</a>| <a href="http://wg246.com" target="_blank">ƷƵ</a>| <a href="http://340332.com" target="_blank">۲˾þþƷٸav</a>| <a href="http://jiangnanmm.com" target="_blank">޾ѡ91</a>| <a href="http://49028b.com" target="_blank">һ</a>| <a href="http://yc0989.com" target="_blank">Ƶվ</a>| <a href="http://k82net.com" target="_blank">ŷҹ</a>| <a href="http://jldianda.com" target="_blank">ŷպۺһ</a>| <a href="http://0070571.com" target="_blank">ŷһƷӰ</a>| <a href="http://gztgo.com" target="_blank">þþƷӿ</a>| <a href="http://maiiyou.com" target="_blank">պҹ߳</a>| <a href="http://977764.com" target="_blank">ŷ߲Ƶ</a>| <a href="http://huaihuaihuai.com" target="_blank">ŷպ</a>| <a href="http://www-26333com.com" target="_blank">ŷ龫Ʒþþþþӡ</a>| <a href="http://wxtarena.com" target="_blank">þþøһ</a>| <a href="http://794278.com" target="_blank">ŷ޵ӰԺ߹ۿ</a>| <a href="http://555hhu.com" target="_blank">ŷĻ</a>| <a href="http://www77vcd.com" target="_blank">Ʒ˹</a>| <a href="http://gzxyh88.com" target="_blank">þþƷ</a>| <a href="http://456985.com" target="_blank">ѳŷƵ</a>| <a href="http://3848404.com" target="_blank">ƷƵ㶮</a>| <a href="http://993934.com" target="_blank">һɫþۺ91</a>| <a href="http://bjrailtech.com" target="_blank">޾Ʒպ߹ۿ</a>| <a href="http://91sp136.com" target="_blank">˵ƵwwwƷ</a>| <a href="http://033232.com" target="_blank">þۺɫ</a>| <a href="http://wwwnnnn.com" target="_blank">óƵ</a>| <a href="http://32666066.com" target="_blank">ŷһƵ </a>| <a href="http://6aaee.com" target="_blank">ŷƵ</a>| <a href="http://gdvapar.com" target="_blank">91þþƷ91ɫ</a>| <a href="http://72966t.com" target="_blank">Ʒպ߹ۿ</a>| <a href="http://0000zz.com" target="_blank">պ</a>| <a href="http://cm168168.com" target="_blank">ƷŮҹav</a>| <a href="http://1616mz.com" target="_blank">ŷ޾ƷһҰ1ս4</a>| <a href="http://ll992.com" target="_blank">ŷ߹ۿ</a>| <a href="http://qiezi2vip.com" target="_blank">޾ƷĻŮͬ</a>| <a href="http://833816.com" target="_blank">һƵ ҹŷ'</a>| <a href="http://428368.com" target="_blank">߹ۿav</a>| <a href="http://66gg6.com" target="_blank">޵һ99Ʒ</a>| <a href="http://173881.com" target="_blank">Ļһ</a>| <a href="http://y66776.com" target="_blank">ŷһ</a>| <a href="http://www433ad.com" target="_blank">޸</a>| <a href="http://305838.com" target="_blank">һƵ߹ۿ</a>| <a href="http://senlin86.com" target="_blank">ŷƷӰ</a>| <a href="http://www789yys.com" target="_blank">һþaþþƷۺ </a>| <a href="http://yye321.com" target="_blank">Ʒҽ</a>| <a href="http://submro.com" target="_blank">ҹƷþ99ҵĹܽ</a>| <a href="http://8090567.com" target="_blank">ŷһ˾ </a>| <a href="http://9906w.com" target="_blank">þ޾ƷĻ </a>| <a href="http://9kkkb.com" target="_blank">þþþþþһ</a>| <a href="http://jxrisen.com" target="_blank">ŷɫһ</a>| <a href="http://333666333.com" target="_blank">й˻ɫ</a>| <a href="http://899399com.com" target="_blank">ƷȰǿˬˬˬվ</a>| <a href="http://2ejj.com" target="_blank">ŷһ</a>| <a href="http://lorgou.com" target="_blank">þþƷþһ</a>| <a href="http://muwendada.com" target="_blank">һһ</a>| <a href="http://www789yys.com" target="_blank">ջպav</a>| <a href="http://erodasy.com" target="_blank">޾Ʒһ</a>| <a href="http://5456yy.com" target="_blank">ŷһ߲</a>| <a href="http://www-919198.com" target="_blank">޵Ӱ߲</a>| <a href="http://02326a.com" target="_blank">ŷպձƵ</a>| <a href="http://uuclassroom.com" target="_blank">þseƷһ</a>| <a href="http://www-273111.com" target="_blank">ŷ޼</a>| <a href="http://huabiseeds.com" target="_blank">ҹŷƷaaaaa</a>| <a href="http://lianjiemenye.com" target="_blank">һƷ˿</a>| <a href="http://naturalgiftfashion.com" target="_blank">ȾƷƵ</a>| <a href="http://689657.com" target="_blank">һŷ</a>| <a href="http://xdlot.com" target="_blank">޵һav</a>| <a href="http://5767j.com" target="_blank">þóԴ</a>| <a href="http://gztcm01.com" target="_blank">һƵ߹ۿ</a>| <a href="http://hankanzhan.com" target="_blank">ƷƵƷƵ</a>| <a href="http://www-919198.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>