??xml version="1.0" encoding="utf-8" standalone="yes"?>mm1313亚洲精品国产,亚洲1区2区3区精华液,国产亚洲精品看片在线观看http://www.tkk7.com/shmily432685/http://www.eshoo.com.cn <a title="Ƣ迎来到异客中国" >Ƣ迎来到异客中国</a>zh-cnFri, 09 May 2025 17:56:11 GMTFri, 09 May 2025 17:56:11 GMT60SVN服务器配|?/title><link>http://www.tkk7.com/shmily432685/archive/2011/07/12/354203.html</link><dc:creator>闉|</dc:creator><author>闉|</author><pubDate>Tue, 12 Jul 2011 14:19:00 GMT</pubDate><guid>http://www.tkk7.com/shmily432685/archive/2011/07/12/354203.html</guid><wfw:comment>http://www.tkk7.com/shmily432685/comments/354203.html</wfw:comment><comments>http://www.tkk7.com/shmily432685/archive/2011/07/12/354203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/shmily432685/comments/commentRss/354203.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/shmily432685/services/trackbacks/354203.html</trackback:ping><description><![CDATA[<div> <div> <div> <h3 pre="" fs1"="">原文出处Qhttp://blog.163.com/air-blue55/blog/static/9708657020105612454398/<br /> </h3> <font size="3"><strong><br /> </strong></font></div> </div> </div> <div></div> <div fc05="" fc11="" nbw-blog="" ztag="" js-fs2"=""> <p>有两U方案:<br /> <br /> <strong>* VisualSVN ServerQ安装更单、更直观Q?/strong><font color="#0060bf">http://www.visualsvn.com/server/download/</font><strong><br /> <br /> * </strong><strong>传统的Subversion 服务器程序:<br /> </strong>一、准备工?br /> <br /> 1、获?strong> Subversion </strong>服务器程?br /> <br /> 到官方网站(http://subversion.tigris.org/Q下载最新的服务器安装程序。目前最新的?.5版本Q具体下载地址在:<font color="#0060bf">http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&expandFolder=8100&folderID=91</font><br /> <br /> <br /> 2、获?nbsp;<strong>TortoiseSVN </strong>客户端程?br /> <br /> 从官方网?nbsp;<font color="#0060bf">http://tortoisesvn.net/downloads</font> 获取最新的 TortoiseSVN 。TortoiseSVN 是一个客LE序Q用来与 subvers 服务器端通讯。Subversion 自带一个客LE序 svn.exe ,?nbsp;TortoiseSVN 更好操作Q提高效率?br /> <br /> <br /> 二、安装服务器端和客户?br /> <br /> 安装 SubversionQ以下简USVNQ的服务器端和客L。下载下来的服务器端是个 zip 压羃包,直接解压~即可,比如我解压到E:\subversion 。客L安装文g是个 exe 可执行文Ӟ直接q行按提C安装即可,客户端安装完成后提示重启?br /> <br /> <br /> 三、徏立版本库QRepositoryQ?br /> <br /> q行Subversion服务器需要首先要建立一个版本库QRepositoryQ。版本库可以看作是服务器上集中存攑֒理数据的地斏V?br /> <br /> 开始徏立版本库。首先徏?nbsp;e:\svn I文件夹作ؓ所有版本库的根目录。然后,<strong>q入命o行ƈ切换?/strong><strong>subversion的bin目录。输入如下命令:</strong><br /> <br /> <strong>svnadmin create E:\svn\repos1</strong><br /> <br /> 此命令在 E:\svn 下徏立一个版本库 repos1 。repos1 下面会自动生成一些文件夹和文件?br /> <br /> 我们也可以?nbsp;TortoiseSVN 囑Ş化的完成q一步:<br /> <br /> 先徏立空目录 E:\svn\repos1 Q注意一定是要空的。然后在 repos1 文g夹上“<strong>右键->TortoiseSVN->Create Repository here</strong>...”Q然后可以选择版本库模式,q里使用默认的FSFS卛_Q然后就创徏了一pd文g夹和文gQ同命o行徏立的一栗?br /> <br /> <br /> <br /> 四、运行独立服务器<br /> <br /> 此时 subversion 服务q没有开始,只是通过它的命o建立了版本库。l在刚才的命令窗口输入:<br /> <br /> svnserve.exe --daemon<br /> <br /> svnserve 会在端?nbsp;3690 {待hQ?-daemonQ两个短横线Q选项告诉 svnserve 以守护进E方式运行,q样在手动终止之前不会退出。注意不要关闭命令行H口Q关闭窗口会?nbsp;svnserve 停止?br /> <br /> Z验证svnserve正常工作Q用TortoiseSVN -> Repo-browser 来查看版本库。在弹出?nbsp;URL 对话框中输入Q?br /> <br /> svn://localhost/svn/repos1<br /> <br /> ?nbsp;OK 按钮后就可以看见 repos1 版本库的目录树结构了Q只不过q时 repos1 是个I库?br /> <br /> 你也可以使用--root选项讄根位|来限制服务器的讉K目录Q从而增加安全性和节约输入svnserve URL的时_<br /> <br /> <strong>svnserve.exe --daemon --root drive:\path\to\repository</strong><br /> <br /> 以前面的试作ؓ例,svnserve 会q行为:<br /> eg:<br /> <strong>svnserve.exe --daemon --root e:\svn</strong><br /> <br /> 然后TortoiseSVN中的版本库浏览器URL~减为:<br /> <br /> <u>svn://localhost/repos1</u></p> <p><u></u> </p> <p><u></u> </p> <p><font color="#000000">==svn开启动=====================<o p=""></o></font></p> <p><font color="#000000">创徏autoRunSVN.bat文gQ内ҎQ?o p=""></o></font></p> <p><o p=""><font color="#000000"> </font></o></p> <p><font color="#000000">Cpp代码<o p=""></o></font></p> <p><font color="#000000">sc create MySVNServer binpath= "\"C:\Program Files\Subversion\svnserve\svnserve\" --service -r H:\homerepos" displayname= "SVNService" depend= Tcpip start= auto  <o p=""></o></font></p> <p><font color="#000000">pause <o p=""></o></font></p> <p><strong>sc create MySVNServer binpath= "\"J:\java\Subversion\bin\svnserve.exe" --service -r \"G:\svn repository\"" displayname= "SVNService" depend= Tcpip start= auto<o p=""></o></strong></p> <p><font color="#000000">pause<strong><o p=""></o></strong></font></p> <p><font color="#000000"> 注意之处Q?o p=""></o></font></p> <p><font color="#000000">Q?Qsc是windows自带的服务配|程序,MySVNServer 是服务的名称Q似乎没什么用?o p=""></o></font></p> <p><o p=""><font color="#000000"> </font></o></p> <p><font color="#000000">Q?Q参数binPath表示svnserve可执行文件的安装路径Q由于\径中?Program Files"带有I格Q因此整个\径需要用双引号引h。而双引号本n是个Ҏ字符Q需要进行{义,因此在\径前后的两个双引号都需要写成\" ?o p=""></o></font></p> <p><font color="#000000">Q?Q?-service参数表示以windows服务的Ş式运行,--r指明svn repository的位|,service参数与r参数都作为binPath的一部分Q因此与svnserve.exe的\径一赯包含在一对双引号当中Q而这对双引号不需要进行{义?o p=""></o></font></p> <p><o p=""><font color="#000000"> </font></o></p> <p><font color="#000000">Q?Qdisplayname表示在windows服务列表中显C的名字Q?nbsp;depend =Tcpip 表示svnserve服务的运行需要tcpip服务Qstart=auto表示开机后自动q行。安装服务后Qsvnserve要等下次开机时才会自动q行?nbsp;Q?QbinPath的等号前面无I格Q等号后面有I格 displayname depend start也都一?o p=""></o></font></p> <p><font color="#000000">service前面?-Q不? Q而r前面?<o p=""></o></font></p> <p><font color="#000000">Q?Q若要卸载svn服务Q则执行 sc delete svnserve 卛_?nbsp;<o p=""></o></font></p> <p><o p=""><font color="#000000"> </font></o></p> <p><font color="#000000">Q?Q从“sc”?#8220;auto”是在同一个命令scQ必d在同一行?o p=""></o></font></p> <p><o p=""><font color="#000000"> </font></o></p> <p><font color="#000000">      创徏成功后,可以在运行中键入service.msc察看pȝ服务Q找到SVNService,查看q项服务的属性,可以使用Windows提供的界面操作SVNService服务了?/font><o p=""></o></p> <p> </p> <p><strong>P.S. l本人实验,以上的SVN开启动Ҏ一直无法实玎ͼ׃不会写批处理语句Q也不知道是哪里错,但网上很多地斚w是用q种Ҏd?nbsp; 开启动。最后,只能重新找了一U新ҎQ虽然无法开启动Q但可以较方便实现多个服务进E和理多个文g夹,请各位自行选择?/strong></p> <p><font color="#000000">创徏SVNService.bat文gQ内容如下(重作者版权,请勿删除作者信息)Q?/font></p> <font color="#000000"></font> <p> </p> <p>@ECHO OFF<br /> ::======================================================================<br /> ::作?nbsp;    : Zealic<br /> ::版本     : 1.05<br /> ::功能     : 通过便快L方式安装 Subversion.<br /> ::最后更?: 2007-12-28<br /> ::======================================================================<br /> ::初始化环?br /> ::======================================================================</p> <p> </p> <p>ECHO *** 安装 Subversion 服务 ***</p> <p>::======================================================================<br /> ::======================================================================<br /> ::创徏服务<br /> ::======================================================================<br /> ECHO +++ 创徏资源库服?+++<br /> ECHO 创徏pȝ服务Q这需要输入一些信?..</p> <p>:INPUT_SVC_NAME<br /> SET /P svc_name=误入服务名     : <br /> ::服务名不能ؓI?br /> if "%svc_name%" == "" (<br />   ECHO 服务名不能ؓI,请重新输入?br />   GOTO INPUT_SVC_NAME<br /> )<br /> ::查询服务是否存在Q通过查找输出是否存在错误Q?1060:"是发生错误是时输出的错误代码?br /> SC QUERY "%svc_name%" | find "1060:" >> NUL<br /> IF %errorlevel% == 1 (<br />   ECHO 服务 "%svc_name%" 已经存在Q请重新输入服务名?br />   GOTO INPUT_SVC_NAME<br /> )<br /> ECHO.</p> <p>::输入资源库信?br /> :INPUT_REPOS<br /> SET /P    repos=误入资源库路径 : <br /> ECHO.</p> <p>::创徏服务<br /> ECHO 您用以下信息创?Subversion 服务 : <br /> ECHO 服务名称   : "%svc_name%"<br /> ECHO 资源库\?: "%repos%"<br /> ECHO 正在创徏服务...<br /> SC create %svc_name% binPath= "\"E:\Subversion\bin\svnserve.exe\" --service -r \"%repos%\"" depend= Tcpip start= auto| find "1060:" >> NUL<br /> ECHO.<br /> IF %errorlevel% == 0 GOTO SC_ERROR<br /> ECHO --- 创徏服务成功! ---<br /> ECHO.<br /> ECHO.</p> <p>::======================================================================<br /> ::生成操作批处理文?br /> ::======================================================================<br /> ECHO +++ 生成服务操作批处?+++<br /> ECHO 服务操作批处理文件可以帮助您快速操作服务?br /> SET bat_delete=DELETE_%svc_name%.BAT<br /> SET bat_start=START_%svc_name%.BAT<br /> SET bat_stop=STOP_%svc_name%.BAT<br /> ECHO 生成删除服务批处?"%bat_delete%" ...<br /> ::bat_delete<br /> ECHO @ECHO OFF> %bat_delete%<br /> ECHO NET STOP %svc_name%>> %bat_delete%<br /> ECHO SC delete %svc_name%>> %bat_delete%<br /> ECHO DEL %bat_start%>> %bat_delete%<br /> ECHO DEL %bat_stop%>> %bat_delete%<br /> ECHO DEL %bat_delete%>> %bat_delete%<br /> ECHO PAUSE>> %bat_delete%<br /> ::bat_start<br /> ECHO 生成q行服务批处?"%bat_start%" ...<br /> ECHO @ECHO OFF> %bat_start%<br /> ECHO NET START %svc_name%>> %bat_start%<br /> ECHO PAUSE>> %bat_start%<br /> ::bat_stop<br /> ECHO 生成停止服务批处?"%bat_stop%" ...<br /> ECHO @ECHO OFF> %bat_stop%<br /> ECHO NET STOP %svc_name%>> %bat_stop%<br /> ECHO PAUSE>> %bat_stop%<br /> ECHO.<br /> ECHO --- 生成服务操作批处理成? ---<br /> ECHO.<br /> ECHO.</p> <p>::======================================================================<br /> ::Finish<br /> ::======================================================================<br /> ECHO ### 所有操作成? ###<br /> GOTO END</p> <p>::======================================================================<br /> ::错误D?br /> ::======================================================================<br /> :ENV_ERROR<br /> ECHO --- 讄环境变量p|! ---<br /> GOTO END</p> <p>:SC_ERROR<br /> ECHO --- 创徏服务p|! ---<br /> GOTO END</p> <p>:SC_INV_PORT<br /> ECHO 无效的端口号Q请重新输入?br /> GOTO INPUT_SVC_PORT</p> <p>:END<br /> PAUSE</p> <p><font color="#000000">其中<font color="#ff0000">SC create %svc_name% binPath= "\"E:\Subversion\bin\svnserve.exe\" --service -r \"%repos%\"" depend= Tcpip start= auto| find "1060:" >> NUL</font><font color="#000000">需要将binpath改ؓsvnserve.exe所在\径,之后可以运行服务了?/font></font></p> <p><font color="#000000"></font> </p> <font color="#000000"> <p>五、配|用户和权限<br /> <br /> 用文本编辑器打开E:\svn\repos1\conf目录Q修?strong>svnserve.conf</strong>Q?br /> <br /> :<br /> <br /> # password-db = passwd<br /> <br /> 改ؓQ?br /> <br /> password-db = passwd<br /> <br /> <strong>卛_掉前面的</strong><strong> # </strong><strong>注释W,注意前面不能有空根{?/strong><br /> <br /> 然后修改同目录的<strong>passwd</strong>文gQ增加一个帐P<br /> <br /> :<br /> <br /> [users]<br /> # harry = harryssecret<br /> # sally = sallyssecret<br /> <br /> <strong>增加帐号Q?/strong><strong><br /> </strong><br /> [users]<br /> #harry = harryssecret<br /> #sally = sallyssecret<br /> test = test<br /> <br /> <br /> 六、初始化导入<br /> <br /> 下面是我们的数据Q项目)导入到这个版本库Q以后就q本库理我们的数据。我们的M改动都回被版本库记录下来Q甚x们自׃失、改错数据时版本库也能帮我们扑֛数据?br /> <br /> 比如Q我?nbsp;d:\wwwroot 下有?nbsp;guestbook 文g夹,里面存放的是我编写的留言程序。在此文件夹?#8220;右键 -> TortoiseSVN -> Import...” Q在弹出对话框的“URL of repository”输入“svn://localhost/repos1/guestbook”。在“Import message”输入“导入整个留言?#8221;作ؓ注释?br /> ?nbsp;OK 后要求输入帐受我们在用户名和密码处都输入 test 。完成后 guestbook 中的内容全部导入C svn://localhost/svn/repos1/guestbook ?br /> <br /> 我们看到?nbsp;e:\svn\repos1 没有M变化Q连?nbsp;guestbook 文g多w没有建立Q唯一的变化就是e:\svn\repos1定w变大了。实际上我们源guestbook中的内容已经导入 repos1 版本库了Q源 guestbook 文g夹可以删除了?br /> <br /> 需要注意的是,q一步操作可以完全在另一台安装了 TortoiseSVN 的客h上进行。例如运行svnserve的主机的IP?33.96.121.22Q则URL部分输入的内容就?#8220;svn://133.96.<st1 tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="121.22" unitname="”" wst="on" chmetcnv="">121.22” </st1>?br /> <br /> <br /> 七、基本操作流E?br /> <br /> 1、取出(check outQ?br /> <br /> 取出版本库到一个工作拷贝:<br /> <br /> 来到LI目录下Q比如在f分区建立一个空文g?nbsp;f:\work ?#8220;右键 -> SVN Checkout”。在“URL of repository”中输?#8220;svn://localhost/svn/repos1/guestbook”Q这h们就得到了一?nbsp;guestbook 中内容的工作拯?br /> <br /> 2、存入(check inQ?提交QcommitQ?br /> <br /> 在工作拷贝中作出修改q提交:<br /> <br /> ?nbsp;guestbook 工作拯中随便打开一个文Ӟ作出修改Q然?#8220;右键 -> SVN Commit... ”。这h们就把修Ҏ交到了版本库Q版本库Ҏ情况存储我们提交的数据?br /> <br /> 在修改过的文件上“右键 -> TortoiseSVN -> Show Log” Q可以看到对q个文g所有的提交。在不同?nbsp;revision 条目?#8220;右键 -> Compare with working copy”Q我们可以比较工作拷贝的文g和所?nbsp;revision 版本的区别?/p> </font></div> @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.tkk7.com/shmily432685/aggbug/354203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/shmily432685/" target="_blank">闉|</a> 2011-07-12 22:19 <a href="http://www.tkk7.com/shmily432685/archive/2011/07/12/354203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>产品介绍Q煤矿专用虹膜考勤?/title><link>http://www.tkk7.com/shmily432685/archive/2010/10/21/335800.html</link><dc:creator>闉|</dc:creator><author>闉|</author><pubDate>Thu, 21 Oct 2010 08:42:00 GMT</pubDate><guid>http://www.tkk7.com/shmily432685/archive/2010/10/21/335800.html</guid><wfw:comment>http://www.tkk7.com/shmily432685/comments/335800.html</wfw:comment><comments>http://www.tkk7.com/shmily432685/archive/2010/10/21/335800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/shmily432685/comments/commentRss/335800.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/shmily432685/services/trackbacks/335800.html</trackback:ping><description><![CDATA[<p> </p> <p><span style="font-family: simsun"><span style="font-size: 14pt"><span style="color: #ff6600"><strong>一、矿用考勤普遍存在的问?/strong></span></span></span></p> <ul> <li><span style="font-size: 12pt">您是否还在ؓ井下人员数量不准而发愁吗Q?/span> <li><span style="font-size: 12pt">您是否还在ؓ考勤代打卡而发愁吗Q?/span> <li><span style="font-size: 12pt">您是否还在ؓ考勤受外界环境的影响而发愁吗Q?/span></li> </ul> <p><span style="font-size: 14pt"><span style="color: #ff6600"><strong><span style="font-family: simsun">二、艾Ҏ益矿用虹膜考勤机简?/span></strong></span></span></p> <p><span style="font-size: 12pt">    艄永益矿用虹膜考勤Zؓ您解决一切烦|目前市场上广泛采用的卡QIC卡,频卡等问题无法解决替代性问题,而指UVh脸识别等生物识别技术,也因别精度不够,指纹Ҏ损伤、先天指U不清、下井h员面部因素、设备维护困隄问题不能满需要?br />     而虹膜识别考勤pȝ可以从根本上杜绝公司考勤时有人替打卡现象Q手指和因矿井的外在因素影响Q而且识别率很高?br />     q且虹膜考勤pȝ有着以下几方面的优点Q?br />     1?虹膜识别技术免接触Q不可以改Q安全性高Q?br />     2?正常状态下的虹膜识别速度?U左叟?br />     3?l计虹膜识别考勤数据快捷Q不需人工l计?br />     4?产品先进Q虹膜n份识别技术是目前所有生物识别技术里安全性,唯一性最高的Z生物识别技术。用上已经非常方便可靠Q所以投资一步到位,操作单,使用寿命ѝ?/span></p> <p><span style="font-size: 12pt"> 我们为您提供最优质的服务,Ҏ您的具体要求Q与各种其他pȝl合Q比如智能卡Q,完全实现订制?/span></p> <p><span style="font-family: simsun"><span style="font-size: 14pt"><span style="color: #ff6600"><strong>三、配套考勤软g</strong></span></span></span></p> <p><span style="font-size: 12pt">    考勤pȝ的目的是为实现员工考勤数据采集、数据统计和信息查询q程的自动化Q完善h事管理现代化Q方便员工上班报刎ͼ方便理人员l计、考核员工出勤情况Q方便管理部门查询、考核各部门出勤率Q准地掌握员工出勤情况Q有效地理、掌握h员流动情况,适用于机养I金融和各企事业单位?br />     考勤基本功能<br />     1. 员工上下班的数据Q经考勤软g从门数据库采集Qؓ原始考勤数据的来源?br />     2. l计Q统计系l将个h的信息进行过滤处理,只保留每天考勤记录Q然后按员工姓名、日期或其他分类方式q行l计Q生成各cL表?br />     3. 查询Q可Ҏ需要随时在查询pȝ查询各员工的上下班、出勤缺勤等情况Qƈ可随时打印出来?br />     4. 考勤理Q系l允许系l管理员q行pȝ讄。设|包括每ơ采集的有效旉D设|,q到、早退、旷工的旉讄{。如提前多少旉上班有效Q早退多少旉是旷工等。用户可以根据自q实际情况Q进行设|。可Ҏ公司的制度设定迟到、早退、旷工的条g?br />     5. 员工理Q每位员工都有较详细的信息,包括员工~号、部门、职位等?br />     6. 无h值守考勤Q记录Q何非法出入信息及囑փQ及时记录于机器盘上,断电仍可保证记录安全储存?/span></p> <p><span style="font-size: 12pt"><br class="img-brk" /> <br class="img-brk" /> <img style="width: 724px; height: 981px; visibility: visible" alt="" src="http://i00.c.aliimg.com/img/ibank/2010/798/240/191042897_802525787.jpg" /><br class="img-brk" /> <br class="img-brk" /> <span style="font-size: 12pt"><img style="width: 724px; height: 981px; visibility: visible" alt="" src="http://i00.c.aliimg.com/img/ibank/2010/667/240/191042766_802525787.jpg" /></span></span></p><img src ="http://www.tkk7.com/shmily432685/aggbug/335800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/shmily432685/" target="_blank">闉|</a> 2010-10-21 16:42 <a href="http://www.tkk7.com/shmily432685/archive/2010/10/21/335800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java: JNI完全手册http://www.tkk7.com/shmily432685/archive/2008/11/09/239528.html闉|闉|Sun, 09 Nov 2008 08:48:00 GMThttp://www.tkk7.com/shmily432685/archive/2008/11/09/239528.htmlhttp://www.tkk7.com/shmily432685/comments/239528.htmlhttp://www.tkk7.com/shmily432685/archive/2008/11/09/239528.html#Feedback1http://www.tkk7.com/shmily432685/comments/commentRss/239528.htmlhttp://www.tkk7.com/shmily432685/services/trackbacks/239528.html出处 http://www.pconline.com.cn/pcedu/empolder/gj/java/0506/642328.html
JAVA以其跨^台的Ҏ深受h们喜爱,而又正由于它的跨q_的目的,使得它和本地机器的各U内部联pd得很,U束了它的功能。解决JAVAҎ地操作的一U方法就是JNI?br />   JAVA通过JNI调用本地ҎQ而本地方法是以库文g的Ş式存攄Q在WINDOWSq_上是DLL文g形式Q在UNIX机器上是SO文g形式Q。通过调用本地的库文g的内部方法,使JAVA可以实现和本地机器的紧密联系Q调用系l的各接口Ҏ?br />
  单介l及应用如下Q?
  一、JAVA中所需要做的工?
  在JAVAE序中,首先需要在cM声明所调用的库(.dll)名称Q如下:
static { 
System.loadLibrary(“goodluck”); 
}
在这里,库的扩展名字可以不用写出来,I竟是DLLq是SOQ由pȝ自己判断?

  q需对将要调用的Ҏ做本地声明,关键字ؓnative。且只需要声明,而不需要具体实现。如下:
public native static void set(int i); 
public native static int get();
然后~译该JAVAE序文gQ生成CLASSQ再用JAVAH命oQJNI׃生成C/C++的头文g?

  例如E序testdll.javaQ内容ؓQ?br />
public class testdll 

static 

System.loadLibrary(
"goodluck"); 

public native static int get(); 
public native static void set(int i); 
public static void main(String[] args) 

testdll test 
= new testdll(); 
test.set(
10); 
System.out.println(test.get()); 

}
用javac testdll.java~译它,会生成testdll.class?
  再用javah testdllQ则会在当前目录下生成testdll.h文gQ这个文仉要被C/C++E序调用来生成所需的库文g?

  二、C/C++中所需要做的工?
  对于已生成的.h头文ӞC/C++所需要做的,是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文g拯到JAVAE序的\径下面,可以用JAVA调用C/C++所实现的功能了?
  接上例子。我们先看一下testdll.h文g的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include 
/* Header for class testdll */ 
#ifndef _Included_testdll 
#define _Included_testdll 
#ifdef __cplusplus 
extern 
"C" { 
#endif 
/* 
* Class: testdll 
* Method: get 
* Signature: ()I 
*/ 
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv 
*, jclass); 
/* 
* Class: testdll 
* Method: set 
* Signature: (I)V 
*/ 
JNIEXPORT 
void JNICALL Java_testdll_set (JNIEnv *, jclass, jint); 
#ifdef __cplusplus 

