几天来,我一直在扯头发,试图弄清楚为什么这似乎永远不起作用!首先,这是我的配置:
Windows 7 x64
JDK 7 x86
JRE 7 x86
Firefox x86
Rails 3 由 Thin
Java 设置提供,“下一代插件”不活动(但它会以某种方式不断重新激活!!!)
起初我尝试了 RXTX,但我不断收到“找不到类”错误。我现在转到winjcom。我现在得到的错误是:java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "loadLibrary.winjcom")
.
我还注意到我的服务器日志因我使用的浏览器而异。如果我使用 Firefox,当浏览器尝试加载小程序时,不会显示 GET 日志(即,当小程序加载失败时,不会再下载任何内容)。如果我在 IE9 中尝试,所有日志都在那里,除了“PortWriter.class”GET 日志......这意味着由于某种原因它没有被检索。
当我避免使用 JNLP 时,我会弹出安全警告并且没有任何错误……当然,运行“发送”方法时出现安全访问错误除外。但是,当我使用 JNLP 时,IE 加载它很好并且仍然给出错误......但是当我关闭它时崩溃(我必须结束 iexplorer 进程)。Firefox 只是不加载页面......它停在进度条上。
更新- 我有一些事情,如果我通过java的安全策略文件绕过安全性,applet就会工作。但是,JNLP 不起作用——我认为这就是为什么在通过小程序标签运行时通常会发生安全错误的原因。当我直接访问 JNLP 文件时,我收到一条错误消息,指出它找不到“PortWriter”类。我的罐子有问题吗?我注意到其他 jar 具有它们的文件夹布局,因此目录结构与它们的包布局完全匹配(例如,如果包是 com.myname.serialport.PortWriter,则为“com\myname\serialport\PortWriter.jar”) . 但是,我的 jar 布局复制了我的物理文件夹布局(例如,“D:\Files\Websites\pos\assets\java\PortWriter.jar”)。这是导致错误的原因吗?一世' 已经手动更改了 jar 内容(包括清单文件)以匹配根,但也许我做错了什么。我还在这个问题中更新了我的 JNLP 布局,以说明 JaNeLa 验证的我的最新更改。
这是我的 .java 文件:
import com.engidea.comm.CommPort;
import com.engidea.comm.CommPortIdentifier;
import com.engidea.comm.SerialPort;
import com.engidea.comm.SerialPortEvent;
import com.engidea.comm.SerialPortEventListener;
import com.engidea.win32jcom.WinjcomIdentifier;
import java.io.*;
import java.util.Iterator;
import java.util.List;
import java.applet.*;
import java.security.*;
/*
WinJcom is a native interface to serial ports in java.
Copyright 2007 by Damiano Bolla, Jcomm@engidea.com
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This can be used with commercial products and you are not obliged
to share your work with anybody.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/**
* Simple class that can list system ports and allow IO
*/
public class PortWriter extends Applet
{
private CommPortIdentifier portIdentifier;
private SerialPort serport;
public void init () {System.out.println("Booting...");}
@SuppressWarnings("unchecked")
public void Sends(String port, String message) throws Exception
{
final String com_port = port;
final String send_message = message;
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
System.out.println("Begin...");
portIdentifier = new WinjcomIdentifier(0);
System.out.println("Selecting Port...");
selectComport(com_port);
new Thread(new PortReader()).start();
System.out.println("Sending...");
typeSendBytes(send_message);
return true;}
});
}
private void typeSendBytes( String message )
{
try
{
System.out.println("Trying To Send...");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String aStr = "";
while (aStr != null)
{
aStr = message + "\r\n";
// WARNING: be careful, you shoulod select the encoding !
// This will timeout if you have FLOW CONTROL and theline is stuck !
byte []buf = aStr.getBytes();
serport.write(buf,0,buf.length );
}
}
catch ( Exception exc )
{
exc.printStackTrace();
}
}
private SerialPort openPort ( String portName )
{
try
{
CommPort aPort = portIdentifier.getCommPort(portName);
aPort.open();
return (SerialPort)aPort;
}
catch ( Exception exc )
{
System.out.println("exc="+exc);
exc.printStackTrace();
}
return null;
}
private void selectComport ( String portName )
{
try
{
serport = openPort(portName);
serport.setSerialPortParams(9600,8, SerialPort.STOPBITS_2, SerialPort.PARITY_NONE);
serport.enableReceiveTimeout(20000);
serport.setEventListener(new EventListener());
serport.notifyOnDSR(true);
serport.notifyOnCarrierDetect(true);
serport.notifyOnCTS(true);
}
catch (IOException exc)
{
System.out.println("Exc="+exc);
exc.printStackTrace();
}
}
private final class EventListener implements SerialPortEventListener
{
public void serialEvent(SerialPortEvent ev)
{
System.out.println("Got event="+ev);
}
}
private final class PortReader implements Runnable
{
public void run()
{
try
{
// This will timeout if nothing is received in the specified time.
byte []buff = new byte[1];
while ( serport.read(buff,0,buff.length) > 0 )
{
// NOTE: you should be checking the encoding !
System.out.print(new String(buff));
}
}
catch ( Exception exc )
{
exc.printStackTrace();
}
}
}
}
...和我的 JNLP 文件:
<?xml version="1.0" encoding="utf-8"?>
<jnlp codebase="http://localhost/assets/" href="PortWriter.jnlp">
<information>
<title>RS232 Communication Applet</title>
<vendor>My Company</vendor>
<description>RS232 Applet for communicating with POS Display Pole</description>
<offline-allowed />
</information>
<security>
<all-permissions/>
</security>
<update check="background" />
<resources>
<jar href="PortWriter.jar" part="com" main="true" />
<jar href="winjcom.jar" part="com" />
<nativelib href="jcomport.jar" part="com" />
</resources>
<applet-desc
name="RS232 Communication Applet"
main-class="PortWriter"
width="1" height="1" />
</jnlp>
...和我的 HTML:
<applet id="SerialPort" width="1" height="1" codebase="/assets/" code="PortWriter.class" archive="PortWriter.jar">
<param name="jnlp_href" value="PortWriter.jnlp" />
</applet>
我如何让这些东西发挥作用?我是 Java 新手,但我只想获得一个可行的解决方案。这是我在 Rails 中制作的公司的 POS。
最终文件是:
在 /assets/java/ 的服务器上:
1) jcomport.jar (未签名...)
2) PortWriter.class (和所有相关的类文件)
3) PortWriter.jar
4) PortWriter.jnlp
在 %java home%/ 的本地高清上
1) /lib/ext/jcomport.jar (未签名)
2) /bin/winjcom.dll