当前位置: 代码迷 >> JavaScript >> javascript 与applet的通讯 和java与c(dll文件)通讯,最终在b/s架构上实现与硬件(读卡器)通讯
  详细解决方案

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

热度:438   发布时间:2012-10-28 09:54:44.0
javascript 与applet的通讯 和java与c(dll文件)通讯,最终在b/s架构下实现与硬件(读卡器)通讯

??? ?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

java 代码
  1. public?class?HelloWorld?{ ??
  2. ?????public?native?void?displayHelloWorld();//注意关键字native,这就说明这个方法是用本地方法实现的。 ??
  3. ? public?native?String?getUserName();//从(本地文件)c?程序中返回一个值 ??
  4. ?????static?{//静态代码段里面导入了hello.dll。 ??
  5. ??????System.loadLibrary("hello");//加载一个动态连接(dll)文件,在调用时它用最早的调用到内存中 ??
  6. ??//System.load("D:\\Tomcat?5.0\\webapps\\test\\jar\\hello");//能过指定的绝对路径来加载 ??
  7. ?????} ??
  8. ????/**//* ?
  9. ??????*构造方法 ?
  10. ??????*/??
  11. ????public?HelloWorld(){ ??
  12. ????} ??
  13. ?????public?static?void?main(String[]?args)?{//调用本类的displayHelloWorld方法,(当然了方法实际上是用c语言实现的) ??
  14. ??//new?HelloWorld().displayHelloWorld(); ??
  15. ???String?s?=?new?HelloWorld().getUserName(); ??
  16. ???System.out.println("successful?"+s);? ??
  17. ???//System.out.println(s.length()); ??
  18. ?????} ??
  19. ?}???

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

c 代码
  1. /**//*?DO?NOT?EDIT?THIS?FILE?-?it?is?machine?generated?*/?
  2. ???#include?<jni.h></jni.h> ??
  3. ???/**//*?Header?for?class?HelloWorld?*/?
  4. ?
  5. ???#ifndef?_Included_HelloWorld ?
  6. ???#define?_Included_HelloWorld ?
  7. ???#ifdef?__cplusplus ??
  8. ???extern?"C"?{ ?
  9. ???#endif ??
  10. ???/**//* ?
  11. ????*?Class:?????HelloWorld ?
  12. ????*?Method:????displayHelloWorld ?
  13. ????*?Signature:?()V ?
  14. ????*/??
  15. ???JNIEXPORT?void?JNICALL?Java_HelloWorld_displayHelloWorld ??
  16. ?????(JNIEnv?*,?jobject); ??
  17. ??
  18. ???/**//* ?
  19. ????*?Class:?????HelloWorld ?
  20. ????*?Method:????getUserName ?
  21. ????*?Signature:?()Ljava/lang/String; ?
  22. ????*/??
  23. ???JNIEXPORT?jstring?JNICALL?Java_HelloWorld_getUserName ??
  24. ?????(JNIEnv?*,?jobject); ?
  25. ?
  26. ???#ifdef?__cplusplus ??
  27. ???} ?
  28. ???#endif ?
  29. ???#endif??

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

c代码
  1. #include?<jni.h></jni.h> ?
  2. ?#include?"HelloWorld.h" ?
  3. ?#include?<stdio.h></stdio.h> ??
  4. ??
  5. ?JNIEXPORT?void?JNICALL?Java_HelloWorld_displayHelloWorld(JNIEnv?*env,?jobject?obj)? ??
  6. ?{ ??
  7. ?????printf("Hello?world!\n");//这个例子中只输出一行Hello?World! ??
  8. ????//?return; ??
  9. ?} ??
  10. ??
  11. ?JNIEXPORT?jstring?JNICALL?Java_HelloWorld_getUserName??(JNIEnv?*env,?jobject?obj){ ??
  12. ???jstring?jstr; ??
  13. ????????char?str[]="?Rami?very?good!?yes!\n"; ??
  14. ?????jstr?=?(*env)->NewStringUTF(env,str); ??
  15. ?????//printf(str); ??
  16. ????????return?jstr; ??
  17. ??
  18. ?} ??

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

