只是尝试从Java小程序向串行端口写入数据?

只是尝试从Java小程序向串行端口写入数据?,java,applet,serial-port,jnlp,next-generation-plugin,Java,Applet,Serial Port,Jnlp,Next Generation Plugin,几天来,我一直在绞尽脑汁,想弄明白为什么这似乎永远都不管用!首先,这是我的配置: Windows 7 x64 JDK 7 x86 JRE 7 x86 Firefox x86 轻轨服务的轨道3 Java设置使得“下一代插件”不处于活动状态(但它会以某种方式不断地重新激活自己!!!) 起初,我尝试了RXTX,但我不断地得到“找不到类”的错误。我现在转到winjcom。我现在遇到的错误是:java.security.AccessControlException:access denied(“java.

几天来,我一直在绞尽脑汁,想弄明白为什么这似乎永远都不管用!首先,这是我的配置:

Windows 7 x64
JDK 7 x86
JRE 7 x86
Firefox x86
轻轨服务的轨道3
Java设置使得“下一代插件”不处于活动状态(但它会以某种方式不断地重新激活自己!!!)

起初,我尝试了RXTX,但我不断地得到“找不到类”的错误。我现在转到winjcom。我现在遇到的错误是:
java.security.AccessControlException:access denied(“java.lang.RuntimePermission”“loadLibrary.winjcom”)

我还注意到,我的服务器日志因使用的浏览器而异。如果我使用Firefox,当浏览器尝试加载小程序时,不会显示GET日志(即,当小程序加载失败时,不会再下载任何内容)。如果我在IE9中尝试,除了“PortWriter.class”GET log之外,所有日志都在那里,这意味着出于某种原因无法检索它

当我避免使用JNLP时,我得到了安全警告弹出窗口,并且没有任何错误……当然除了运行“Sends”方法时的安全访问错误。但是,当我使用JNLP时,IE会很好地加载它,并且仍然会给出错误…但是当我关闭它时,它会崩溃(我必须结束iexplorer进程)。Firefox只是不加载页面…它会在进度条上暂停

更新-如果我通过java的安全策略文件绕过安全性,小程序就会工作。但是,JNLP不会工作——我认为这就是为什么在运行applet标记时通常会发生安全错误的原因。当我直接访问JNLP文件时,我得到一个错误,说明它找不到“PortWriter”类。我的罐子有问题吗?我注意到其他jar有它们的文件夹布局,因此目录结构与它们的包布局完全匹配(例如,“com\myname\serialport\PortWriter.jar”,如果包是com.myname.serialport.PortWriter)。但是,我的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>

RS232通信小程序
我的公司
用于与POS显示杆通信的RS232小程序
…和我的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新手,但我只想得到一个可行的解决方案。这是我公司的POS,我正在Rails中制作

最终文件包括:

在位于/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

为了使用Java的包(推荐使用),将PortWriter.Java放在Java/x/y/z中 还有一句话:

package x.y.z;
“无处不在”用作类名:

x.y.z.PortWriter
在服务器上,我希望只有一个带有PortWriter类的jar。
您可以在不使用DLL的情况下添加一些Test.java,以查看它是否正常工作。

好吧,这是废话。在最初决定关闭Java控制台中的“下一代插件”选项以使我的小程序在Firefox中工作时,我无意中禁用了JNLP。我只是在万不得已的努力下才发现这一点,“尝试一些……任何东西”。重新打开后,jnlp在IE中运行得非常好。Firefox当然是我的POS需要使用的浏览器(因为有一个jsprint插件)…但它当然不起作用。它不会下载JNLP文件,或者如果下载了,就会出现问题。它只是挂着。没有显示任何内容,但我的服务器日志显示所有图像和html都正在下载。但不是jnlp或任何jar文件。因此,要么关闭下一代插件,出现安全问题,要么打开它,无法使用Firefox。我能做些什么而不必更改策略文件吗

FWIW,我会将此标记为解决方案,并在其他地方开始一个关于我最新问题的新线程。以下是最新的内容,这些内容是让这个该死的东西正常工作所需的所有内容(Firefox除外):


首先,确保在Windows中设置了PATH和CLASSPATH环境变量。路径应该是
C:\ProgramFiles(x86)\Java\jdk1.7.0\u 01\bin
(如果您有不同的版本,请更改为您自己的jdk目录)。类路径应该位于创建java类的任何位置。我的是
D:\Files\Java\Classes
。如果不设置PATH变量,则无法从任何目录运行“java”、“javac”或“jarsigner”。您必须位于jdk的bin目录中。将这些变量用于您的用户帐户…而不是系统(因为可能已经有类似于这些名称的环境变量)


接下来,要对小程序进行签名,请创建密钥库:

keytool -genkey -dname "cn=My Company, ou=Whatever, o=My Company, c=CA" -alias mycompany -keystore "D:\Files\Java\Certificates\certfile" -storepass MY_PASSWORD -validity 180
查看在线教程,确保您知道这些参数的用途


.BAT文件,以便从.java文件轻松创建必要的.jar文件并对其签名。只需创建一个快捷方式或运行.bat文件,而不必在每次更改.java文件时手动执行此操作

@echo off

set certificate_password=MY_PASSWORD
set certificate_alias=myalias
set package=mycompany
set class_file=PortWriter
rem class_path is where my .java file resides (...\java\Classes\mycompany\PortWriter.java)
set class_path=D:\Files\Java\Classes
set certificate_loc=D:\Files\Java\Certificates\certfile
rem final_loc is the assets folder where the .jar file will reside
set final_loc=D:\Files\Websites\pos\app\assets\java

cd "%class_path%"
rem Change to "D:" otherwise Windows won't *actually* change directories from C: to D:
D:

javac -Xlint:unchecked "%package%\%class_file%.java"
pause
jar cfm "%final_loc%\%class_file%.jar" "%package%\Mainfest.txt" "%package%\*.class"
pause
del "%package%\*.class"
jarsigner -keystore "%certificate_loc%" -storepass %certificate_password% "%final_loc%\%class_file%.jar" %certificate_alias%
pause

Mainfest.txt(确保在“Main Class”行之后有回车符。如果要在JNLP中指定主类,则不需要此Manifest.txt文件): 主类:mycompany.PortWriter


Java文件:

package mycompany;

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 static void main(String[] args) {}
    public void init() {
    System.out.println("Booting RS232 Java Applet...");
    }

    public void Sends(String port, String message) {

    final String com_port = port;
    final String send_message = message;

    AccessController.doPrivileged(new PrivilegedAction<Object>() {
        public Object run() {

        try {
            portIdentifier = new WinjcomIdentifier(0);
            try {
            selectComport(com_port);
            new Thread(new PortReader()).start();
            try {
                System.out.println(com_port + ": " + send_message);
                typeSendBytes(send_message);
            } catch (Exception e) {
                System.out.println("Couldn't send data to " + com_port);
            }
            } catch (IOException e) {
            System.out.println("Couldn't connect to " + com_port);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return null;
        }
    });
    }

    private void typeSendBytes( String message ) {  
    try {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String aStr = "";
        if (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 ) throws IOException {
    try {
        CommPort aPort = portIdentifier.getCommPort(portName);
        aPort.open();
        return (SerialPort)aPort;
    }
    catch ( Exception exc ) {
        //System.out.println("exc="+exc);
        //exc.printStackTrace();
        throw exc;
    }
    }

    private void selectComport ( String portName ) throws IOException {

    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();
        throw exc;
    }

    }


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();
      }
    }
  }


}
package-mycompany;
导入com.engidea.comm.CommPort;
导入com.engidea.comm.CommPortIdentifier;
导入com
<?xml version="1.0" encoding="utf-8"?>
<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>
    <resources>
    <j2se version="1.7.0+" />
    <jar href="PortWriter.jar" part="com" main="true" />
    <jar href="jcomport.jar" part="com" />
    <nativelib href="winjcom.jar" part="com" />
    </resources>
    <applet-desc
         name="RS232 Communication Applet"
         main-class="mycompany.PortWriter"
         width="1" height="1" />
</jnlp>
<applet id="SerialPort" width="1" height="1" codebase="/assets/">
    <param name="jnlp_href" value="PortWriter.jnlp">
</applet>