c和java通讯_javascript 与applet的通讯 和java与c(dll文件)通讯,最终在b/s架构下实现与硬件(读卡器)通讯...

该博客详细介绍了如何在B/S架构下实现JavaScript与Applet的通讯,以及Java通过JNI调用C语言(DLL)与硬件设备(如读卡器)进行通讯。通过实例展示了从编写Java、C代码,到生成DLL,再到Applet和JSP的部署,最后调整客户端安全权限以确保通讯的安全性和可行性。
摘要由CSDN通过智能技术生成

javascript 与applet的通讯 和java与c(dll文件)通讯,最终在b/s架构下实现与硬件(读卡器)通讯

在b/s架构下怎样实现客户端的硬件(读卡器)设备通讯,得到硬件(读卡器)的数据。在此与硬件设备通讯的C或其它的通讯设备语言是由

商提供的。我只负责实现javascript与applet通讯和jni与c通讯.在此我们要解决的问题是:

1)javascript和applet怎样通讯?

2)java怎样调用c来实现和硬件通讯?

3)由于applet的安全级别非常的高,那么怎样实现安全认证或数字签名?

4)由于在B/S架构下程序一般放在服务器端,那么怎样来实现对客户端的硬件(读卡器)操作呢?

用一个实现实例来说明上述问题:

1)写一个java程序利用jni来调用用c产生的dll(动态连接库)如下HelloWorld.java

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassHelloWorld{

d18c02628675d0a2c816449d98bda930.pngpublicnativevoiddisplayHelloWorld();//注意关键字native,这就说明这个方法是用本地方法实现的。d18c02628675d0a2c816449d98bda930.pngpublicnativeString getUserName();//从(本地文件)c 程序中返回一个值97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifstatic{//静态代码段里面导入了hello.dll。d18c02628675d0a2c816449d98bda930.pngSystem.loadLibrary("hello");//加载一个动态连接(dll)文件,在调用时它用最早的调用到内存中

d18c02628675d0a2c816449d98bda930.png//System.load("D:\\Tomcat 5.0\\webapps\\test\\jar\\hello");//能过指定的绝对路径来加载ecedf933ec37d714bd4c2545da43add2.png}97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/**//*d18c02628675d0a2c816449d98bda930.png      *构造方法

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicHelloWorld(){

ecedf933ec37d714bd4c2545da43add2.png    }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicstaticvoidmain(String[] args){//调用本类的displayHelloWorld方法,(当然了方法实际上是用c语言实现的)

d18c02628675d0a2c816449d98bda930.png//new HelloWorld().displayHelloWorld();d18c02628675d0a2c816449d98bda930.pngString s=newHelloWorld().getUserName();

d18c02628675d0a2c816449d98bda930.png   System.out.println("successful"+s); 

d18c02628675d0a2c816449d98bda930.png//System.out.println(s.length());ecedf933ec37d714bd4c2545da43add2.png}8f1ba5b45633e9678d1db480c16cae3f.png }4f1150b881333f12a311ae9ef34da474.png

2)用javac编译HelloWorld

3)用javah产生HelloWorld.h文件。它好比java中的一个接口。

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/**//*DO NOT EDIT THIS FILE - it is machine generated*/4f1150b881333f12a311ae9ef34da474.png   #include1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/**//*Header for class HelloWorld*/4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png   #ifndef _Included_HelloWorld

4f1150b881333f12a311ae9ef34da474.png#define_Included_HelloWorld4f1150b881333f12a311ae9ef34da474.png   #ifdef __cplusplus

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifextern"C"{

d18c02628675d0a2c816449d98bda930.png#endif97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/**//*d18c02628675d0a2c816449d98bda930.png    * Class:     HelloWorld

d18c02628675d0a2c816449d98bda930.png    * Method:    displayHelloWorld

d18c02628675d0a2c816449d98bda930.png    * Signature: ()V

ecedf933ec37d714bd4c2545da43add2.png*/d18c02628675d0a2c816449d98bda930.png   JNIEXPORTvoidJNICALL Java_HelloWorld_displayHelloWorld

d18c02628675d0a2c816449d98bda930.png     (JNIEnv*, jobject);

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/**//*d18c02628675d0a2c816449d98bda930.png    * Class:     HelloWorld

d18c02628675d0a2c816449d98bda930.png    * Method:    getUserName

d18c02628675d0a2c816449d98bda930.png    * Signature: ()Ljava/lang/String;

ecedf933ec37d714bd4c2545da43add2.png*/d18c02628675d0a2c816449d98bda930.png   JNIEXPORT jstring JNICALL Java_HelloWorld_getUserName

d18c02628675d0a2c816449d98bda930.png     (JNIEnv*, jobject);

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png   #ifdef __cplusplus

8f1ba5b45633e9678d1db480c16cae3f.png   }4f1150b881333f12a311ae9ef34da474.png#endif4f1150b881333f12a311ae9ef34da474.png#endif4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

