﻿<?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++博客-Sheppard Y-随笔分类-其他语言</title><link>http://www.cppblog.com/yangsf5/category/20466.html</link><description>keep thinking keep coding.</description><language>zh-cn</language><lastBuildDate>Sat, 16 Jul 2016 03:55:26 GMT</lastBuildDate><pubDate>Sat, 16 Jul 2016 03:55:26 GMT</pubDate><ttl>60</ttl><item><title>一次简单的hack</title><link>http://www.cppblog.com/yangsf5/archive/2014/05/15/206970.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Thu, 15 May 2014 03:11:00 GMT</pubDate><guid>http://www.cppblog.com/yangsf5/archive/2014/05/15/206970.html</guid><wfw:comment>http://www.cppblog.com/yangsf5/comments/206970.html</wfw:comment><comments>http://www.cppblog.com/yangsf5/archive/2014/05/15/206970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yangsf5/comments/commentRss/206970.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yangsf5/services/trackbacks/206970.html</trackback:ping><description><![CDATA[<div><div></div><fieldset><legend><span style="color: #ff0000; line-height: normal;">2016-07-12 日更新&nbsp;</span></legend><div><span style="line-height:normal;color:red;">此篇博客已经迁移到新博客，并做行文检查和优化排版：<br /></span><div></div></div><a href="http://blog.clawz.me/2014/05/15/14-a-easy-hack/"><div><div><span style="color:red;">http://blog.clawz.me/2014/05/15/14-a-easy-hack/</span></div></div></a></fieldset><a href="http://blog.clawz.me/2014/05/15/14-a-easy-hack/"><div><div></div></div><span style="orphans: 2; text-align: -webkit-auto; widows: 2;"></span></a><span style="orphans: 2; text-align: -webkit-auto; widows: 2;"><br /><font face="微软雅黑" size="3"><span style="line-height: normal;">一、背景</span></font></span><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;朋友公司有款老软件，运行在windows下，C/S架构。客户端为很久前外包开发的。这个客户端为GUI界面。朋友想定时自动让软件做些事情。这个客户端以前设计时没有提供这种定时功能，只有每次执行当次的操作。朋友自己对软件开发不熟，如是找到我。</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">二、朋友给的解决方案</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;他表示做个按键脚本之类的，定时的去模拟在客户端上的单次操作。</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">三、我的解决方案</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">（一）了解需求</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;这是C/S架构，之前是每次鼠标点击后，客户端给服务器发送相应的网络包。现在要做的是破解这个协议，然后自己写程序定时发送对应协议的网络包即可。</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">（二）解决方案</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;朋友的解决方案，对于擅长客户端的人是可以的。但是我不怎么擅长，会花不少时间。</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;所以我选择我自己更擅长的网络编程。如上边说的，先破解协议，然后想干啥就非常方便了。</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">四、解决过程</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">（一）破解协议</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;本想找个协议监听软件，我来远程操作就行了，但是他们使用环境公网无法连入。如果我写文档让他来按步骤走，对于非专业人士来说也挺费事的。</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;随后我想到他们的行业不那么互联网，他们联系的外包素质应该不是那么高。估计也就是windows那套.net搞的，顶多也就java搞的。所以让他把客户端拷出外网，我来反编译试试。同时我去网上查下.net的反编效果，有网游表示没有混效果的C#代码反编出来跟源代码基本没啥区别，另外以前反编译过java，反编得的代码也跟原工程差不多。所以开始淡定的祈祷反编顺利。</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;看了眼客户端里的各文件，感觉到是C#，找了个dotPeek，反编译出来相当清晰。（这玩意的反编译效果比以前反编译flash的代码还清晰，flah反编译后的变量名基本编程local1之流了，这个C#反编出来变量名都是好的）</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">（二）分析协议</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;C#代码虽没写过，但是语法跟Java/C++非常像。分析起来不是很费劲。</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;果然代码写的很windows的.net，客户端直接连接的数据库，然后在客户单发起select之类的查询语句。数据库表和字段名基本是中文拼音首字母。</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;后来具体逻辑也懒得看，直接找到数据库的配置，让朋友在内网装个数据库客户端，连数据库看表里数据了。让他比对表里数据和客户端软件上显示的数据对比，找出咱们要的哪几个字段。</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">（三）实现需求</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;这个是整个过程里最简单的了。用了自己最喜欢的golang写了个没有GUI的程序，定时给他去数据库查想要的数据。</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">五、后记</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;整个过程的顺利多亏给他们写外包的公司用的C#，还没有做代码混淆之类的。</div></div><img src ="http://www.cppblog.com/yangsf5/aggbug/206970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yangsf5/" target="_blank">Sheppard Y</a> 2014-05-15 11:11 <a href="http://www.cppblog.com/yangsf5/archive/2014/05/15/206970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开始学习Common Lisp</title><link>http://www.cppblog.com/yangsf5/archive/2013/09/15/203239.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Sun, 15 Sep 2013 03:25:00 GMT</pubDate><guid>http://www.cppblog.com/yangsf5/archive/2013/09/15/203239.html</guid><wfw:comment>http://www.cppblog.com/yangsf5/comments/203239.html</wfw:comment><comments>http://www.cppblog.com/yangsf5/archive/2013/09/15/203239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yangsf5/comments/commentRss/203239.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yangsf5/services/trackbacks/203239.html</trackback:ping><description><![CDATA[<div></div><fieldset><legend><span style="color: #ff0000;">2016-07-11 日更新&nbsp;</span></legend><div><span style="color:red;">此篇博客已经迁移到新博客，并做行文检查和优化排版：</span></div><div><span style="color:red;"><a href="http://blog.clawz.me/2013/09/15/13-common-lisp/"><span style="color:red;">http://blog.clawz.me/2013/09/15/13-common-lisp/</span></a></span></div></fieldset><div><span style="color: red;"><a href="http://blog.clawz.me/2013/09/15/13-common-lisp/"></a></span></div><p><br />一、为何想学lisp</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;最初了解lisp是从《黑客与画家》里，里边的黑客强烈推荐程序员用lisp，并有部分讲《为什么lisp语言如此先进？》，书是阮一峰翻译的，这节在他的博客也有节选：</p> <p><a href="http://www.ruanyifeng.com/blog/2010/10/why_lisp_is_superior.html" _href="http://www.ruanyifeng.com/blog/2010/10/why_lisp_is_superior.html">&nbsp;&nbsp;&nbsp;&nbsp;&#8203;http://www.ruanyifeng.com/blog/2010/10/why_lisp_is_superior.html</a></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;总结一下：</p> <p>a.  越近代的语言越像lisp；而当前最新潮的语言也只是实现了lisp作者在1958年的设想，因为lisp设计目的是数学理论演算而不是语言这种本质上的一种技术。技术会过时而数学不。今天最高级的主流语言，也只是刚刚接近lisp的水平。虽然已经接近，但还是没有lisp那么强大。</p> <p>b. 等等，其他不一一摘抄。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;其中一点提到，&#8220;一行lisp代码相当于20行C代码&#8221;。lisp会缩短开发周期，而且还是c能做lisp所有事情的前提下。文中举例说，如果你用其他语言跟别人lisp语言的公司竞争，同样的功能你就比别人慢很久才能开发完，竞争就出于劣势。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;其他在网络上看到的lisp相关言论：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;起名为&#8220;格林斯潘第十定律&#8221;（Greenspun's Tenth  Rule）：&#8220;任何C或Fortran程序复杂到一定程度之后，都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common  Lisp实现。&#8221;</p> <p>&nbsp;</p> <p>二、学习过程中</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;另外还有个原因，最近想了解函数式编程，想了解下支持分布式原语的erlang，先学哪个还是纠结了下的。  后来考虑到新到的项目中想设计成分布式扩展方便的服务器架构，就优先学下erlang。先花几天把《Erlang程序设计》给看完了，看的很激动，但是考虑到项目人员现状及将来的维护，项目没用erlang，用了node.js。</p> <p>&nbsp;&nbsp;&nbsp;  之后又花几天把许式伟他们写的《Go语言编程》看完了。go语言确实不错，以后可以考虑用这个写个游戏服务器引擎什么的。本想立即就开动，但是项目属于开始搭架子阶段，需要思考的时间挺多，回家可以利用的时间不多，专心写开源项目不现实。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;于是回家的时间先学Common Lisp（以下简称cl），现在正在看田春翻译的《实用Common  Lisp编程》，看到12.6映射。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;cl很多东西跟类c的语言差别就比较大了，看的进度还是挺慢的。看着看着，一边惊叹他强大的表现力，一边有点害怕太庞大，以后实用起来不顺利。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;如果找份cl的工作，国内大小公司估计都不大好找。除非能在一个高手云集的团队里，大家又都喜欢cl，而且我们有话语权&#8230;&#8230;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;所以将来cl在为了更好的思考编程之外，很可能只是用来写些脚本或者自己的玩具什么的。近期的应用可能是生成javascript代码。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;等cl学的不错了，可以做些个人项目的快速开发&#8230;&#8230;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;</p> <p>三、我了解Common Lisp一些资料</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;建议一下书籍，按阅读顺序（在知乎看到的，别的地方推荐也大同小异）：<br />《Structure and  Interpretation of Computer Programs》（SICP）可以启发思想，尤其是函数式编程入门；<br />《Practical  Common Lisp》和《Land of Lisp》也适合初学者；<br />《On Lisp》主要讨论macro的使用；<br />《Let over  Lambda》在《On Lisp》基础上更深入讨论宏。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8203;《On Lisp》和《Practical Common Lisp》（中译为《实用Common  Lisp编程》） 由田春翻译完成。我个人先买了SICP，但是里边是讲Scheme，看了几节怕到时学lisp会混乱，就转先实用lisp这本了。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;另外我用的实现是Steel Bank Common Lisp。</p> <p>&nbsp;</p> <p>&nbsp;四、附上这段时间了解的函数式语言个人简介</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;这条自己的理解，纯粹为了自己做个笔记。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;haskell貌似比较新，应用不多，别说是分布式，就是普通应用也不多。haskell是纯函数式。而lisp不是纯的，还可以以别的方式来编程。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;erlang倒是主打分布式。erlang内置了多台机器之间的通讯原语，程序员只用关心业务逻辑就可以了。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;lisp主要是一种全新的看待软件开发的视角。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&#8203;&#8203;go也支持闭包。</p> <p>&nbsp;</p><img src ="http://www.cppblog.com/yangsf5/aggbug/203239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yangsf5/" target="_blank">Sheppard Y</a> 2013-09-15 11:25 <a href="http://www.cppblog.com/yangsf5/archive/2013/09/15/203239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>facebook接入</title><link>http://www.cppblog.com/yangsf5/archive/2013/08/08/202411.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Thu, 08 Aug 2013 04:53:00 GMT</pubDate><guid>http://www.cppblog.com/yangsf5/archive/2013/08/08/202411.html</guid><wfw:comment>http://www.cppblog.com/yangsf5/comments/202411.html</wfw:comment><comments>http://www.cppblog.com/yangsf5/archive/2013/08/08/202411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yangsf5/comments/commentRss/202411.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yangsf5/services/trackbacks/202411.html</trackback:ping><description><![CDATA[<div></div><fieldset><legend><span style="color: #ff0000;">2016-07-08 日更新&nbsp;</span></legend><div><span style="color:red;">此篇博客已经迁移到新博客，并做行文检查和优化排版：</span></div><div></div><div><span style="color:red;"><a href="http://blog.clawz.me/2013/08/08/13-facebook-connect/">http://blog.clawz.me/2013/08/08/13-facebook-connect/</a></span></div></fieldset><p>一、需求</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;我方游戏服务器为一套nodejs框架下开发的，手机App前端为javascript。现在需要将游戏接入facebook，要求能用facebook登陆我方游戏，并可以取到玩家的facebook好友等信息、可以向好友送礼，还可以向玩家facebook增加游戏状态。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;如果为前端接入，需要封装出js的接口。</p> <p>&nbsp;</p> <p>二、接入方式</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;需求里涉及到了玩家间的利益交互，如这里的可以向好友送礼。需要确认游戏里这些利益交互（现在的利益可能较弱，但需要考虑将来的利益交互规划）被外挂刷后是否对游戏有影响。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;如果影响较大，例如刷了很多物品，让游戏失去平衡&#8212;&#8212;RPG里可能是装备特牛，休闲游戏可能是道具很多，更有利于冲击排行榜等。就需要将facebook的接入方式定为server-side接入。如果影响较小，就无所谓，可以像单机游戏那样在前端做接入，facebook的好友信息等由前端传到我们服务器。</p> <p>&nbsp;</p> <p>（一）server-side接入</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;官方的<a href="https://developers.facebook.com/docs/sdks/" _href="https://developers.facebook.com/docs/sdks/">https://developers.facebook.com/docs/sdks/</a>&nbsp;里收录的第三方nodejs的sdk在<a href="https://github.com/amachang/facebook-node-sdk" _href="https://github.com/amachang/facebook-node-sdk">https://github.com/amachang/facebook-node-sdk</a>。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;这种是nodejs开的本地网站，然后本地网站可以开个网址做facebook的接入验证，之后取玩家的facebook信息，可以调封装好的facebook  API。效果可以开代理看下<a href="http://claw-fb-off.herokuapp.com/" _href="http://claw-fb-off.herokuapp.com">http://claw-fb-off.herokuapp.com</a>。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;但是不知我们服务器的nodejs和前端App的js之间是否支持这种网页式的交互。咨询了nodejs框架组的同学，表示不行，我自己没做过这方面的东西，所以还是要请游戏组同学看看。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;另外咨询了众多项目组，做过接入的都是前端接入，还没有做过server-side接入的。</p> <p>&nbsp;</p> <p>（二）client-side接入</p> <ol list-paddingleft-2"=""> <li> <p>官方提供native IOS和Android API的SDK。</p></li> <li> <p>另外也提供javascript SDK（<a href="https://developers.facebook.com/docs/reference/javascript/" _href="https://developers.facebook.com/docs/reference/javascript/">https://developers.facebook.com/docs/reference/javascript/</a>），貌似也是网页形式，不知我们前端是否支持？</p></li> <li> <p>EziSocial-Plugin为C++编写，但是这个是收费的，游戏组确认要用吗？</p></li></ol><img src ="http://www.cppblog.com/yangsf5/aggbug/202411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yangsf5/" target="_blank">Sheppard Y</a> 2013-08-08 12:53 <a href="http://www.cppblog.com/yangsf5/archive/2013/08/08/202411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby send e-mail &amp; mysql</title><link>http://www.cppblog.com/yangsf5/archive/2013/04/08/199231.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Mon, 08 Apr 2013 10:28:00 GMT</pubDate><guid>http://www.cppblog.com/yangsf5/archive/2013/04/08/199231.html</guid><wfw:comment>http://www.cppblog.com/yangsf5/comments/199231.html</wfw:comment><comments>http://www.cppblog.com/yangsf5/archive/2013/04/08/199231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yangsf5/comments/commentRss/199231.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yangsf5/services/trackbacks/199231.html</trackback:ping><description><![CDATA[<div></div><fieldset><legend><span style="color: #ff0000;">2016-07-07 日更新&nbsp;</span></legend><div><span style="color:red;">此篇博客已经迁移到新博客，并做行文检查和优化排版：</span></div><div></div><a href="http://blog.clawz.me/2013/02/24/13-ruby-send-email-query-mysql/"><div><span style="color:red;">http://blog.clawz.me/2013/02/24/13-ruby-send-email-query-mysql/</span></div></a></fieldset><a href="http://blog.clawz.me/2013/02/24/13-ruby-send-email-query-mysql/"><div></div><p>&nbsp;</p></a><p><br />新项目初期，没什么完善的后台系统，想每天定时看看玩家充值情况，年前开始学了点ruby，就随便捣鼓了个ruby访问mysql然后发邮件的脚本。好久没更新博客，先滥竽充数下，哈哈&#8230;&#8230;<br /></p> <p>&nbsp;<br /></p>  <p>&nbsp;</p><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: #008000; ">#</span><span style="color: #008000; ">!/usr/local/bin/ruby</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">Author:&nbsp;sheppard(ysf1026@gmail.com)&nbsp;2013-02-16</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Desc:</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">#<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; "></span>require&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">rubygems</span><span style="color: #800000; ">'</span><br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;require&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">net/smtp</span><span style="color: #800000; ">'</span><br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;require&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">mysql</span><span style="color: #800000; ">'</span><br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;total_money&nbsp;=&nbsp;0<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;begin<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;con&nbsp;=&nbsp;Mysql.new&nbsp;_host,&nbsp;_user,&nbsp;_pwd,&nbsp;_dbname<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;(0..9).each&nbsp;do&nbsp;|i|<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;=&nbsp;con.query&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">select&nbsp;sum(order_money)&nbsp;ordermoney&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;table_#{i}</span><span style="color: #800000; ">"</span><br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total_money&nbsp;+=&nbsp;rs.fetch_row[0].to_i<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;end<br /><span style="color: #008080; ">15</span>&nbsp;rescue&nbsp;Mysql::Error&nbsp;=&gt;&nbsp;e<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;puts&nbsp;e.errno<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;puts&nbsp;e.error<br /><span style="color: #008080; ">18</span>&nbsp;ensure<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;con.close&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;con<br /><span style="color: #008080; ">20</span>&nbsp;end<br /><span style="color: #008080; ">21</span>&nbsp;eval&nbsp;File.read(<span style="color: #800000; ">"</span><span style="color: #800000; ">smtp-tls.rb</span><span style="color: #800000; ">"</span>)<br /><span style="color: #008080; ">22</span>&nbsp;msgstr&nbsp;=&nbsp;&lt;&lt;MESSAGE_END<br /><span style="color: #008080; ">23</span>&nbsp;From:&nbsp;monitor&nbsp;&lt;XX@126.com&gt;<br /><span style="color: #008080; ">24</span>&nbsp;To:&nbsp;sheppard&nbsp;&lt;XX@XX.com&gt;<br /><span style="color: #008080; ">25</span>&nbsp;Subject:&nbsp;money&nbsp;report<br /><span style="color: #008080; ">26</span>&nbsp;XX&nbsp;Project,&nbsp;total&nbsp;money:&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">{total_money}</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #008000; "></span>MESSAGE_END<br /><span style="color: #008080; ">28</span>&nbsp;Net::SMTP.start(<span style="color: #800000; ">'</span><span style="color: #800000; ">smtp.126.com</span><span style="color: #800000; ">'</span>,&nbsp;25,&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">126.com</span><span style="color: #800000; ">'</span>,&nbsp;&nbsp;&nbsp;_mail_user_name,&nbsp;_mail_password,&nbsp;:plain)&nbsp;do&nbsp;|smtp|<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;smtp.send_message&nbsp;msgstr,&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">XX@126.com</span><span style="color: #800000; ">'</span>,&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">XX@XX.com</span><span style="color: #800000; ">'</span><br /><span style="color: #008080; ">30</span>&nbsp;end</div>参考的几个网址家里没FQ就先不给了。有空补上，或者大家有google或者stackoverflow自己搜去吧~<p>&nbsp;</p> <p>说明：</p> <p>1.&nbsp;Net::SMTP.start的第二个参数是mail服务器的smtp的端口，各邮件服务提供商的可能会不能，例如google的就不是这个25。<br /><br />ps：2013年2月24日我在CU的博文<br /><br />补充：send_email抽出到：<a href="https://github.com/yangsf5/ruby-part/tree/master/product/send_email">https://github.com/yangsf5/ruby-part/tree/master/product/send_email</a></p><img src ="http://www.cppblog.com/yangsf5/aggbug/199231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yangsf5/" target="_blank">Sheppard Y</a> 2013-04-08 18:28 <a href="http://www.cppblog.com/yangsf5/archive/2013/04/08/199231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP/Java Bridge的使用</title><link>http://www.cppblog.com/yangsf5/archive/2013/04/08/199230.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Mon, 08 Apr 2013 10:20:00 GMT</pubDate><guid>http://www.cppblog.com/yangsf5/archive/2013/04/08/199230.html</guid><wfw:comment>http://www.cppblog.com/yangsf5/comments/199230.html</wfw:comment><comments>http://www.cppblog.com/yangsf5/archive/2013/04/08/199230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yangsf5/comments/commentRss/199230.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yangsf5/services/trackbacks/199230.html</trackback:ping><description><![CDATA[<div></div><fieldset><legend><span style="color: #ff0000;">2016-07-06 日更新&nbsp;</span></legend><div><span style="color:red;">此篇博客已经迁移到新博客，并做行文检查和优化排版：</span></div><div></div><a href="http://blog.clawz.me/2013/01/18/13-php-java-bridge/"><div><span style="color:red;">http://blog.clawz.me/2013/01/18/13-php-java-bridge/</span></div></a></fieldset><a href="http://blog.clawz.me/2013/01/18/13-php-java-bridge/"><div></div><p>&nbsp;</p></a><p><br />一、需求背景</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;之前介绍过我们项目的架构，由于历史原因，架构演变成as&lt;--&gt;java&lt;--&gt;php这样，java与as通过tcp长连接通信，java与php通过两条http通道来通信（java与php各自有个http&nbsp;server，并各自作为对方的http&nbsp;client，java转发as以前的post给php；php需要跨session推送或者广播时变为http&nbsp;client向java的http&nbsp;server做post）。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;这之前的架构是as的功能逻辑大部分直接与php进行http通信。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;项目的目标是慢慢将php部分写的糟糕的已有逻辑（例如帮派这种交互和广播同步比较多的）改到java服务器上。项目人员配备跟不上，所以不能一下子全转了。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;如果用之前的两条http通道来小步快跑式的移逻辑，就需要再封装这两个通道之间的通信，费时间还不一定好使，所以我们需要一个java直接调用php的技术。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;goole了解后，最终决定使用PHP/Java&nbsp;Bridge。&nbsp;</p> <p>&nbsp;</p> <p>二、PHP/Java&nbsp;Bridge</p> <p>（一）示例</p> <p>CallPhp.java<br /></p><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; ">package</span>&nbsp;me.sheppardy.study;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.io.ByteArrayOutputStream;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.io.FileReader;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;javax.script.ScriptEngine;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;javax.script.ScriptEngineManager;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;PHP/Java&nbsp;Bridge,&nbsp;example<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;sheppard(ysf1026@gmail.com)&nbsp;2013-01-18<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;CallPhp<br /><span style="color: #008080; ">16</span>&nbsp;{<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(1104);<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(531);<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(1221);<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(110);<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;test(<span style="color: #0000FF; ">int</span>&nbsp;id)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response&nbsp;rep&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Response();<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call(<span style="color: #0000FF; ">new</span>&nbsp;Request(id),&nbsp;rep);<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("CallPhp.test,&nbsp;id="&nbsp;+&nbsp;id&nbsp;+&nbsp;"&nbsp;message="&nbsp;+&nbsp;rep.message);<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;call(Request&nbsp;req,&nbsp;Response&nbsp;rep)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScriptEngineManager&nbsp;engineManager&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ScriptEngineManager();<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScriptEngine&nbsp;engine&nbsp;=&nbsp;engineManager.getEngineByName("php-invocable");<br /><span style="color: #008080; ">37</span>&nbsp;<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayOutputStream&nbsp;log&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ByteArrayOutputStream();<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span><br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.put("phpRootDir",&nbsp;"data/php");<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.put("log",&nbsp;log);<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.put("req",&nbsp;req);<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.put("rep",&nbsp;rep);<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileReader&nbsp;reader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;FileReader("data/php/gate.php");<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.eval(reader);<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("CallPhp.call&nbsp;phpLog="&nbsp;+&nbsp;log.toString());<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>(Exception&nbsp;e)<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("CallPhp.call&nbsp;phpLog="&nbsp;+&nbsp;log.toString());<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;e;<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">56</span>&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;<br /><span style="color: #008080; ">58</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Request<br /><span style="color: #008080; ">59</span>&nbsp;{<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Request(<span style="color: #0000FF; ">int</span>&nbsp;id)<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.id&nbsp;=&nbsp;id;<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;id;<br /><span style="color: #008080; ">65</span>&nbsp;}<br /><span style="color: #008080; ">66</span>&nbsp;<br /><span style="color: #008080; ">67</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Response<br /><span style="color: #008080; ">68</span>&nbsp;{<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;message;<br /><span style="color: #008080; ">70</span>&nbsp;}</div><p>java-bin/data/php/gate.php<br /></p><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;&lt;?php<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;脚本统一入口<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;@author&nbsp;sheppard(ysf1026@gmail.com)&nbsp;2013-01-18<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008080; ">define</span>('PHP_ROOT_DIR',&nbsp;java_context()-&gt;get('phpRootDir'));<br /><span style="color: #008080; ">11</span>&nbsp;<span style="color: #800080; ">$log</span>&nbsp;=&nbsp;java_context()-&gt;get('log');<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #800080; ">$log</span>-&gt;write("\n\tjava&nbsp;give&nbsp;phpRootDir&nbsp;is&nbsp;"&nbsp;.&nbsp;PHP_ROOT_DIR);<br /><span style="color: #008080; ">13</span>&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">require_once</span>(PHP_ROOT_DIR&nbsp;.&nbsp;'/function.php');<br /><span style="color: #008080; ">15</span>&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #800080; ">$log</span>-&gt;write(getDoomsday());<br /><span style="color: #008080; ">17</span>&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #800080; ">$rep</span>&nbsp;=&nbsp;java_context()-&gt;get('rep');<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #800080; ">$rep</span>-&gt;message&nbsp;=&nbsp;handle(java_context()-&gt;get('req'),&nbsp;<span style="color: #800080; ">$log</span>);<br /><span style="color: #008080; ">20</span>&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;?&gt;</div><p>&nbsp;</p><p>java-bin/data/php/function.php<br /></p><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;&lt;?php<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;具体功能举例<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;@author&nbsp;sheppard(ysf1026@gmail.com)&nbsp;2013-01-18<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;getDoomsday()<br /><span style="color: #008080; ">11</span>&nbsp;{<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"\n\tdoomsday&nbsp;is&nbsp;20121221";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;}<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;handle(<span style="color: #800080; ">$req</span>,&nbsp;<span style="color: #800080; ">$log</span>)<br /><span style="color: #008080; ">16</span>&nbsp;{<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080; ">$id</span>&nbsp;=&nbsp;<span style="color: #800080; ">$req</span>-&gt;id;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080; ">$log</span>-&gt;write("\n\tfunction.php&nbsp;handle&nbsp;id=$id");<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>('1104'&nbsp;==&nbsp;<span style="color: #800080; ">$id</span>)<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;'guess?';<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>('531'&nbsp;==&nbsp;<span style="color: #800080; ">$id</span>)<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;'score';<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>('1221'&nbsp;==&nbsp;<span style="color: #800080; ">$id</span>)<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;'maybe&nbsp;doomsday';<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;'404&nbsp;not&nbsp;found';<br /><span style="color: #008080; ">27</span>&nbsp;}<br /><span style="color: #008080; ">28</span>&nbsp;<br /><span style="color: #008080; ">29</span>&nbsp;?&gt;</div><p>&nbsp;</p><p>output<br /></p><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;CallPhp.call&nbsp;phpLog=<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;java&nbsp;give&nbsp;phpRootDir&nbsp;is&nbsp;data/php<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;doomsday&nbsp;is&nbsp;20121221<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">function</span>.php&nbsp;handle&nbsp;id=1104<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;CallPhp.test,&nbsp;id=1104&nbsp;message=guess?<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;CallPhp.call&nbsp;phpLog=<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;java&nbsp;give&nbsp;phpRootDir&nbsp;is&nbsp;data/php<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;doomsday&nbsp;is&nbsp;20121221<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">function</span>.php&nbsp;handle&nbsp;id=531<br /><span style="color: #008080; ">10</span>&nbsp;CallPhp.test,&nbsp;id=531&nbsp;message=score<br /><span style="color: #008080; ">11</span>&nbsp;CallPhp.call&nbsp;phpLog=<br /><span style="color: #008080; ">12</span>&nbsp;java&nbsp;give&nbsp;phpRootDir&nbsp;is&nbsp;data/php<br /><span style="color: #008080; ">13</span>&nbsp;doomsday&nbsp;is&nbsp;20121221<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #0000FF; ">function</span>.php&nbsp;handle&nbsp;id=1221<br /><span style="color: #008080; ">15</span>&nbsp;CallPhp.test,&nbsp;id=1221&nbsp;message=maybe&nbsp;doomsday<br /><span style="color: #008080; ">16</span>&nbsp;CallPhp.call&nbsp;phpLog=<br /><span style="color: #008080; ">17</span>&nbsp;java&nbsp;give&nbsp;phpRootDir&nbsp;is&nbsp;data/php<br /><span style="color: #008080; ">18</span>&nbsp;doomsday&nbsp;is&nbsp;20121221<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">function</span>.php&nbsp;handle&nbsp;id=110<br /><span style="color: #008080; ">20</span>&nbsp;CallPhp.test,&nbsp;id=110&nbsp;message=404&nbsp;not&nbsp;found</div><br /><p>&nbsp;</p><p>（二）注意事项</p> <p>1.&nbsp;由于是java调用的php，所以php里当前工作路径变成了java的。</p> <p>2.&nbsp;FileReader加载*.php文件之后ScriptEngine.evel(FileReader)的耗时大概为230+ms，StringReader时为180+ms，速度都不咋滴，但是这不是我们项目急着考虑的问题，之前的http方式也好不到哪去，优化留到以后再说。</p> <p>3.&nbsp;php的解释器运行路径配置：-Dphp.java.bridge.php_exec=。</p> <p>&nbsp;</p> <p>三、相关资料</p> <p>1.&nbsp;官网：<a href="http://php-java-bridge.sourceforge.net/pjb/" data_ue_src="http://php-java-bridge.sourceforge.net/pjb/">http://php-java-bridge.sourceforge.net/pjb/</a></p> <p>2.&nbsp;符合java调脚本标准的调php示例：<a href="http://php-java-bridge.sourceforge.net/pjb/examples/source.php?source=PhpThreads.java" data_ue_src="http://php-java-bridge.sourceforge.net/pjb/examples/source.php?source=PhpThreads.java">http://php-java-bridge.sourceforge.net/pjb/examples/source.php?source=PhpThreads.java<br /><br /><br /></a>ps：2013年1月18日我在CU的博客</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><img src ="http://www.cppblog.com/yangsf5/aggbug/199230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yangsf5/" target="_blank">Sheppard Y</a> 2013-04-08 18:20 <a href="http://www.cppblog.com/yangsf5/archive/2013/04/08/199230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>as3里ByteArray的readBytes方法length参数为0时并非是读0个字节</title><link>http://www.cppblog.com/yangsf5/archive/2013/04/08/199222.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Mon, 08 Apr 2013 09:54:00 GMT</pubDate><guid>http://www.cppblog.com/yangsf5/archive/2013/04/08/199222.html</guid><wfw:comment>http://www.cppblog.com/yangsf5/comments/199222.html</wfw:comment><comments>http://www.cppblog.com/yangsf5/archive/2013/04/08/199222.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yangsf5/comments/commentRss/199222.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yangsf5/services/trackbacks/199222.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;"><span style="word-wrap: break-word; font-family: 'Lucida Console', 'Courier New', Courier, monospace; line-height: normal;"></span></div><div><span style="color: #ff0000;"></span><fieldset><legend><span style="color: #ff0000;">2016-07-03 日更新&nbsp;</span></legend><span style="color:#ff0000;">此篇博客已经迁移到新博客，并做行文检查和优化排版：</span><br /><div><span style="color:#ff0000;"><a href="http://blog.clawz.me/2012/09/19/12-as3-readbytes/">http://blog.clawz.me/2012/09/19/12-as3-readbytes/</a></span></div></fieldset><div><span style="color: #ff0000;"><a href="http://blog.clawz.me/2012/09/19/12-as3-readbytes/"></a></span></div><br /><br />一、官方文档注解如下：</div><div>public function readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void</div><div>Reads the number of data bytes, specified by the length parameter, from the byte stream. The bytes are read into the ByteArray object specified by the bytes parameter, and the bytes are written into the destination ByteArray starting at the position specified by offset.</div><div></div><div>Parameters</div><div>bytes:ByteArray &#8212; The ByteArray object to read data into.&nbsp;</div><div>offset:uint (default = 0) &#8212; The offset (position) in bytes at which the read data should be written.&nbsp;</div><div>length:uint (default = 0) &#8212; The number of bytes to read. The default value of 0 causes all available data to be read.</div><div></div><div>二、参数注意</div><div><span style="white-space:pre">	</span>第3个参数length，如果传0表示将ByteArray里的剩余数据全部读进bytes里，与通常的API理解不一致。</div><div><span style="white-space:pre">	</span>这点有点怪异，我的程序里，ByteArray类型的buff需要从ByteArray类型的recvBuff里读取给定数量的字节数。字节数有可能是0（protobuf里，如果全为optional字段，并且没有设定值，这个protobuf协议序列化的结果就是0字节），企图用recvBuff.readBytes(buff, 0, 0)来读取零字节是不能达到目的的。</div><div><span style="white-space:pre">	</span>recvBuff里还有其他的网络包数据，如果用readBytes(buff, 0, 0)会把recvBuff里其他网络包的数据读给了当前buff，然后交给当前包对应的protobuf类来反序列化，就错了。</div><div><span style="white-space:pre">	</span>症状如下，方便大家搜索到此文：</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span>Bad data format: **.** cannot be set twice.</div><div><span style="white-space:pre">	</span>invalid nested message</div><div><span style="white-space:pre">	</span>message length = 1</div><div><span style="white-space:pre">	</span>注：as3, protobuf-gen-as3(http://code.google.com/p/protoc-gen-as3/)<br /><br />ps：2012年9月19日我在CU上的博文</div><img src ="http://www.cppblog.com/yangsf5/aggbug/199222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yangsf5/" target="_blank">Sheppard Y</a> 2013-04-08 17:54 <a href="http://www.cppblog.com/yangsf5/archive/2013/04/08/199222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>