java 代码
  1. import?java.applet.Applet; ??
  2. ??import?java.awt.*; ??
  3. ??
  4. ??
  5. ??
  6. ??public?class?Applet1?extends?Applet?{ ??
  7. ????/**?*//** ?
  8. ????*?@param?args?the?command?line?arguments ?
  9. ????*/??
  10. ????public?String?UserName="applet?call?jni"; ??
  11. ??
  12. ??public?void?init(){ ??
  13. ????try{??? ??
  14. ?????System.out.println("test"); ??
  15. ????//new?HelloWorld().displayHelloWorld(); ??
  16. ????System.out.println(new?HelloWorld().getUserName()); ??
  17. ????System.out.println("test?end"); ??
  18. ????}catch(Exception?e){ ??
  19. ????e.printStackTrace(); ??
  20. ????System.out.println(e); ??
  21. ????} ??
  22. ???} ??
  23. ??
  24. ????public?void?paint(Graphics?g)?{ ??
  25. ???????g.drawString("Hello:"+UserName,20,20); ??
  26. ????} ??
  27. ??
  28. ??
  29. ??
  30. ????public?void?setUserName(String?UserName){ ??
  31. ?????????this.UserName?=?UserName; ??
  32. ????} ??
  33. ?????public?String?getUserName(){ ??
  34. ?????????return?UserName; ??
  35. ????} ??
  36. ??
  37. ????public?void?test(){ ??
  38. ???try{??? ??
  39. ????System.out.println("test"); ??
  40. ????//new?HelloWorld().displayHelloWorld(); ??
  41. ????UserName?=?new?HelloWorld().getUserName(); ??
  42. ????System.out.println(); ??
  43. ????//new?Hello().test(); ??
  44. ????System.out.println("test?end******"); ??
  45. ????}catch(Exception?e){ ??
  46. ????e.printStackTrace(); ??
  47. ????System.out.println(e); ??
  48. ????}? ??
  49. ????} ??
  50. ??}??

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

&lt;%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
? &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
? &lt;html>
? &lt;head>
? &lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312">
? &lt;title>无标题文档&lt;/title>
? &lt;script language="JavaScript">
? function changeUserName(){
???? aaa = new String(document.form1.UserName.value);
???? document.myApplet.setUserName(aaa);
???? var s = document.myApplet.getUserName();
???? document.myApplet.test();
???? var ss = document.myApplet.getUserName();
???? alert(ss);
???? document.form1.UserName.value = ss;
???? document.myApplet.repaint();
???? return false;
? }

? &lt;/script>
? &lt;/head>

? &lt;body>
? &lt;table>
? &lt;tr>
??? &lt;td align="center" >
??????? &lt;applet ID='myApplet' Name='myApplet' code='Applet1.class'? width='120' height='30' codebase=".\jar" archive="monitor.jar">
??????? &lt;/applet>
??? &lt;/td>
??? &lt;td align="center" valign="bottom" nowrap>
??????? &lt;form name=form1 >
????? Your Name:&lt;input name=UserName size=10>
??????? &lt;input type=Button name=Btn value="Change Name" language="JavaScript" onclick="return changeUserName();">
??????? &lt;/form>
??? &lt;/td>
? &lt;/tr>
? &lt;/table>
? &lt;/body>
? &lt;/html>

7)对刚才编译出来的文件进行打包,这样有利于applet的下载速度。
???   jar cvf monitor *.*
??? 8)部署web程序
??? 9)对客户端修改安全权限文件。此文件在jdk的安装目录下。但测试发现在C:\Program Files\Java\j2re1.4.2_06\lib\security也有一个安全文件,也许是浏览调用的安全文件,就修改它。
java 代码

