/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package main.server; import java.io.IOException; import java.security.cert.X509Certificate; import java.util.Date; import javax.net.ssl.HandshakeCompletedEvent; import javax.net.ssl.SSLPeerUnverifiedException; import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; import javax.net.ssl.SSLSocket; import main.console.IOStream.JavaConsole; import main.console.IOStream.SocketAbstractIOStream; import main.console.MyConsole; import main.net.ssl.MyHandshakeListener; import main.net.ssl.SSLConnectionProperties; /** * * @author vara */ public class Server extends AbstractServer implements Runnable{ private SSLServerSocket serverSocket=null; private static JavaConsole out = new JavaConsole(); private static int ident = 1; private MyConsole mc ; public Server() throws Exception{ try { SSLServerSocketFactory sslServFac = SSLConnectionProperties.getServerSocketFactory(getType()); serverSocket = (SSLServerSocket) sslServFac.createServerSocket(getPort()); } catch (Exception ex) {throw ex;} } @Override public void start(){ newListener();} @Override public void stop() {} @Override public void run() { SSLSocket sslsocket= null; try { out.printf(AbstractServer.WAIT_FOR_CLIENT,new Date()); sslsocket = (SSLSocket) serverSocket.accept(); out.println("Client Connected !"); sslsocket.addHandshakeCompletedListener(new CustomerCertified(ident++)); } catch (IOException ex) { out.printf(AbstractServer.ERROR_SOCKET,new Date(),ex); ex.printStackTrace(out.getPrintStream()); } newListener(); SocketAbstractIOStream saios = null; try { saios = new SocketAbstractIOStream(sslsocket); saios.println("Welcome to server"); //delete this var !!! (only for preview test) SocketAbstractIOStream.message = "[Server] "; System.out.println("create console"); mc =new MyConsole(saios); } catch (IOException ex) { out.printf("IOStream Error %s", ex.getMessage()); out.println("Client disconnected !"); ex.printStackTrace(out.getPrintStream()); } finally{ try { sslsocket.close(); } catch (IOException ex) {} out.println("Close client "+sslsocket); } } @Override public void newListener() { (new Thread(this)).start(); } private class CustomerCertified extends MyHandshakeListener{ private int ident; public CustomerCertified(int id){ ident =id; } @Override public void handshakeCompleted(HandshakeCompletedEvent arg0) { try { X509Certificate cert=(X509Certificate)arg0.getPeerCertificates()[0]; String peer=cert.getSubjectDN().getName(); out.println(ident+": Request from "+peer); mc.commandLoop(); } catch (SSLPeerUnverifiedException pue) { out.println(ident+": Peer unverified "); //pue.printStackTrace(out.getPrintStream()); mc = null; try { arg0.getSocket().close(); } catch (IOException ex) {} } } } }