#endif 
#endif
  在具体实现的时候,我们只关心两个函数原?
  JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); ?
  JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);

  q里JNIEXPORT和JNICALL都是JNI的关键字Q表C此函数是要被JNI调用的。而jint是以JNIZ介JAVA的intcd与本地的int沟通的一U类型,我们可以视而不见,当做int使用。函数的名称是JAVA_再加上javaE序的package路径再加函数名组成的。参CQ我们也只需要关心在JAVAE序中存在的参数Q至于JNIEnv*和jclass我们一般没有必要去它?

  好,下面我们用testdll.cpp文g具体实现q两个函敎ͼ

#include "testdll.h" 
int i = 0
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv 
*, jclass) 

return i; 

JNIEXPORT 
void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j) 

= j; 
}
~译q接成库文gQ本例是在WINDOWS下做的,生成的是DLL文g。ƈ且名U要与JAVA中需要调用的一_q里是goodluck.dll 。把goodluck.dll拯到testdll.class的目录下Qjava testdllq行它,可以观察到l果了?
我的目比较复杂Q需要调用动态链接库Q这样在JNI传送参数到CE序Ӟ需要对参数q行处理转换。才可以被CE序识别?br />   大体E序如下Q?br />
public class SendSMS { 
static 

System.out.println(System.getProperty(
"java.library.path")); 
System.loadLibrary(
"sms"); 

public native static int SmsInit(); 
public native static int SmsSend(byte[] mobileNo, byte[] smContent); 
}