4)编写一个*.c(HelloWorldImp.c)的文件。它好比一个接口的实现。

4f1150b881333f12a311ae9ef34da474.png#include4f1150b881333f12a311ae9ef34da474.png  #include"HelloWorld.h"4f1150b881333f12a311ae9ef34da474.png  #include4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png  JNIEXPORTvoidJNICALL Java_HelloWorld_displayHelloWorld(JNIEnv*env, jobject obj) 

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif{

d18c02628675d0a2c816449d98bda930.png      printf("Hello world!\n");//这个例子中只输出一行Hello World!

d18c02628675d0a2c816449d98bda930.png//return;8f1ba5b45633e9678d1db480c16cae3f.png}4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif  JNIEXPORT jstring JNICALL Java_HelloWorld_getUserName  (JNIEnv*env, jobject obj){

d18c02628675d0a2c816449d98bda930.png    jstring jstr;

d18c02628675d0a2c816449d98bda930.pngcharstr[]="Rami very good! yes!\n";

d18c02628675d0a2c816449d98bda930.png      jstr=(*env)->NewStringUTF(env,str);

d18c02628675d0a2c816449d98bda930.png//printf(str);d18c02628675d0a2c816449d98bda930.pngreturnjstr;

d18c02628675d0a2c816449d98bda930.png

8f1ba5b45633e9678d1db480c16cae3f.png  }4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

5) 编写一个applet程序来调用HelloWord。Applet1.java

4f1150b881333f12a311ae9ef34da474.pngimportjava.applet.Applet;

4f1150b881333f12a311ae9ef34da474.pngimportjava.awt.*;

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassApplet1extendsApplet{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png    *@paramargs the command line arguments

ecedf933ec37d714bd4c2545da43add2.png*/d18c02628675d0a2c816449d98bda930.pngpublicString UserName="applet call jni";

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidinit(){

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giftry{   

d18c02628675d0a2c816449d98bda930.png     System.out.println("test");

d18c02628675d0a2c816449d98bda930.png//new HelloWorld().displayHelloWorld();d18c02628675d0a2c816449d98bda930.pngSystem.out.println(newHelloWorld().getUserName());

d18c02628675d0a2c816449d98bda930.png    System.out.println("test end");

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif    }catch(Exception e){

d18c02628675d0a2c816449d98bda930.png    e.printStackTrace();

d18c02628675d0a2c816449d98bda930.png    System.out.println(e);

ecedf933ec37d714bd4c2545da43add2.png    }ecedf933ec37d714bd4c2545da43add2.png   }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidpaint(Graphics g){

d18c02628675d0a2c816449d98bda930.png       g.drawString("Hello:"+UserName,20,20);

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetUserName(String UserName){

d18c02628675d0a2c816449d98bda930.pngthis.UserName=UserName;

ecedf933ec37d714bd4c2545da43add2.png    }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicString getUserName(){

d18c02628675d0a2c816449d98bda930.pngreturnUserName;

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidtest(){

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giftry{   

d18c02628675d0a2c816449d98bda930.png    System.out.println("test");

d18c02628675d0a2c816449d98bda930.png//new HelloWorld().displayHelloWorld();d18c02628675d0a2c816449d98bda930.pngUserName=newHelloWorld().getUserName();

d18c02628675d0a2c816449d98bda930.png    System.out.println();

d18c02628675d0a2c816449d98bda930.png//new Hello().test();d18c02628675d0a2c816449d98bda930.pngSystem.out.println("test end******");

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif    }catch(Exception e){

d18c02628675d0a2c816449d98bda930.png    e.printStackTrace();

d18c02628675d0a2c816449d98bda930.png    System.out.println(e);

ecedf933ec37d714bd4c2545da43add2.png    }ecedf933ec37d714bd4c2545da43add2.png    }8f1ba5b45633e9678d1db480c16cae3f.png  }4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

6)编写一个jsp文件调用applet。jniApplet.jsp

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif4f1150b881333f12a311ae9ef34da474.pngHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png 4f1150b881333f12a311ae9ef34da474.png无标题文档 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffunctionchangeUserName(){

d18c02628675d0a2c816449d98bda930.png     aaa=newString(document.form1.UserName.value);

d18c02628675d0a2c816449d98bda930.png     document.myApplet.setUserName(aaa);

d18c02628675d0a2c816449d98bda930.pngvars=document.myApplet.getUserName();

d18c02628675d0a2c816449d98bda930.png     document.myApplet.test();

d18c02628675d0a2c816449d98bda930.pngvarss=document.myApplet.getUserName();

d18c02628675d0a2c816449d98bda930.png     alert(ss);

d18c02628675d0a2c816449d98bda930.png     document.form1.UserName.value=ss;

d18c02628675d0a2c816449d98bda930.png     document.myApplet.repaint();

d18c02628675d0a2c816449d98bda930.pngreturnfalse;

ecedf933ec37d714bd4c2545da43add2.png  }d18c02628675d0a2c816449d98bda930.png

8f1ba5b45633e9678d1db480c16cae3f.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png 4f1150b881333f12a311ae9ef34da474.png 4f1150b881333f12a311ae9ef34da474.png 4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

7)对刚才编译出来的文件进行打包,这样有利于applet的下载速度。