?

  1. /*?AUTOMATICALLY?GENERATED?ON?Thu?Feb?24?09:23:05?CST?2005*/??
  2. /*?DO?NOT?EDIT?*/??
  3. ??
  4. keystore?"file:/C:/j2sdk1.4.2_06/jre/lib/security/cacerts",?"JKS"; ??
  5. ??
  6. grant?codeBase?"file:${java.home}/lib/ext/*"?{ ??
  7. ??permission?java.security.AllPermission; ??
  8. }; ??
  9. grant?signedBy?"monitor",??codeBase?"http://192.168.1.35:8080/"?{ ??
  10. ??permission?java.security.AllPermission,?signedBy?"monitor"; ??
  11. ??permission?java.lang.RuntimePermission?"usePolicy"; ??
  12. ??permission?java.lang.RuntimePermission?"createClassLoader",?signedBy?"monitor"; ??
  13. ??permission?java.lang.RuntimePermission?"getClassLoader"; ??
  14. ??permission?java.lang.RuntimePermission?"setContextClassLoader"; ??
  15. }; ??
  16. ??
  17. grant?{ ??
  18. ??permission?java.lang.RuntimePermission?"stopThread"; ??
  19. ??permission?java.net.SocketPermission?"localhost:1024-",?"listen"; ??
  20. ??permission?java.util.PropertyPermission?"java.version",?"read"; ??
  21. ??permission?java.util.PropertyPermission?"java.vendor",?"read"; ??
  22. ??permission?java.util.PropertyPermission?"java.vendor.url",?"read"; ??
  23. ??permission?java.util.PropertyPermission?"java.class.version",?"read"; ??
  24. ??permission?java.util.PropertyPermission?"os.name",?"read"; ??
  25. ??permission?java.util.PropertyPermission?"os.version",?"read"; ??
  26. ??permission?java.util.PropertyPermission?"os.arch",?"read"; ??
  27. ??permission?java.util.PropertyPermission?"file.separator",?"read"; ??
  28. ??permission?java.util.PropertyPermission?"path.separator",?"read"; ??
  29. ??permission?java.util.PropertyPermission?"line.separator",?"read"; ??
  30. ??permission?java.util.PropertyPermission?"java.specification.version",?"read"; ??
  31. ??permission?java.util.PropertyPermission?"java.specification.vendor",?"read"; ??
  32. ??permission?java.util.PropertyPermission?"java.specification.name",?"read"; ??
  33. ??permission?java.util.PropertyPermission?"java.vm.specification.version",?"read"; ??
  34. ??permission?java.util.PropertyPermission?"java.vm.specification.vendor",?"read"; ??
  35. ??permission?java.util.PropertyPermission?"java.vm.specification.name",?"read"; ??
  36. ??permission?java.util.PropertyPermission?"java.vm.version",?"read"; ??
  37. ??permission?java.util.PropertyPermission?"java.vm.vendor",?"read"; ??
  38. ??permission?java.util.PropertyPermission?"java.vm.name",?"read"; ??
  39. ??permission?java.lang.RuntimePermission?"createClassLoader"; ??
  40. ??permission?java.lang.RuntimePermission?"getClassLoader"; ??
  41. ??permission?java.lang.RuntimePermission?"setContextClassLoader"; ??
  42. ??
  43. ??permission?java.security.AllPermission; ??
  44. ??permission?java.lang.RuntimePermission?"usePolicy"; ??
  45. ??permission?java.lang.RuntimePermission?"createClassLoader"; ??
  46. ??permission?java.lang.RuntimePermission?"getClassLoader"; ??
  47. ??permission?java.lang.RuntimePermission?"setContextClassLoader"; ??
  48. }; ??
  49. ??
  50. grant?{? ??
  51. ?permission?java.lang.RuntimePermission?"loadLibrary.hello";? ??
  52. };???

?

10)在客户端配置dll。在环境变量path中设置dll所在的位置。
?就这样应该大功告成了,

不知道各位有没有这样的需求,有没有更好的方法呢? 能给出意见和建议吗?谢谢

?

1 楼 爱我靠边站 2007-04-24  
觉得有用。支持你继续发表
2 楼 soleegn 2007-05-04  
对JAR包进行签名就不用改客户端配置了
3 楼 fellow99 2007-05-05  
这么累人,为啥没有COM,要用applet呢
4 楼 hgq0011 2007-05-07  
<p>
fellow99 写道
这么累人,为啥没有COM,要用applet呢
</p>
<p>用Applet确实有些麻烦。</p>
<p>能告诉我怎样使用COM实现这样的功能吗?谢谢!</p>
<p>?</p>
  相关解决方案