在这里要注意的是Qpath里一定要包含cd的\径,否则在程序运行时会抛出异常:
  java.lang.UnsatisfiedLinkError: no sms in java.library.path
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1491)
  at java.lang.Runtime.loadLibrary0(Runtime.java:788)
  at java.lang.System.loadLibrary(System.java:834)
  at com.mobilesoft.sms.mobilesoftinfo.SendSMS.(SendSMS.java:14)
  at com.mobilesoft.sms.mobilesoftinfo.test.main(test.java:18)
  Exception in thread "main"

  指引的\径应该到.dll文g的上一U,如果指到.dllQ则会报Q?br />   java.lang.UnsatisfiedLinkError: C:\sms.dll: Can't find dependent libraries
  at java.lang.ClassLoader$NativeLibrary.load(Native Method)
  at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1560)
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1485)
  at java.lang.Runtime.loadLibrary0(Runtime.java:788)
  at java.lang.System.loadLibrary(System.java:834)
  at com.mobilesoft.sms.mobilesoftinfo.test.main(test.java:18)
  Exception in thread "main"

  通过~译Q生成com_mobilesoft_sms_mobilesoftinfo_SendSMS.h头文件。(使用Jbuilderq行~译Q操作比较简单!Q这个头文g是Java和C之间的纽带。要特别注意的是Ҏ中传递的参数jbyteArrayQ这在接下来的过E中会重点介l?br />
/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include 
/* Header for class com_mobilesoft_sms_mobilesoftinfo_SendSMS */ 
#ifndef _Included_com_mobilesoft_sms_mobilesoftinfo_SendSMS 
#define _Included_com_mobilesoft_sms_mobilesoftinfo_SendSMS 
#ifdef __cplusplus 
extern 
"C" { 
#endif 
/* 
* Class: com_mobilesoft_sms_mobilesoftinfo_SendSMS 
* Method: SmsInit 
* Signature: ()I 
*/ 
JNIEXPORT jint JNICALL Java_com_mobilesoft_sms_mobilesoftinfo_SendSMS_SmsInit 
(JNIEnv 
*, jclass); 
/* 
* Class: com_mobilesoft_sms_mobilesoftinfo_SendSMS 
* Method: SmsSend 
* Signature: ([B[B)I 
*/ 
JNIEXPORT jint JNICALL Java_com_mobilesoft_sms_mobilesoftinfo_SendSMS_SmsSend 
(JNIEnv 
*, jclass, jbyteArray, jbyteArray); 
#ifdef __cplusplus 

#endif 
#endif

对于我要调用的CE序的动态链接库QCE序也要提供一个头文gQsms.h。这个文件将要调用的Ҏ|列了出来?br />
/* 
* SMS API 
* Author: yippit 
* Date: 2004.6.8 
*/ 
#ifndef MCS_SMS_H 
#define MCS_SMS_H 
#define DLLEXPORT __declspec(dllexport) 
/*sms storage*/ 
#define SMS_SIM 
0 
#define SMS_MT 
1 
/*sms states*/ 
#define SMS_UNREAD 
0 
#define SMS_READ 
1 
/*sms type*/ 
#define SMS_NOPARSE 
-1 
#define SMS_NORMAL 
0 
#define SMS_FLASH 
1 
#define SMS_MMSNOTI 
2 
typedef struct tagSmsEntry { 
int index; /*index, start from 1*/ 
int status; /*read, unread*/ 
int type; /*-1-can't parser 0-normal, 1-flash, 2-mms*/ 
int storage; /*SMS_SIM, SMS_MT*/ 
char date[24]; 
char number[32]; 
char text[144]; 
} SmsEntry; 
DLLEXPORT 
int SmsInit(void); 
DLLEXPORT 
int SmsSend(char *phonenum, char *content); 
DLLEXPORT 
int SmsSetSCA(char *sca); 
DLLEXPORT 
int SmsGetSCA(char *sca); 
DLLEXPORT 
int SmsSetInd(int ind); 
DLLEXPORT 
int SmsGetInd(void); 
DLLEXPORT 
int SmsGetInfo(int storage, int *max, int *used); 
DLLEXPORT 
int SmsSaveFlash(int flag); 
DLLEXPORT 
int SmsRead(SmsEntry *entry, int storage, int index); 
DLLEXPORT 
int SmsDelete(int storage, int index); 
DLLEXPORT 
int SmsModifyStatus(int storage, int index); /*unread -> read*/ 
#endif
在有了这两个头文件之后,可以进行CE序的编写了。也是实现对JNI调用的两个方法。在|上的资料中Q由于调用的Ҏ实现的都比较单,Q大多是打印字符串等Q所以避开了JNI中最ȝ的部分,也是最关键的部分,参数的传递。由于Java和C的编码是不同的,所以传递的参数是要q行再处理,否则CE序是会对参数在~译q程中提告,例如Qwarning C4024: 'SmsSend' : different types for formal and actual parameter 2{?br />   Sms.c的程序如下:
#include "sms.h" 
#include 
"com_mobilesoft_sms_mobilesoftinfo_SendSMS.h" 
JNIEXPORT jint JNICALL Java_com_mobilesoft_sms_mobilesoftinfo_SendSMS_SmsInit(JNIEnv 
* env, jclass jobject) 

return SmsInit(); 


JNIEXPORT jint JNICALL Java_com_mobilesoft_sms_mobilesoftinfo_SendSMS_SmsSend(JNIEnv 
* env, jclass jobject, jbyteArray mobileno, jbyteArray smscontent) 

char * pSmscontent ; 
//jsize theArrayLengthJ = (*env)->GetArrayLength(env,mobileno); 
jbyte * arrayBody = (*env)->GetByteArrayElements(env,mobileno,0); 
char * pMobileNo = (char *)arrayBody; 
printf(
"[%s]\n ", pMobileNo); 
//jsize size = (*env)->GetArrayLength(env,smscontent); 
arrayBody = (*env)->GetByteArrayElements(env,smscontent,0); 
pSmscontent 
= (char *)arrayBody; 
printf(
"<%s>\n", pSmscontent); 
return SmsSend(pMobileNo,pSmscontent); 
}

 对于C或C++Q在E序上是会有E微的不同,q可以由读者对其进行适当的修攏V这里要注意的是GetArrayLengthQGetByteArrayElements{这些JNI中已l包含的ҎQ这些方法是专门对{换参数类型而提供的。具体的Ҏ有很多,在下一中会做专门的介l?br />   在完成了上述的文件后Q可以对sms.cq行~译Q生?dll文gQ徏议在release中编译,q样动态链接库的容U会比较!Q?br />   完成.dll文g的编译后Q就可以在Java中调用CE序中的Ҏ了。例如文件test.java
public class test { 
public test() { 

public static void main(String[] args) { 
byte[] mobileno = { 
0x310x330x360x360x310x360x330x300x360x360x370x00}; 
String smscontentemp 
= "早上?/span>"
byte[] temp = {0}; 
try { 
byte[] smscontentdb = smscontentemp.getBytes("gbk"); 
byte[] smscontent = new byte[smscontentdb.length + temp.length]; 
System.arraycopy(smscontentdb, 
0, smscontent, 0, smscontentdb.length); 
System.arraycopy(temp, 
0, smscontent, smscontentdb.length, temp.length); 
SendSMS sendSMS 
= new SendSMS(); 
sendSMS.SmsInit(); 
if (sendSMS.SmsSend(mobileno, smscontent) >= 0) { 
System.out.println(
"chenggong !"); 

else { 
System.out.println(
"shibai !"); 

}
catch (Exception ex) {} 

}
在这个文件中要注意的有一点,是在传递字节数l到CE序中时Q最后的l尾一定要?l束。这是一个偷懒的做法Q不q是个有效的做法。因为大多数情况下,接口是由W三Ҏ供的。所以我们一般是不知道在C的方法里Q具体是怎么处理参数的。而C又是要求数组是有长度。所以,在Java中,如果你不惛_E序传数l的长度Q那么在数组中以0l尾是最方便的方法了。当Ӟ如果有更好的Ҏ也希望大家提出?br />
  到这里,一个完整的Java通过JNI调用动态链接库的程序就完成了。实际上也不是很复杂。只要多注意一下细节,是很Ҏ得出来的?


闉| 2008-11-09 16:48 发表评论
]]>
转蝲QJavaq程通讯可选技术及原理 http://www.tkk7.com/shmily432685/archive/2008/03/06/184249.html闉|闉|Thu, 06 Mar 2008 05:55:00 GMThttp://www.tkk7.com/shmily432685/archive/2008/03/06/184249.htmlhttp://www.tkk7.com/shmily432685/comments/184249.htmlhttp://www.tkk7.com/shmily432685/archive/2008/03/06/184249.html#Feedback0http://www.tkk7.com/shmily432685/comments/commentRss/184249.htmlhttp://www.tkk7.com/shmily432685/services/trackbacks/184249.html在分布式服务框架中,一个最基础的问题就是远E服务是怎么通讯的,在Java领域中有很多可实现远E通讯的技术,例如QRMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS{,q些名词之间到底是些什么关pdQ它们背后到底是Z什么原理实现的呢,了解q些是实现分布式服务框架的基知识Q而如果在性能上有高的要求的话Q那深入了解q些技术背后的机制是必须的了Q在q篇blog中我们将来一探究竟,抛砖引玉Q欢q大家提供更多的实现q程通讯的技术和原理的介l?br />
基本原理

要实现网l机器间的通讯Q首先得来看看计机pȝ|络通信的基本原理,在底层层面去看,|络通信需要做的就是将从一台计机传输到另外一台计机Q基于传输协议和|络IO来实玎ͼ其中传输协议比较出名的有http、tcp、udp{等Qhttp、tcp、udp都是在基于Socket概念上ؓ某类应用场景而扩展出的传输协议,|络IOQ主要有bio、nio、aio三种方式Q所有的分布式应用通讯都基于这个原理而实玎ͼ只是Z应用的易用,各种语言通常都会提供一些更q应用易用的应用层协议?br />
应用U协?/strong>

q程服务通讯Q需要达到的目标是在一台计机发vhQ另外一台机器在接收到请求后q行相应的处理ƈ结果返回给h端,q其中又会有诸如one way request、同步请求、异步请求等{请求方式,按照|络通信原理Q需要实现这个需要做的就是将h转换成流Q通过传输协议传输臌端,q端计算机在接收到请求的后q行处理Q处理完毕后结果{化ؓ,q过传输协议q回l调用端?br /> 原理是这LQ但Z应用的方便,业界推出了很多基于此原理之上的应用的协议,使得大家可以不用ȝ接操作这么底层的东西Q通常应用U的q程通信协议会提供:
1、ؓ了避免直接做操作这么麻烦,提供一U更加易用或贴合语言的标准传输格式;
2、网l通信机制的实玎ͼ是替你完成了将传输格式转化为流Q通过某种传输协议传输臌端计机Q远端计机在接收到后转化Z输格式,q进行存储或以某U方式通知q端计算机?br /> 所以在学习应用U的q程通信协议Ӟ我们可以带着q几个问题进行学习:
1、传输的标准格式是什么?
2、怎么样将h转化Z输的?
3、怎么接收和处理流Q?br /> 4、传输协议是Q?br /> 不过应用U的q程通信协议q不会在传输协议上做什么多大的改进Q主要是在流操作斚wQ让应用层生成流和处理流的这个过E更加的贴合所使用的语a或标准,至于传输协议则通常都是可选的Q在java领域中知名的有:RMI、XML-RPC、Binary-RPC、SOAP、CORBA、JMSQ来具体的看看这些远E通信的应用协议Q?br /> --------------------------------------------------------------------------------------------------------------------------------------------------
RMI

RMI是个典型的ؓjava定制的远E通信协议Q我们都知道Q在single vm中,我们可以通过直接调用java object instance来实现通信Q那么在q程通信Ӟ如果也能按照q种方式当然是最好了Q这U远E通信的机制成为RPCQRemote Procedure CallQ,RMI正是朝着q个目标而诞生的?br /> 来看下基于RMI的一ơ完整的q程通信q程的原理:
1、客L发vhQ请求{交至RMI客户端的stubc;
2、stubcdh的接口、方法、参数等信息q行序列化;
3、基于socket序列化后的传输至服务器端Q?br /> 4、服务器端接收到后转发至相应的skeltonc;
5、skeltoncdh的信息反序列化后调用实际的处理类Q?br /> 6、处理类处理完毕后将l果q回lskeltonc;
7、Skeltoncdl果序列化,通过socket流传送给客户端的stubQ?br /> 8、stub在接收到后反序列化Q将反序列化后的Java Objectq回l调用者?br /> 来看jboss-remoting对于此过E的一个更好的囄Q?br />
Ҏ原理来回{下之前学习应用U协议带着的几个问题:
1、传输的标准格式是什么?
      是Java ObjectStream?br /> 2、怎么样将h转化Z输的?
      ZJava串行化机制将h的java object信息转化为流?br /> 3、怎么接收和处理流Q?br />       Ҏ采用的协议启动相应的监听端口Q当有流q入后基于Java串行化机制将进行反序列化,q根据RMI协议获取到相应的处理对象信息Q进行调用ƈ处理Q处理完毕后的结果同样基于java串行化机制进行返回?br /> 4、传输协议是Q?br />       Socket?br /> --------------------------------------------------------------------------------------------------------------------------------------------------
XML-RPC
XML-RPC也是一U和RMIcM的远E调用的协议Q它和RMI的不同之处在于它以标准的xml格式来定义请求的信息(h的对象、方法、参数等)Q这L好处是什么呢Q就是在跨语a通讯的时候也可以使用?br /> 来看下XML-RPC协议的一ơ远E通信q程Q?br /> 1、客L发vhQ按照XML-RPC协议请求信息进行填充;
2、填充完毕后xml转化为流Q通过传输协议q行传输Q?br /> 3、接收到在接收到后转换为xmlQ按照XML-RPC协议获取h的信息ƈq行处理Q?br /> 4、处理完毕后结果按照XML-RPC协议写入xml中ƈq回?br /> 囄以上q程Q?br />
同样来回{问题:
1、传输的标准格式是?
      标准格式的XML?br /> 2、怎么样将h转化Z输的?
      XML转化为流?br /> 3、怎么接收和处理流Q?br />       通过监听的端口获取到h的流Q{化ؓXMLQƈҎ协议获取h的信息,q行处理q将l果写入XML中返回?br /> 4、传输协议是Q?br />       Http?br /> --------------------------------------------------------------------------------------------------------------------------------------------------
Binary-RPC
Binary-RPC看名字就知道和XML-RPC是差不多的了Q不同之处仅在于传输的标准格式由XML转ؓ了二q制的格式?br /> 同样来回{问题:
1、传输的标准格式是?
      标准格式的二q制文g?br /> 2、怎么样将h转化Z输的?
      二q制格式文g转化为流?br /> 3、怎么接收和处理流Q?br />       通过监听的端口获取到h的流Q{化ؓ二进制文ӞҎ协议获取h的信息,q行处理q将l果写入XML中返回?br /> 4、传输协议是Q?br />       Http?br /> --------------------------------------------------------------------------------------------------------------------------------------------------
SOAP
SOAP原意为Simple Object Access ProtocolQ是一个用于分布式环境的、轻量的、基于XMLq行信息交换的通信协议Q可以认为SOAP是XML RPC的高U版Q两者的原理完全相同Q都是http+XMLQ不同的仅在于两者定义的XML规范不同QSOAP也是Webservice采用的服务调用协议标准,因此在此׃多加阐述了?br /> --------------------------------------------------------------------------------------------------------------------------------------------------
CORBA
Common Object Request Broker ArchitectureQ公用对象请求代理[调度]E序体系l构Q,是一l用来定?#8220;分布式对象系l?#8221;的标准,由OMG(Object Menagement Group)作ؓ发v和标准制定单位。CORBA的目的是定义一套协议,W合q个协议的对象可以互怺互,不论它们是用什么样的语a写的Q不论它们运行于什么样的机器和操作pȝ?br /> CORBA在我看来是个cM于SOA的体pL构,늛可选的q程通信协议Q但其本w不能列入通信协议q里来讲Q而且CORBA基本淘汰Q再加上对CORBA也不怎么懂,在此׃q行阐述了?br /> --------------------------------------------------------------------------------------------------------------------------------------------------
JMS
JMS呢,是实现java领域q程通信的一U手D和ҎQ基于JMS实现q程通信时和RPC是不同的Q虽然可以做到RPC的效果,但因Z是从协议U别定义的,因此我们不认为JMS是个RPC协议Q但它确实是个远E通信协议Q在其他的语a体系中也存在着cMJMS的东西,可以l一的将q类机制UCؓ消息机制Q而消息机制呢Q通常是高q发、分布式领域推荐的一U通信机制Q这里的主要一个问题是定wQ详l见ErLang论文Q?br /> 来看JMS中的一ơ远E通信的过E:
1、客L请求{化ؓW合JMS规定的MessageQ?br /> 2、通过JMS APIMessage攑օJMS Queue或Topic中;
3、如为JMS QueueQ则发送中相应的目标Queue中,如ؓTopicQ则发送给订阅了此Topic的JMS Queue?br /> 4、处理端则通过轮训JMS QueueQ来获取消息Q接收到消息后根据JMS协议来解析Messageq处理?br /> 回答问题Q?br /> 1、传输的标准格式是?
      JMS规定的Message?br /> 2、怎么样将h转化Z输的?
      参C息放入Message中即可?br /> 3、怎么接收和处理流Q?br />       轮训JMS Queue来接收MessageQ接收到后进行处理,处理完毕后仍然是以Message的方式放入Queue中发送或Multicast?br /> 4、传输协议是Q?br />       不限?br /> ZJMS也是常用的实现远E异步调用的Ҏ之一?br />
可选实现技?/strong>
当然Q在上面的原理中q没有介l到所有的java领域可选的q程通信协议了,例如q有EJB采用的ORMI、Spring自己定义的一个简单的Http Invoker{等?br /> 看完原理后我们再来看看目前java领域可用于实现远E通讯的框架或libraryQ知名的有:JBoss-Remoting、Spring-Remoting、Hessian、Burlap、XFire(Axis)、ActiveMQ、Mina、Mule、EJB3{等Q来ҎU做个简单的介绍和评P其实呢,要做分布式服务框Ӟq些东西都是要有非常深刻的了解的Q因为分布式服务框架其实是包含了解决分布式领域以及应用层面领域两斚w问题的?br /> 当然Q你也可以自己根据远E网l通信原理(transport protocol+Net IO)d现自q通讯框架或library?br /> 那么在了解这些远E通讯的框架或libraryӞ会带着什么问题去学习呢?
1、是Z什么协议实现的Q?br /> 2、怎么发vhQ?br /> 3、怎么请求{化ؓW合协议的格式的Q?br /> 4、用什么传输协议传输?
5、响应端Z什么机制来接收hQ?br /> 6、怎么流q原Z输格式的Q?br /> 7、处理完毕后怎么回应Q?br /> --------------------------------------------------------------------------------------------------------------------------------------------------
JBoss-Remoting
Jboss-remoting是由jboss~写的一个java领域的远E通讯框架Q基于此框架Q可以很单的实现Z多种传输协议的java对象的RPC?br /> 直接来回{问题:
1、是Z什么协议实现的Q?br />       JBoss-Remoting是个通讯框架Q因此它支持多种协议方式的通信Q例如纯_的socket+io方式、rmi方式、http+io方式{?br /> 2、怎么发vhQ?br />       在JBoss-Remoting中,只需需要发Lh参数对象传入jboss-remoting的InvocationRequest对象卛_Q也可根据协议基于InvocationRequest装W合需求的InvocationRequest对象?br /> 3、怎么请求{化ؓW合协议的格式的Q?br />       JBoss-RemotingZJava串行化机制或JBoss自己的串行化实现来将h转化为对象字节流?br /> 4、用什么传输协议传输?
      支持多种传输协议Q例如socket、http{?br /> 5、响应端Z什么机制来接收hQ?br />       响应端只需自q处理对象注册到JBoss-Remoting提供的server端的Connector对象中即可?br /> 6、怎么流q原Z输格式的Q?br />       JBoss-RemotingZjava串行化机制或jboss自己的串行化实现来将h信息q原为java对象?br /> 7、处理完毕后怎么回应Q?br />       处理完毕后将l果对象直接q回卛_Qjboss-remoting会将此对象按照协议进行序列化Q返回至调用端?br /> 另外Qjboss-remoting支持多种通信方式Q例如同?异步/单向通信{?br />
--------------------------------------------------------------------------------------------------------------------------------------------------
spring in action-Remoting
spring in action-remoting是Spring提供java领域的远E通讯框架Q基于此框架Q同样也可以很简单的普通的spring bean以某U远E协议的方式来发布,同样也可以配|spring beanE调用的bean?br /> 1、是Z什么协议实现的Q?br />       和JBoss-Remoting一P作ؓ一个远E通讯的框ӞSpring通过集成多种q程通讯的libraryQ从而实C对多U协议的支持Q例如rmi、http+io、xml-rpc、binary-rpc{?br /> 2、怎么发vhQ?br />       在Spring中,׃其对于远E调用的bean采用的是proxy实现Q发赯求完全是通过服务接口调用的方式?br /> 3、怎么请求{化ؓW合协议的格式的Q?br />       Spring按照协议方式请求的对象信息转化为流Q例如Spring Http Invoker是基于Spring自己定义的一个协议来实现的,传输协议上采用的为httpQ请求信息是Zjava串行化机制{化ؓ进行传输?br /> 4、用什么传输协议传输?
      支持多种传输协议Q例如rmi、http{等?br /> 5、响应端Z什么机制来接收hQ?br />       响应端遵循协议方式来接收hQ对于用者而言Q则只需通过spring的配|方式将普通的spring bean配置为响应端或者说提供服务端?br /> 6、怎么流q原Z输格式的Q?br />       按照协议方式来进行还原?br /> 7、处理完毕后怎么回应Q?br />       处理完毕后直接返回即可,spring-remoting根据协议方式来做相应的序列化?br />
--------------------------------------------------------------------------------------------------------------------------------------------------
Hessian
Hessian是由caucho提供的一个基于binary-RPC实现的远E通讯library?br /> 1、是Z什么协议实现的Q?br />       ZBinary-RPC协议实现?br /> 2、怎么发vhQ?br />       需通过Hessian本n提供的API来发赯求?br /> 3、怎么请求{化ؓW合协议的格式的Q?br />       Hessian通过其自定义的串行化机制请求信息进行序列化Q生二q制?br /> 4、用什么传输协议传输?
      HessianZHttp协议q行传输?br /> 5、响应端Z什么机制来接收hQ?br />       响应端根据Hessian提供的API来接收请求?br /> 6、怎么流q原Z输格式的Q?br />       HessianҎ其私有的串行化机制来请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了?br /> 7、处理完毕后怎么回应Q?br />       处理完毕后直接返回,hessian结果对象进行序列化Q传输至调用端?br />
--------------------------------------------------------------------------------------------------------------------------------------------------
Burlap
Burlap也是有caucho提供Q它和hessian的不同在于,它是ZXML-RPC协议的?br /> 1、是Z什么协议实现的Q?br />       ZXML-RPC协议实现?br /> 2、怎么发vhQ?br />       ҎBurlap提供的API?br /> 3、怎么请求{化ؓW合协议的格式的Q?br />       请求信息{化ؓW合协议的XML格式Q{化ؓ进行传输?br /> 4、用什么传输协议传输?
      Http协议?br /> 5、响应端Z什么机制来接收hQ?br />       监听Httph?br /> 6、怎么流q原Z输格式的Q?br />       ҎXML-RPC协议q行q原?br /> 7、处理完毕后怎么回应Q?br />       q回l果写入XML中,由Burlapq回臌用端?br />
--------------------------------------------------------------------------------------------------------------------------------------------------
XFire、Axis
XFire、Axis是Webservice的实现框ӞWebService可算是一个完整的SOA架构实现标准了,因此采用XFire、Axisq些也就意味着是采用webservice方式了?br /> 1、是Z什么协议实现的Q?br />       ZSOAP协议?br /> 2、怎么发vhQ?br />       获取到远端service的proxy后直接调用?br /> 3、怎么请求{化ؓW合协议的格式的Q?br />       请求信息{化ؓ遵@SOAP协议的XML格式Q由框架转化为流q行传输?br /> 4、用什么传输协议传输?
      Http协议?br /> 5、响应端Z什么机制来接收hQ?br />       监听Httph?br /> 6、怎么流q原Z输格式的Q?br />       ҎSOAP协议q行q原?br /> 7、处理完毕后怎么回应Q?br />       q回l果写入XML中,由框架返回至调用端?br />
--------------------------------------------------------------------------------------------------------------------------------------------------
ActiveMQ
ActiveMQ是JMS的实玎ͼZJMSq类消息机制实现q程通讯是一U不错的选择Q毕竟消息机制本w的功能使得Z它可以很Ҏ的去实现同步/异步/单向调用{,而且消息机制从容错角度上来说也是个不错的选择Q这是Erlang能够做到定w的重要基?br /> 1、是Z什么协议实现的Q?br />       ZJMS协议?br /> 2、怎么发vhQ?br />       遵@JMS API发vh?br /> 3、怎么请求{化ؓW合协议的格式的Q?br />       不太清楚Q猜惛_该是二进制流?br /> 4、用什么传输协议传输?
      支持多种传输协议Q例如socket、http{等?br /> 5、响应端Z什么机制来接收hQ?br />       监听W合协议的端口?br /> 6、怎么流q原Z输格式的Q?br />       同问??br /> 7、处理完毕后怎么回应Q?br />       遵@JMS API生成消息Qƈ写入JMS Queue中?br /> ZJMS此类机制实现q程通讯的例子有Spring-Intergration、Mule、Lingo{等?br />
--------------------------------------------------------------------------------------------------------------------------------------------------
Mina
Mina是Apache提供的通讯框架Q在之前一直没有提到网lIOq块Q之前提及的框架或library基本都是ZBIO的,而Mina是采用NIO的,NIO在ƈ发量增长时对比BIO而言会有明显的性能提升Q而java性能的提升,与其NIOq块与OS的紧密结合是有不的关系的?br /> 1、是Z什么协议实现的Q?br />       ZUa的Socket+NIO?br /> 2、怎么发vhQ?br />       通过Mina提供的Client API?br /> 3、怎么请求{化ؓW合协议的格式的Q?br />       Mina遵@java串行化机制对h对象q行序列化?br /> 4、用什么传输协议传输?
      支持多种传输协议Q例如socket、http{等?br /> 5、响应端Z什么机制来接收hQ?br />       以NIO的方式监听协议端口?br /> 6、怎么流q原Z输格式的Q?br />       遵@java串行化机制对h对象q行反序列化?br /> 7、处理完毕后怎么回应Q?br />       遵@Mina APIq行q回?br /> MINA是NIO方式的,因此支持异步调用是毫无悬늚?br />
--------------------------------------------------------------------------------------------------------------------------------------------------
EJB
EJB最H出的在于其分布式,EJB采用的是ORMI协议Q和RMI协议是差不多的,但EJB在分布式通讯的安全控制、transport pool、smart proxy{方面的H出使得其在分布式领域是不可忽视的力量?br /> 1、是Z什么协议实现的Q?br />       ZORMI协议?br /> 2、怎么发vhQ?br />       EJB调用?br /> 3、怎么请求{化ؓW合协议的格式的Q?br />       遵@java串行化机制对h对象q行序列化?br /> 4、用什么传输协议传输?
      Socket?br /> 5、响应端Z什么机制来接收hQ?br />       监听协议端口?br /> 6、怎么流q原Z输格式的Q?br />       遵@java串行化机制对h对象q行反序列化?br /> 7、处理完毕后怎么回应Q?br />       直接q回处理对象卛_?br />
在之前的分布式服务框架系列的文章中对于jndi有误导的嫌疑Q在q篇blog中也带的提下jndi的机Ӟ׃JNDI取决于具体的实现Q在q里只能是讲解下jboss的jndi的实C?br /> 在将对象实例l定到jboss jnp server后,当远E端采用context.lookup()方式获取q程对象实例q开始调用时Qjboss jndi的实现方法是从jnp server上获取对象实例,其序列化回本地Q然后在本地q行反序列化Q之后在本地q行c调用?br /> 通过q个机制Q就可以知道了,本地其实是必Ll定到jboss上的对象实例的class的,否则反序列化的时候肯定就p|了,而远E通讯需要做到的是在q程执行某动作,q获取到相应的结果,可见UaZJNDI是无法实现远E通讯的?br /> 但JNDI也是实现分布式服务框架一个很关键的技术点Q因为可以通过它来实现透明化的q端和本地调用,像ejbQ另外它也是个很好的隐藏实际部v机制(像datasource){的Ҏ?br />
ȝ
׃一pd的分析可知,在远E通讯领域中,涉及的知识点q是相当的多的,例如有:通信协议(Socket/tcp/http/udp/rmi/xml-rpc etc.)、消息机制、网lIOQBIO/NIO/AIOQ、MultiThread、本地调用与q程调用的透明化方案(涉及java classloader、Dynamic Proxy、Unit Test etc.Q、异步与同步调用、网l通信处理机制Q自动重q、广播、异常、池处理{等Q、Java Serialization (各种协议的私有序列化机制{?、各U框架的实现原理Q传输格式、如何将传输格式转化为流的、如何将h信息转化Z输格式的、如何接收流的、如何将还原ؓ传输格式的等{)Q要_N其中的哪些东西Q得Ҏ实际需求来军_了,只有在了解了原理的情况下才能很容易的做出选择Q甚臛_以根据需求做U有的远E通讯协议Q对于从事分布式服务q_或开发较大型的分布式应用的h而言Q我觉得臛_上面提及的知识点是需要比较了解的?br />
参考文档(感谢q些文章Q?/strong>
RMI原理及实玎ͼhttp://www.yesky.com/274/1625274.shtml
Java NIO原理和用:http://www.jdon.com/concurrent/nio%D4%AD%C0%ED%D3%A6%D3%C3.htm
XML RPC协议Q?a target="_blank">http://hedong.3322.org/archives/000470.html
                             http://www.mengyan.org/blog/archives/2005/07/12/30.html
Spring技术应用中的远E服务详解:http://www.builder.com.cn/2007/1027/583384.shtml
JAVA RPC通信机制之SOAPQ?/span>http://www.java114.com/content16/content3826.html
Java RemotingQProtocol BenchMarksQ?a target="_blank">http://q.sohu.com/forum/5/topic/1148909
Evalution of RMI AlternativeQ?a target="_blank">https://www.jfire.org/modules/phpwiki/index.php/Evaluation%20of%20RMI%20Alternative
Metaprotocol TaxonomyQ?a target="_blank">http://hessian.caucho.com/doc/metaprotocol-taxonomy.xtp
什么是WebserviceQ?a >http://www.vchome.net/dotnet/webservice/webservice15.htm

闉| 2008-03-06 13:55 发表评论
]]>
mysql快速批量导入文本数?/title><link>http://www.tkk7.com/shmily432685/archive/2007/10/16/153329.html</link><dc:creator>闉|</dc:creator><author>闉|</author><pubDate>Tue, 16 Oct 2007 09:10:00 GMT</pubDate><guid>http://www.tkk7.com/shmily432685/archive/2007/10/16/153329.html</guid><wfw:comment>http://www.tkk7.com/shmily432685/comments/153329.html</wfw:comment><comments>http://www.tkk7.com/shmily432685/archive/2007/10/16/153329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/shmily432685/comments/commentRss/153329.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/shmily432685/services/trackbacks/153329.html</trackback:ping><description><![CDATA[<p>q日有一文本文gQ数据格式是以tab分割。数据量有数千万条数据,需要导入mysql数据库中Q通过传统的方式进行拷贝到数据库中Q需要花费很多天旉Q中间也会出现很多错误,未必能导入成功?br /> 使用Qload data local infile "本地路径" into table 表名命o方式q行导入Q?0w条数据也只需要花费几U钟旉Q可中文无法导入?br /> 仔细分析了一下:<br />        建库旉用utf8~码Q表也是utf8~码。对中文应该是支持的。排除数据库的问题?br />        只能从要导入的文本文件考虑Q将其编码用ultraEdit转换~码为utf8后,q行导入Q成功导入。数据也没有出现错误?nbsp;</p> 也可采用select * from 表名 into outfile "c:\\文g路径";q行查询Q进行导中的数据为文本文件格式?<br /> 也可以采用select * from 表名 into outfile "c:\\stu_t.txt" lines terminated by '\r\n';q行查询Q导出?img src ="http://www.tkk7.com/shmily432685/aggbug/153329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/shmily432685/" target="_blank">闉|</a> 2007-10-16 17:10 <a href="http://www.tkk7.com/shmily432685/archive/2007/10/16/153329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l典|摘http://www.tkk7.com/shmily432685/archive/2007/04/23/112931.html闉|闉|Mon, 23 Apr 2007 05:29:00 GMThttp://www.tkk7.com/shmily432685/archive/2007/04/23/112931.htmlhttp://www.tkk7.com/shmily432685/comments/112931.htmlhttp://www.tkk7.com/shmily432685/archive/2007/04/23/112931.html#Feedback1http://www.tkk7.com/shmily432685/comments/commentRss/112931.htmlhttp://www.tkk7.com/shmily432685/services/trackbacks/112931.html?吃饭+睡觉+上班+?
?吃饭+ 睡觉,
代入:??上班+?
????上班.
l论:不懂玩的?会上班的?nbsp; 

男h=吃饭+ 睡觉+挣钱
?吃饭+ 睡觉
男h=?挣钱
?男h-挣钱
所以男Z挣钱{于猪?/p>

女h=吃饭+ 睡觉+花钱?br>?nbsp; =吃饭+ 睡觉。代入上式得Q?br>女h=?花钱。移得Q?br>女h-花钱=猪?br>l论Q女Z花钱的都是猪?/p>

lgQ?br>男hZ让女Z变成猪而挣钱!
女hZ让男Z变成猪而花?

 

写字楼里写字_写字间中E序?br>E序人员写程序,又将E序换酒?br>酒醒只在屏前坐,酒醉q来屏下?br>酒醉酒醒日复日,屏前屏下q复q?br>但愿老死电脑_不愿鞠躬老板?br>奔驰宝马贵者趣Q公交自行程序员
别hW我太疯癫,我笑自己命太?br>但见满街漂亮妹,哪个归得E序?/p>

闉| 2007-04-23 13:29 发表评论
]]>
tomcat+mysql+jbpm配置工作(1Q?/title><link>http://www.tkk7.com/shmily432685/archive/2007/03/30/107517.html</link><dc:creator>闉|</dc:creator><author>闉|</author><pubDate>Fri, 30 Mar 2007 09:42:00 GMT</pubDate><guid>http://www.tkk7.com/shmily432685/archive/2007/03/30/107517.html</guid><wfw:comment>http://www.tkk7.com/shmily432685/comments/107517.html</wfw:comment><comments>http://www.tkk7.com/shmily432685/archive/2007/03/30/107517.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/shmily432685/comments/commentRss/107517.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/shmily432685/services/trackbacks/107517.html</trackback:ping><description><![CDATA[     摘要: 初次研究工作Jbpm配置与开发: <br>JDK142 <br>tomcat 5.0 <br>mysql 5.0.16 <br>apache-ant-1.6.5 <br>jbpm-starters-kit-3.1.4 <br>  <a href='http://www.tkk7.com/shmily432685/archive/2007/03/30/107517.html'>阅读全文</a><img src ="http://www.tkk7.com/shmily432685/aggbug/107517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/shmily432685/" target="_blank">闉|</a> 2007-03-30 17:42 <a href="http://www.tkk7.com/shmily432685/archive/2007/03/30/107517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用js控制功能攉(待箋)http://www.tkk7.com/shmily432685/archive/2007/03/09/102760.html闉|闉|Fri, 09 Mar 2007 02:55:00 GMThttp://www.tkk7.com/shmily432685/archive/2007/03/09/102760.htmlhttp://www.tkk7.com/shmily432685/comments/102760.htmlhttp://www.tkk7.com/shmily432685/archive/2007/03/09/102760.html#Feedback0http://www.tkk7.com/shmily432685/comments/commentRss/102760.htmlhttp://www.tkk7.com/shmily432685/services/trackbacks/102760.html  下面我们再对弹出H口q行一些控Ӟ效果更好了。如果我们再一段代码加入弹出的页面(注意是加入到page.html的HTML中,可不是主面中,否则…)Q让它在10U钟?b style="COLOR: black; BACKGROUND-COLOR: #ff66ff">自动关闭是不是更酷了Q?   
  首先Q将如下代码加入page.html文g?lt;head>区:    
  <script   language="javascript">    
  function   closeit()   {    
  setTimeout("self.close()",10000)   //毫秒    
  }    
  </script>    
  然后Q再?lt;body   onload="closeit()">q一句话代替page.html中原有的<BODY>q一句就可以了。(q一句话千万不要忘记写啊Q这一句的作用是调用关闭窗口的代码Q?0U钟后就自行关闭该窗口。)    


闉| 2007-03-09 10:55 发表评论
]]>
在Windowsq_使用Apache2.2和Mongrelq行Ruby on Railshttp://www.tkk7.com/shmily432685/archive/2007/01/15/93939.html闉|闉|Mon, 15 Jan 2007 05:23:00 GMThttp://www.tkk7.com/shmily432685/archive/2007/01/15/93939.htmlhttp://www.tkk7.com/shmily432685/comments/93939.htmlhttp://www.tkk7.com/shmily432685/archive/2007/01/15/93939.html#Feedback0http://www.tkk7.com/shmily432685/comments/commentRss/93939.htmlhttp://www.tkk7.com/shmily432685/services/trackbacks/93939.html摘自:http://www.javaeye.com/topic/43290
一、安装Ruby、rails、mongrel和Apache2.2
 
从rubyforge|站下蝲One-Click Ruby InstallQ运行安装程序,安装好了ruby和rubygems?/div>
 
q行命oQ?/div>
gem install rails –y
gem install mongrel –y
gem install mongrel_service -y
安装好了rails和mongrel
 
从Apache|站下蝲Windows版本的Apache2.2Q运行安装程序,安装好了Apache2.2?/div>
 
二、把Mongrel作ؓServices启动
 
mongrel_rails service::install -N depot -c d:\Rubyproject\depot -p 3000 –e production
-N指明服务名称Q?d指明rails应用的目录,-p是mongrel监听的tcp端口Q?e是启动模式ؓ生模式
 
q样打开控制面版|理工具|服务Q就可以发现增加了一名为“depot”的服务Q就可以通过控制面版来管理服务了。如果需要命令行启动和关闭该服务Q那么:
mongrel_rails service::start -N depot
mongrel_rails service::stop -N depot
 
如果需要从服务中注销该项服务Q那么:
mongrel_rails service::remove -N depot
 
如果需要安装多个mongrel实例Q那么可以这P
mongrel_rails service::install -N depot0 -c d:\Rubyproject\depot -p 3000 –e production
mongrel_rails service::install -N depot1 -c d:\Rubyproject\depot -p 3001 –e production
诸如此类?/div>
 
三、配|Apache2.2
 
用编辑工h开Apache2.2目录下面的conf/httpd.confQ需要取消如下模块的注释Q?/div>
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
如果你希望对面输出使用压羃Q也需要取消如下模块的注释Q?/div>
LoadModule deflate_module modules/mod_deflate.so
 
然后按如下内定w|基于HTTP代理的负载均衡:
xml 代码
 
  1. ProxyRequests Off   
  2. < Proxy  balancer://myCluster >   
  3.   BalancerMember http://localhost:3000   
  4.   BalancerMember http://localhost:3001   
  5. >   
  6.   
  7. < VirtualHost  *:80 >   
  8.   ServerName www.xxx.com   
  9.   DocumentRoot d:/rubyproject/depot/public   
  10.   ProxyPass /images !   
  11.   ProxyPass /stylesheets !   
  12.   ProxyPass /javascripts !   
  13.   ProxyPass / balancer://myCluster/   
  14.   ProxyPassReverse / balancer://myCluster/   
  15.   ProxyPreserveHost on   
  16. >   
 
myCluster定义了群集中的每个mongrel应用服务器节炏VProxyPass /images !指明该URL开始的h不代理给Mongrel集Q而由Apache自己处理。重起ApacheQ然后打开览器访?a >www.xxx.comQ检查配|是否正?/div>
 
xQ在Windows Server上面一个具备良好稳定性和性能的Ruby on rails生环境搭建好了?/div>
 
对于面输出Q还可以使用mod_deflateq行输出内容压羃Q以提高面下蝲速度Q这个就留给大家自己配置了?br />

关闭标记被Rich Editorqo掉了Q重新用bbcode贴一下:

代码
  1. ProxyRequests Off       
  2. <Proxy balancer://myCluster>      
  3.   BalancerMember http://localhost:3000       
  4.   BalancerMember http://localhost:3001       
  5. </Proxy>      
  6.       
  7. <VirtualHost *:80>      
  8.   ServerName www.xxx.com       
  9.   DocumentRoot d:/rubyproject/depot/public       
  10.   ProxyPass /images !       
  11.   ProxyPass /stylesheets !       
  12.   ProxyPass /javascripts !       
  13.   ProxyPass / balancer://myCluster/       
  14.   ProxyPassReverse / balancer://myCluster/       
  15.   ProxyPreserveHost on       
  16. </VirtualHost>    

cluster的作用不是加速单个请求的Q是提高整体的负载能力的?/p>



闉| 2007-01-15 13:23 发表评论
]]>解决java.lang.UnsupportedClassVersionError问题Q!http://www.tkk7.com/shmily432685/archive/2006/12/29/90651.html闉|闉|Fri, 29 Dec 2006 01:44:00 GMThttp://www.tkk7.com/shmily432685/archive/2006/12/29/90651.htmlhttp://www.tkk7.com/shmily432685/comments/90651.htmlhttp://www.tkk7.com/shmily432685/archive/2006/12/29/90651.html#Feedback0http://www.tkk7.com/shmily432685/comments/commentRss/90651.htmlhttp://www.tkk7.com/shmily432685/services/trackbacks/90651.html步骤Q右M的项目-Q>属性-Q>Java CompilerQ设|合适的版本Q!  阅读全文

闉| 2006-12-29 09:44 发表评论
]]>
վ֩ģ壺 ˮһ| ޾ƷӰ| ëƬ18ŮëƬ96| ޳AVƬWWW| һ| ¼Ƶѿ| Ʒ_˳| ޹ۺһ| ëƬ߿Ƭ˿Ƶ| һëƬƵ| ޳aƬ߹ۿ!!!| ޾ƷþëƬ| avѸ߳ˮ| jizzӰӹۿվ| ˳ɵӰ߲| 츾þþ| Ů18ëƬëƬ| 91ѹۿ| 337Pձŷ޴ͼ| þþƷAV㽶| av㽶ˬˬˬˬ| һƷһAVһи| ˾Ʒѿ| ŮҹƵ| ޳˻ɫַ| Ʒþþþþ| ѹۿĻƷ| Ƭ߹ۿѹۿӰ| 99þþƷëƬѲ| ޾Ʒ߹ۿ| ŷձ߹ۿ| ˾þô߽| ˳Ƶ| ޹Ʒ߹ۿ| ˮƵ߹ۿѲŸ| 91ƷվƷ| þ4438| Ƶһ߹ۿ| þ޸ۿ| ޾Ʒa vС˵| һëƬ߲|