jar cvf monitor *.*

8)部署web程序

9)对客户端修改安全权限文件。此文件在jdk的安装目录下。但测试发现在C:\Program Files\Java\j2re1.4.2_06\lib\security也有一个安全文件,也许是浏览调用的安全文件,就修改它。

4f1150b881333f12a311ae9ef34da474.png/* AUTOMATICALLY GENERATED ON Thu Feb2409:23:05CST2005*/

4f1150b881333f12a311ae9ef34da474.png /* DO NOT EDIT */

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png keystore"file:/C:/j2sdk1.4.2_06/jre/lib/security/cacerts","JKS";

4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png grant codeBase"file:${java.home}/lib/ext/*"{

4f1150b881333f12a311ae9ef34da474.png   permission java.security.AllPermission;

4f1150b881333f12a311ae9ef34da474.png};

4f1150b881333f12a311ae9ef34da474.pnggrant signedBy"monitor",codeBase"http://192.168.1.35:8080/"{

4f1150b881333f12a311ae9ef34da474.png   permission java.security.AllPermission,signedBy"monitor";

4f1150b881333f12a311ae9ef34da474.pngpermission java.lang.RuntimePermission"usePolicy";

4f1150b881333f12a311ae9ef34da474.pngpermission java.lang.RuntimePermission"createClassLoader",signedBy"monitor";

4f1150b881333f12a311ae9ef34da474.pngpermission java.lang.RuntimePermission"getClassLoader";

4f1150b881333f12a311ae9ef34da474.pngpermission java.lang.RuntimePermission"setContextClassLoader";

4f1150b881333f12a311ae9ef34da474.png};

4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png grant {

4f1150b881333f12a311ae9ef34da474.png   permission java.lang.RuntimePermission"stopThread";

4f1150b881333f12a311ae9ef34da474.pngpermission java.net.SocketPermission"localhost:1024-","listen";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.version","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.vendor","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.vendor.url","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.class.version","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"os.name","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"os.version","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"os.arch","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"file.separator","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"path.separator","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"line.separator","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.specification.version","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.specification.vendor","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.specification.name","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.vm.specification.version","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.vm.specification.vendor","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.vm.specification.name","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.vm.version","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.vm.vendor","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.util.PropertyPermission"java.vm.name","read";

4f1150b881333f12a311ae9ef34da474.pngpermission java.lang.RuntimePermission"createClassLoader";

4f1150b881333f12a311ae9ef34da474.pngpermission java.lang.RuntimePermission"getClassLoader";

4f1150b881333f12a311ae9ef34da474.pngpermission java.lang.RuntimePermission"setContextClassLoader";

4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png   permission java.security.AllPermission;

4f1150b881333f12a311ae9ef34da474.pngpermission java.lang.RuntimePermission"usePolicy";

4f1150b881333f12a311ae9ef34da474.pngpermission java.lang.RuntimePermission"createClassLoader";

4f1150b881333f12a311ae9ef34da474.pngpermission java.lang.RuntimePermission"getClassLoader";

4f1150b881333f12a311ae9ef34da474.pngpermission java.lang.RuntimePermission"setContextClassLoader";

4f1150b881333f12a311ae9ef34da474.png};

4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png grant { 

4f1150b881333f12a311ae9ef34da474.png  permission java.lang.RuntimePermission"loadLibrary.hello";4f1150b881333f12a311ae9ef34da474.png};4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png

10)在客户端配置dll。在环境变量path中设置dll所在的位置。

就这样应该大功告成了,

posted on 2005-09-21 15:13 Harryson 阅读(5928) 评论(13)  编辑  收藏 所属分类: Jni--Communication

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值