﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-socketref,再见！高德-随笔分类-easyMQ</title><link>http://www.cppblog.com/socketref/category/20677.html</link><description>gis,mouse,luolasi</description><language>zh-cn</language><lastBuildDate>Mon, 25 Nov 2013 17:25:16 GMT</lastBuildDate><pubDate>Mon, 25 Nov 2013 17:25:16 GMT</pubDate><ttl>60</ttl><item><title>RPC demo: 实现认证服务器接口</title><link>http://www.cppblog.com/socketref/archive/2013/11/26/204441.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Mon, 25 Nov 2013 16:53:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2013/11/26/204441.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/204441.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2013/11/26/204441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/204441.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/204441.html</trackback:ping><description><![CDATA[接口定义：&nbsp;<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;IAuthServer{<br /><span style="color: #008080; ">2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CallReturn_t&nbsp;userAuth(string&nbsp;user,string&nbsp;passwd,<span style="color: #0000FF; ">int</span>&nbsp;device_type);<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CallReturn_t&nbsp;registerUser(UserRegisterInfo_t&nbsp;reginfo);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;tested</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #008000; "></span>};</div>定义认证服务器接口，userAuth()返回认证用户的token<br /><br />接口服务实现：&nbsp;<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;os,os.path,sys,struct,time,traceback,signal,threading,copy,base64<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;datetime,base64<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;datetime&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;datetime<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;base&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;*<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;tcelib&nbsp;as&nbsp;tce<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;showbox&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;*<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;utils.misc<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;utils.config<br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;utils.cipher<br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;os.environ.setdefault(<span style="color: #800000; ">"</span><span style="color: #800000; ">DJANGO_SETTINGS_MODULE</span><span style="color: #800000; ">"</span>,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">database.showbox.showbox.settings</span><span style="color: #800000; ">"</span>)<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;django.db&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;connection<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;django.db.models&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;Sum<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;django.db&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;transaction<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;import&nbsp;sns.core.models&nbsp;as&nbsp;cm</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">import</span>&nbsp;database.showbox.core.models&nbsp;as&nbsp;&nbsp;core<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;database.showbox.nosql.models&nbsp;as&nbsp;nosql<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;AuthServerImpl(IAuthServer):<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;<span style="color: #800080; ">__init__</span>(self,app):<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAuthServer.<span style="color: #800080; ">__init__</span>(self)<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.app&nbsp;=&nbsp;app<br /><span style="color: #008080; ">26</span>&nbsp;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;userAuth(self,&nbsp;user,&nbsp;passwd,&nbsp;device_type,&nbsp;ctx):<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cr&nbsp;=&nbsp;CallReturn_t()<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>:<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;=&nbsp;core.User.objects.get(user=user,passwd=passwd)<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userinfo&nbsp;=&nbsp;{<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">id</span><span style="color: #800000; ">"</span>:r.id,<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">user</span><span style="color: #800000; ">"</span>:user,<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">name</span><span style="color: #800000; ">"</span>:r.name,<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">login_time</span><span style="color: #800000; ">"</span>:int(time.time()),<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">user_type</span><span style="color: #800000; ">"</span>:SnsConsts.Authorized_User<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token&nbsp;=&nbsp;utils.cipher.encryptToken(userinfo)<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cr.value&nbsp;=&nbsp;token<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">except</span>:<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;traceback.format_exc()<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cr&nbsp;=&nbsp;CallReturn_Error()<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cr<br /><span style="color: #008080; ">44</span>&nbsp;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;registerUser(self,&nbsp;reginfo,&nbsp;ctx):<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IAuthServer.registerUser(self,&nbsp;reginfo,&nbsp;ctx)<br /><span style="color: #008080; ">47</span>&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;<br /><span style="color: #008080; ">49</span>&nbsp;<br /><span style="color: #008080; ">50</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ServerApp:<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;<span style="color: #800080; ">__init__</span>(self):<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">pass</span><br /><span style="color: #008080; ">53</span>&nbsp;<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;getConfig(self):<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">return&nbsp;self.app.getConfig()</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">pass</span><br /><span style="color: #008080; ">57</span>&nbsp;<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_handle&nbsp;=&nbsp;None<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@classmethod<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;instance(cls):<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;cls._handle&nbsp;==&nbsp;None:<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cls._handle&nbsp;=&nbsp;cls()<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cls._handle<br /><span style="color: #008080; ">64</span>&nbsp;<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;run(self):<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tce.RpcCommunicator.instance().init(<span style="color: #800000; ">'</span><span style="color: #800000; ">authserver</span><span style="color: #800000; ">'</span>).initMessageRoute(<span style="color: #800000; ">'</span><span style="color: #800000; ">./services.xml</span><span style="color: #800000; ">'</span>)<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server&nbsp;=&nbsp;tce.RpcCommunicator.instance().currentServer().findEndPointByName(<span style="color: #800000; ">'</span><span style="color: #800000; ">mq_authserver</span><span style="color: #800000; ">'</span>).impl<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adapter&nbsp;&nbsp;=&nbsp;tce.RpcAdapterEasyMQ.create(<span style="color: #800000; ">'</span><span style="color: #800000; ">server</span><span style="color: #800000; ">'</span>,server)<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">没有主动发送消息的情形</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servant&nbsp;=&nbsp;AuthServerImpl(self)<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adapter.addServant(servant)<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tce.RpcCommunicator.instance().waitForShutdown()<br /><span style="color: #008080; ">73</span>&nbsp;<br /><span style="color: #008080; ">74</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;<span style="color: #800080; ">__name__</span>&nbsp;==&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">__main__</span><span style="color: #800000; ">'</span>:<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerApp.instance().run()</div><br />服务器很简单，实现接口IAuthService的功能函数，定义一个ServerApp，然后运行&nbsp;<br /><br />客户调用测试：<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;datetime&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;datetime<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;base&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;*<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;tcelib&nbsp;as&nbsp;tce<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;showbox&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;*<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;utils.misc<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;utils.config<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;utils.cipher<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;userAuthResult(result,prx):<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;result<br /><span style="color: #008080; ">12</span>&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;queue:client&nbsp;必须在调用服务器的write&nbsp;队列mq</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; "></span>communicator&nbsp;=tce.RpcCommunicator.instance().init()<br /><span style="color: #008080; ">15</span>&nbsp;conn&nbsp;=&nbsp;tce.RpcConnectionEasyMQ.create(<span style="color: #800000; ">'</span><span style="color: #800000; ">127.0.0.1</span><span style="color: #800000; ">'</span>,12301,<span style="color: #800000; ">'</span><span style="color: #800000; ">queue:mq_authserver</span><span style="color: #800000; ">'</span>)<br /><span style="color: #008080; ">16</span>&nbsp;local&nbsp;=&nbsp;tce.RpcConnectionEasyMQ.create(<span style="color: #800000; ">'</span><span style="color: #800000; ">127.0.0.1</span><span style="color: #800000; ">'</span>,12301,<span style="color: #800000; ">'</span><span style="color: #800000; ">queue:mq_test_client</span><span style="color: #800000; ">'</span>,tce.AF_READ)<br /><span style="color: #008080; ">17</span>&nbsp;conn.setLoopbackMQ(local)<br /><span style="color: #008080; ">18</span>&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;prx&nbsp;=&nbsp;IAuthServerPrx(conn)<br /><span style="color: #008080; ">21</span>&nbsp;prx.userAuth_async(<span style="color: #800000; ">'</span><span style="color: #800000; ">test</span><span style="color: #800000; ">'</span>,<span style="color: #800000; ">'</span><span style="color: #800000; ">111111</span><span style="color: #800000; ">'</span>,1,userAuthResult)&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">异步调用</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">print</span>&nbsp;prx.userAuth(<span style="color: #800000; ">'</span><span style="color: #800000; ">test</span><span style="color: #800000; ">'</span>,<span style="color: #800000; ">'</span><span style="color: #800000; ">111111</span><span style="color: #800000; ">'</span>,1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">同步调用</span></div><br />21,22行分别测试两种调用模式<br /><br /><br />client与server通过EasyMQ进行传递<br />easyMQ是个最简单的消息队列实现<br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/socketref/aggbug/204441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2013-11-26 00:53 <a href="http://www.cppblog.com/socketref/archive/2013/11/26/204441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>