- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这几天我一直在绞尽脑汁想弄清楚为什么这似乎从来都行不通!首先,这是我的配置:
Windows 7 x64
JDK 7 x86
JRE 7 x86
火狐 x86
由 Thin 提供的 Rails 3
Java 设置使得“下一代插件”未处于 Activity 状态(但它会以某种方式不断重新激活!!!)
起初我尝试了 RXTX,但我一直收到“找不到类”错误。我现在转到了 winjcom。我现在得到的错误是这样的:java.security.AccessControlException: access denied ("java.lang.RuntimePermission""loadLibrary.winjcom")
。
我还注意到我的服务器日志因我使用的浏览器而异。如果我使用 Firefox,当浏览器尝试加载小程序时,不会显示任何 GET 日志(即,当小程序加载失败时,不会再下载任何内容)。如果我在 IE9 中尝试,所有日志都在那里,除了“PortWriter.class”GET 日志...这意味着由于某种原因它没有被检索。
当我避免使用 JNLP 时,我会收到安全警告弹出窗口,并且没有任何错误……当然,当我运行“发送”方法时出现安全访问错误除外。但是,当我确实使用 JNLP 时,IE 可以很好地加载它并仍然给出错误...但是当我关闭它时崩溃(我必须结束 iexplorer 进程)。 Firefox 只是不加载页面...它停在进度条上。
更新 - 如果我通过 java 的安全策略文件绕过安全性,小程序就会工作。但是,JNLP 不会工作——我认为这就是为什么通常在运行小程序标记时会发生安全错误。当我直接访问 JNLP 文件时,我收到一条错误消息,指出找不到“PortWriter”类。我的 jar 有问题吗?我注意到其他 jar 有它们的文件夹布局,这样目录结构与它们的包布局完全匹配(例如,如果包是 com.myname.serialport.PortWriter,则为“com\myname\serialport\PortWriter.jar”) .但是,我的 jar 布局复制了我的物理文件夹布局(例如,“D:\Files\Websites\pos\assets\java\PortWriter.jar”)。这是导致错误的原因吗?我已经手动更改了 jar 内容(包括 list 文件)以匹配根目录,但也许我做错了什么。我还在这个问题中更新了我的 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) 端口写入器.jar
4) 端口写入器.jnlp
在本地高清 %java home%/
1)/lib/ext/jcomport.jar (未签名)
2)/bin/winjcom.dll
最佳答案
好吧,神圣永恒的废话。在最初决定关闭 Java 控制台中的“下一代插件”选项以使我的小程序在 Firefox 中工作时,我无意中禁用了 JNLP。我只是通过最后的努力“尝试一些......任何事情”才发现这一点。重新打开后,jnlp 在 IE 中运行完美。 Firefox 当然是我需要用于我的 POS 的浏览器(因为有一个 jsprint 插件)......但是它当然不能工作。它不会下载 JNLP 文件,或者如果是,则出现问题。它只是挂起。没有任何显示,但我的服务器日志显示正在下载所有图像和 html。但不是 jnlp 或任何 jar 文件。所以它要么关闭下一代插件并出现安全问题,要么打开它而无法使用 Firefox。有什么我可以做的而不必诉诸于更改策略文件吗?
FWIW,我会将其标记为解决方案,并在其他地方开始一个关于我最新问题的新线程。这是让这该死的东西正常工作所需的一切的最新内容(Firefox 除外):
首先,确保在 Windows 中设置了 PATH 和 CLASSPATH 环境变量。 PATH 应为 C:\Program Files (x86)\Java\jdk1.7.0_01\bin
(如果您有不同的版本,请更改为您自己的 jdk 目录)。 CLASSPATH 应该在您创建 Java 类的任何地方。我的是 D:\Files\Java\Classes
。如果不设置 PATH 变量,则无法从任何目录运行“java”、“javac”或“jarsigner”。你必须在 jdk 的 bin 目录中。为您的用户帐户创建这些变量...而不是系统(因为可能已经有这样命名的环境变量)。
接下来,为您的小程序签名,创建您的 keystore :
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();
}
}
}
}
JNLP 文件:
<?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>
HTML:
<applet id="SerialPort" width="1" height="1" codebase="/assets/">
<param name="jnlp_href" value="PortWriter.jnlp">
</applet>
我获取了 winjcom.dll 文件并将其“压缩”并使用相同的证书文件对其进行签名。我确保 cd 到 winjcom 所在的同一目录,以便它位于 .jar 文件的根目录中。我也拿了winjcom作者提供的jcomport.jar文件,用同样的certfile重新签名。也就是说,所有 .jar 文件都由同一个证书文件签名。
我希望这能帮助那些和我一样遇到麻烦的人。
关于java - 只是试图将数据从 Java Applet 写入串行端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7998523/
我有这个代码 var myChart = new FusionCharts("../themes/clean/charts/hbullet.swf", "myChartId", "400", "75
既然写入是立即进行的(复制到内核缓冲区并返回),那么使用 io_submit 进行写入有什么好处? 事实上,它 (aio/io_submit) 看起来更糟,因为您必须在堆上分配写入缓冲区并且不能使用基
我正在使用 mootool 的 Request.JSON 从 Twitter 检索推文。收到它后,我将写入目标 div 的 .innerHTML 属性。当我在本地将其作为文件进行测试时,即 file:
最终,我想将 Vertica DB 中的数据抓取到 Spark 中,训练机器学习模型,进行预测,并将这些预测存储到另一个 Vertica DB 中。 当前的问题是确定流程最后部分的瓶颈:将 Spark
我使用 WEKA 库编写了一个 Java 程序, 训练分类算法 使用经过训练的算法对未标记的数据集运行预测 将结果写入 .csv 文件 问题在于它当前写出离散分类结果(即算法猜测一行属于哪个类别)。我
背景 - 我正在考虑使用 clickonce 通过 clickonce(通过网站)部署 WinForms 应用程序。相对简单的应用程序的要素是: - 它是一个可执行文件和一个数据库文件(sqlite)
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
我正在读取 JSON 文件,取出值并进行一些更改。 基本上我向数组添加了一些值。之后我想将其写回到文件中。当我将 JSONArray 写回文件时,会被写入字符串而不是 JSONArray 对象。怎样才
我为两个应用程序使用嵌入式数据库,其中一个是服务器,另一个是客户端。客户端应用程序。可以向服务器端发送获取数据请求以检索数据并显示在表格(或其他)中。问题是这样的:如何将获取的数据保存(写入)到页面文
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
从问题得出问题:找到所有 result = new ArrayList(); for (int i = 2; i >(i%8) & 0x1) == 0) { result.add(i
由于某种原因,它没有写入 CSV。谁能明白为什么它不写吗? def main(): list_of_emails = read_email_csv() #read input file, cr
关闭。 这个问题是 not reproducible or was caused by typos 。它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能在这里出现,
我目前正在开发一个保存和加载程序,但我无法获得正确的结果。 编写程序: #include #include #define FILENAME "Save" #define COUNT 6 type
import java.io.*; public class Main2 { public static void main(String[] args) throws Exception {
我需要使用预定义位置字符串“Office”从所有日历中检索所有 iOS 事件,然后将结果写入 NSLog 和 UITextView。 到目前为止,这是我的代码: #import "ViewCo
我正在尝试将 BOOL 值写入 PFInstallation 中的列,但会不停地崩溃: - (IBAction)pushSwitch:(id)sender { NSUserDefaults *push
我以前在学校学过一些简单的数据库编程,但现在我正在尝试学习最佳实践,因为我正在编写更复杂的应用程序。写入 MySQL 数据库并不难,但我想知道让分布式应用程序写入 Amazon EC2 上的远程数据库
是否可以写回到ResourceBundle?目前我正在使用 ResourceBundle 来存储信息,在运行时使用以下内容读取信息 while(ResourceBundle.getBundle("bu
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!