﻿<?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,再见！高德-随笔分类-TCE</title><link>http://www.cppblog.com/socketref/category/20676.html</link><description>https://github.com/adoggie</description><language>zh-cn</language><lastBuildDate>Mon, 19 Sep 2016 21:56:57 GMT</lastBuildDate><pubDate>Mon, 19 Sep 2016 21:56:57 GMT</pubDate><ttl>60</ttl><item><title>TCE － 小型的RPC通信引擎库 介绍</title><link>http://www.cppblog.com/socketref/archive/2016/09/18/214280.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Sun, 18 Sep 2016 08:03:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2016/09/18/214280.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/214280.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2016/09/18/214280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/214280.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/214280.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 项目地址: http://github.com/adoggie/TCE  从12年的时候开始想做一个rpc的东东，这些年来陆陆续续往里面增加不同的功能、特点。<br>tce是一个 全栈的东西，并不是 protocalbuf，或者接近 thrift。 支持语言: csharp,python,java,objc,javascript,actionscript,c++,我想这些够了。 <br>&nbsp;&nbsp;<a href='http://www.cppblog.com/socketref/archive/2016/09/18/214280.html'>阅读全文</a><img src ="http://www.cppblog.com/socketref/aggbug/214280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2016-09-18 16:03 <a href="http://www.cppblog.com/socketref/archive/2016/09/18/214280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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><item><title>tce for python</title><link>http://www.cppblog.com/socketref/archive/2013/10/02/203519.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Tue, 01 Oct 2013 19:18:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2013/10/02/203519.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/203519.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2013/10/02/203519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/203519.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/203519.html</trackback:ping><description><![CDATA[<div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">idl的保留关键字：'byte','bool','short','int','long','float','double','string' ,均不能用于定义module,class,interface和变量名称</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><span style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">定义的变量名称如果包含以下单词：'def','import','from','type','str','int','float','class' , tce生成python代码时自动给添加'_'后缀，比如：&nbsp;</span><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp;struct xx{</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp;string name;</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp;string from;&nbsp;</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">}<br /><div>xx结构的from变量名将生成from_</div><div></div><div>接口定义：</div><div>module test{</div><div>&nbsp; &nbsp; &nbsp;dictionary&lt;string,string&gt; Properties_t;</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sequence&lt;string&gt; IpAddressList_t;</div><div>&nbsp; &nbsp; &nbsp;</div><div>&nbsp; &nbsp; &nbsp;interface ITerminal{</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void onGetServerMessage(string text);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><div></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interface Server{</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IpAddressList_t getIpAddresses();&nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Properties_t &nbsp;getProperties();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void ping(string fromhost);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string login(string user,string passwd,ctx);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};</div><div>}</div><div></div><div>struct:&nbsp;</div><div>tce将结构struct映射为class对象 ，初始化成员变量并创建散列函数 marshall/unmarshall</div><div></div><div></div><div></div><div>sequence&lt;T&gt;:&nbsp;</div><div>tce将数组类型直接映射为[]</div><div>例如 : &nbsp;</div><div></div><div>dictionary&lt;K,V&gt;&nbsp;</div><div>tce将字典映射为 {}</div><div></div><div>python实现Server接口的getIpAddresses()方法:&nbsp;</div><div>&nbsp; def &nbsp;getIpAddresses():</div><div>&nbsp; &nbsp; &nbsp; &nbsp;return ['192.168.14.101','192.168.12.50']</div><div></div><div>定义服务器接口实现：&nbsp;</div><div>tce为interface生成接口基类:&nbsp;class Server</div><div>我们提供一个实现类 :&nbsp;</div><div>class ServerImpl(Server):</div><div>&nbsp; &nbsp; def __init__(self):</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Server.__init__(self)</div><div></div><div>&nbsp; &nbsp;def getIpAddresses(self,ctx):</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return []</div><div></div><div></div><div>在这里我们提供了ServerImpl类，然后编写实现函数getIpAddresses. 每个接口函数都携带ctx参数，ctx携带rpc请求的附属信息，比如： 外带数据(dict),底部的连接对象 等等 。&nbsp;</div><div>服务接口被称为一个服务类servant ,接下来演示如何将这个servant装配并提供客户。&nbsp;</div><div></div><div>tce.RpcCommunicator.instance().init()</div><div>ep = tce.RpcEndPoint(host='127.0.0.1',port=16005) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 定义一个通信端点</div><div>adapter = tce.RpcCommunicator.instance().createAdapter('first_server',ep) 创建一个通信适配器</div><div>servant = ServerImpl() &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;创建服务接口对象</div><div>adapter.addServant(servant) &nbsp;添加进适配器<br /> tce.RpcCommunicator.instance().waitForShutdown() &nbsp; 进入通信循环&nbsp;</div><div></div><div>调用服务：&nbsp;</div><div>tce.RpcCommunicator.instance().init()</div><div>prx = test.ServerProxy.create(127.0.0.1,16005)</div><div>ips = prx.getIpAddresses()</div><div></div><div>多种呼叫模式:&nbsp;</div><div>tce将接口函数自动生成 normal,oneway,async三种调用接口方法 ，rpc调用出现异常，底部将抛出异常，所以用户需要异常捕获。</div><div>1.normal:&nbsp;</div><div>&nbsp; &nbsp; 原型: &nbsp; &nbsp; fun_name(参数..,timeout=0,extra=None)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 调用函数自动添加timeout,extra参数。timeout默认为0，将自动采用tce默认的30s等待调用返回时间；</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; extra 指此次调用携带的附属数据，extra ={'name':'scott','age':100}</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; extra数据在服务端接口函数的ctx中获取： ctx.msg.extra&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 函数调用时将阻塞客户线程，直到timeout超时或者服务器数据返回</div><div></div><div>2. oneway</div><div>&nbsp; &nbsp; fun_name_oneway(参数...,extra=None)</div><div>&nbsp; &nbsp; &nbsp;只有类型void的接口函数才会生成oneway调用方法.oneway调用不会阻塞用户线程，通常用于单向传输的场景，例如&nbsp;Server接口的ping()函数</div><div></div><div>3. async&nbsp;</div><div>&nbsp; &nbsp; &nbsp;fun_name_async(参数,async_callback,extra=None)</div><div>&nbsp; &nbsp; &nbsp;异步调用模式不会阻塞客户线程，async_callback指定了rpc调用的返回接收函数</div><div>&nbsp; &nbsp; &nbsp;接收函数原型: &nbsp;void fun_name_CallBack(result,proxy)</div><div>&nbsp; &nbsp; &nbsp; 例如：　</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; def&nbsp;getIpAddressesResult(result,proxy):</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;print result &nbsp; #result -&nbsp;IpAddressList_t</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prx.getIpAddresses_async(getIpAddressesResult)</div><div></div><div></div></div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">*连接复用</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; 在互联网应用场景，服务器将接入大量的客户端设备，客户端是不能被寻址，所以服务器要完成推送消息给客户端，必须在客户端建立的连接上反向传输。&nbsp;</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; tce使这个工作变得相当简单：</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; 1. 客户端定义接收消息的接口 ITerminal,定义接收函数onGetServerMessage()</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; class TermnialImpl(ITerminal):</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;...</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;2. 创建到服务器的连接代理</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;tce.RpcCommunicator.instance().init()</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prx = test.ServerProxy.create(127.0.0.1,16005) &nbsp;<a>创建但并不马上连接</a></div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;3. 添加服务类实现</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;adapter = tce.RpcCommAdapter('adapter')</div><span style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; impl = TerminalImpl()</span><br style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;" /><span style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adapter.addConnection(prx.conn)</span><br style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;" /><span style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.addServant(impl) &nbsp; &nbsp; 加到通信器对象</span><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;3. &nbsp;请求一次调用</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prx.login('scott','1234')</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;4. &nbsp; 服务器端反向调用ITerminal的onGetServerMessage()</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; def login(self,user,passwd,ctx):</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;prx = ITerminalProxy(ctx.conn)</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;prx.onGetServerMessage('server message..') &nbsp; &nbsp; 完成一次对设备端的接口调用</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div></div><img src ="http://www.cppblog.com/socketref/aggbug/203519.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-10-02 03:18 <a href="http://www.cppblog.com/socketref/archive/2013/10/02/203519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>