Aplicacion java como servicio en windows con apache commons daemon

Hola como estan amigos, quisiera vuestra ayuda si alguien a echo lo siguiente:

La cuestion es que al convertir mi aplicacion java en un servicio de windows con Apache Commons Daemon no me funciona algunas tareas o rutinas en el lado del servidor, por ejemplo en el lado del servidor he programado para que lea el texto que envia el cliente y lo imprimia y al mismo tiempo se muestre en un Mensaje con la Clase JoptionPane.ShowmessageDialog..., solo imprime el texto por consola pero no muestra los mensajes en la ventana de dialogo, del mismo modo tambien intento ejecutar comandos de Sistema del lado del servidor, y no se ejecutan.

Pero cuando ejecuto mis archivos jar de manera independiente tanto servidor como cliente funcionan con normalidad.

Este es mi Servidor que recibe un parametro para ejecutarse

package emf;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Servidor {

    ServerSocket serverSocket = null;
    Socket socket = null;

    public Servidor() {
        try {
            serverSocket = new ServerSocket(6002);
            System.out.println("Servidor iniciado, esperando conexiones");
            while (true) {
                socket = serverSocket.accept();
                ThreadServidor cliente = new ThreadServidor(socket);
                cliente.start();
            }
        } catch (IOException ex) {
            Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);

        }
    }

    public static void main(String[] args) {
        if (args.length > 0) {
            if ("start".equals(args[0])) {
                // Servidor.main(args);
                new Servidor();
            } else if ("stop".equals(args[0])) {
                System.exit(0);
            } else {
                System.exit(0);
            }
        }

    }
}

El hilo del servidor

package emf;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

public class ThreadServidor extends Thread {

    private Boolean estado = false;
    private ObjectOutputStream salida;
    private ObjectInputStream entrada;
    private Socket socketCliente;

    public ThreadServidor(Socket socket) {
        this.socketCliente = socket;
        this.estado = socketCliente.isConnected();
        System.out.println("Cliente " + this.socketCliente.getRemoteSocketAddress() + " en linea");
    }

    private void ejecutarComando(String comando) {
        try {
            Runtime p = Runtime.getRuntime();
            p.exec(comando);
            //p.runFinalization();
        } catch (IOException ex) {
            Logger.getLogger(ThreadServidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void run() {
        while (estado) {
            try {
                try {
                    this.entrada = new ObjectInputStream(this.socketCliente.getInputStream());
                    String cadena = (String) this.entrada.readObject();
                    //  int n2 = Integer.parseInt(this.entrada.readObject().toString());
                    System.out.println("El valor de la cadena recibida es: " + cadena);
                    JOptionPane.showMessageDialog(null, "Hola ");
                    JOptionPane.showMessageDialog(null, "Valor de cadena: " + cadena);
                    //  this.ejecutarComando(comando);
                } catch (ClassNotFoundException ex) {
                    this.estado = false;
                    //   Logger.getLogger(ThreadServidor.class.getName()).log(Level.SEVERE, null, ex);
                }
            } catch (IOException ex) {
                this.estado = false;
                //Logger.getLogger(ThreadServidor.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        System.out.println("Cliente " + this.socketCliente.getRemoteSocketAddress() + " esta desconectado");

    }

}

y Este el Script para levantar el servicio en windows

@echo off
set SERVICE_NAME=ssocket
set PR_INSTALL=D:\servidor\prunsrv.exe
 
REM Service log configuration
set PR_LOGPREFIX=%SERVICE_NAME%
set PR_LOGPATH=D:\servidor\logs
set PR_STDOUTPUT=D:\servidor\logs\stdout.txt
set PR_STDERROR=D:\servidor\logs\stderr.txt
set PR_LOGLEVEL=Error
 
REM Path to java installation
set PR_JVM=C:\Program Files (x86)\Java\jre7\bin\client\jvm.dll
set PR_CLASSPATH=Servidor.jar
 
REM Startup configuration
set PR_STARTUP=auto
set PR_STARTMODE=jvm
set PR_STARTCLASS=emf.Servidor
REM set PR_STARTMETHOD=start
set PR_STARTPARAMS=start
 
REM Shutdown configuration
set PR_STOPMODE=jvm
set PR_STOPCLASS=emf.Servidor
rem set PR_STOPMETHOD=stop
set PR_STOPPARAMS=stop
 
REM JVM configuration
set PR_JVMMS=256
set PR_JVMMX=1024
set PR_JVMSS=4000
REM set PR_JVMOPTIONS=-Duser.language=DE;-Duser.region=de
echo Variables asignadas
prunsrv.exe //IS//%SERVICE_NAME%
echo Servicio Creado
pause

y les Adjunto mi proyecto en zip

Gracias de antemano

AdjuntoTamaño
App.zip130.32 KB

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Nopalin

headless=true

Nunca he utilizado apache commons daemon, pero seguramente ese wrapper java la está lanzando como headless= true (que no tiene monitor ni teclado), ya que se supone que un servicio solo recibe peticiones remotas, realiza procesos y retorna información, nunca deberías interacturar directo con ese servicio. Debes buscar en esa libreria como iniciar el wrapper en modo headless = false, para que la jvm pueda iniciar un contexto gráfico.

Saludos