[Resolvido] RxTx + Applet

6 respostas
P

Tenho um sistema web que nele quero chamar um applet para imprimir via COM1,

os métodos de comunicação com a COM1 funcionam perfeitamente (testado separado), agora estou tentando implementar em um applet mas não estou obtendo sucesso,

não me da nenhum erro mas também não tenho sucesso, na página que chama o applet.jar me pede a permissão, dou sim, aparece uma caixa cor de areia mas não acontece mais nada, até tentei colocar alguns System.out.println mas não aparece nada em nenhum lugar (logs).
O applet está assinado, os métodos de conexão com a porta e para imprimir estão corretos também,

deve estar faltando algo para não funcionar no applet, se alguém souber, me dar alguma dica, agradeço desde já.
Obrigado.

public class applet extends JApplet {

    private OutputStream out;
    private SerialPort porta;
    private CommPortIdentifier portIdentifier;

    public void init() {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {

                public void run() {
                    try {
                        System.setSecurityManager(null);

                        System.out.println("COMECEI");

                        connect("COM6");

                        System.out.println("ABRIU");

                        imprime();

                        System.out.println("IMPRIMIU");
                    } catch (Exception ex) {
                        System.err.println("ERRO 1 DE IMPRESSÃO " + ex.getMessage());

                    }
                }
            });

        } catch (Exception e) {
            System.err.println("ERRO 2 GERAL " + e.getMessage());
        }
    }

public void connect(String portName) throws Exception {

        this.portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

        this.porta = (SerialPort) portIdentifier.open(this.getClass().getName(), 0);

        this.porta.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        this.porta.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

        this.out = porta.getOutputStream();
    }

    public void imprime() throws IOException {

        PrintWriter outW = new PrintWriter(this.out);

       
        outW.println("AQUI IMPRIME");
       
        outW.println("--------------------------------------------------");
       

        outW.flush();

        //outputFile.close();
        outW.close();
        this.out.close();
        this.porta.close();
    }
}

6 Respostas

T

Cara a pouco tempo mexi com applets. É necessário criar uma assinatura digital pra ele… Pesquise sobre assinatura digital de applets…

P

obrigado pela atenção,
ja está assinado digitalmente como mencionei!

P

pesquisando na net, disseram para eu usar o doPrivileged, com isso o método de acesso a porta ter privilégios para acessar a maquina cliente, algo assim

ficando assim:

public SerialPort connect(final String portName) throws Exception {
        return (SerialPort) AccessController.doPrivileged(new PrivilegedAction() {

            private CommPortIdentifier portIdentifier;
            private SerialPort porta;

            public Object run() {
                try {
                    portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

                    porta = (SerialPort) portIdentifier.open(this.getClass().getName(), 0);

                    porta.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                    porta.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

                } catch (Exception e) {
                    System.err.println("ERRO: " + e);
                }
                return porta;
            }
        });
    }

mas ae me da este erro

java.lang.reflect.InvocationTargetException
	at com.sun.deploy.util.DeployAWTUtil.invokeAndWait(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.runOnEDT(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.SecurityException: trusted loader attempted to load sandboxed resource from http://localhost:8080/webSAI/RXTXcomm.jar
	at com.sun.deploy.security.CPCallbackHandler$ParentCallback.check(Unknown Source)
	at com.sun.deploy.security.CPCallbackHandler$ParentCallback.access$1500(Unknown Source)
	at com.sun.deploy.security.CPCallbackHandler$ChildElement.checkResource(Unknown Source)
	at com.sun.deploy.security.DeployURLClassPath$JarLoader.checkResource(Unknown Source)
	at com.sun.deploy.security.DeployURLClassPath$JarLoader.getResource(Unknown Source)
	at com.sun.deploy.security.DeployURLClassPath.getResource(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
	at java.lang.Class.getDeclaredMethod(Unknown Source)
	at java.awt.Component.isCoalesceEventsOverriden(Unknown Source)
	at java.awt.Component.access$500(Unknown Source)
	at java.awt.Component$3.run(Unknown Source)
	at java.awt.Component$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.awt.Component.checkCoalescing(Unknown Source)
	at java.awt.Component.<init>(Unknown Source)
	at java.awt.Container.<init>(Unknown Source)
	at java.awt.Panel.<init>(Unknown Source)
	at java.awt.Panel.<init>(Unknown Source)
	at java.applet.Applet.<init>(Unknown Source)
	at javax.swing.JApplet.<init>(Unknown Source)
	at applet.<init>(applet.java:17)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at java.lang.Class.newInstance0(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Exceção: java.lang.reflect.InvocationTargetException
Rodrigo_Vieira_Pinto

hmm…não sei não, mas a última vez que tive que trabalhar com aplicações assinadas, era em Swing e usando java web start. Na época eu assinava não somente o jar da aplicação em si, mas os jars de todas as bibliotecas. E com a mesma assinatura.

Você já fez isso?

P

Fiz o que disse mas sem sucesso, continua a sandbox mas nada acontece, não imprime, queria saber se ao menos está fazendo comunicação com a porta serial…

public void init() {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {

                public void run() {
                    try {

                        System.setSecurityManager(null);
                  
                        portIdentifier = CommPortIdentifier.getPortIdentifier("COM6");

                        porta = (SerialPort) portIdentifier.open(this.getClass().getName(), 0);

                        porta.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                        porta.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

                        out = porta.getOutputStream();

                        PrintWriter outW = new PrintWriter(out);


                        outW.println("AQUI IMPRIME");
                        outW.println("--------------------------------------------------");

                        outW.flush();

                        outW.close();
                        out.close();
                        porta.close();

                    } catch (Exception ex) {
                        System.err.println("ERRO 1 DE IMPRESSÃO " + ex.getMessage());

                    }
                }
            });

        } catch (Exception e) {
            System.err.println("ERRO 2 GERAL " + e.getMessage());
        }
    }
P

.dll no system32 e assinei o .jar como o colega ae em cima falou, atualizei para o ultimo jdk, funcionou beleza.

Criado 8 de setembro de 2011
Ultima resposta 9 de set. de 2011
Respostas 6
Participantes 3