import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManagerFactory;

public class JI9044773 {

	public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException, NoSuchAlgorithmException, KeyStoreException, CertificateException, UnrecoverableKeyException, KeyManagementException {
		KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance( 
				KeyManagerFactory.getDefaultAlgorithm()); 
		KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
		try (InputStream is = new FileInputStream("keystore_1.jks")) { 
			ks.load(is, "password".toCharArray()); 
		} 
		keyManagerFactory.init(ks, "password".toCharArray()); 

		TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance( 
				TrustManagerFactory.getDefaultAlgorithm()); 
		trustManagerFactory.init(ks); 
		final SSLContext context = SSLContext.getInstance("TLSv1"); 
		context.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); 

		final ServerSocket server = new ServerSocket(9000); 
		new Thread() { 
			@Override 
			public void run() { 
				while (true) { 
					try { 
						Socket s = server.accept(); 
						SSLSocket sslSocket = (SSLSocket) context.getSocketFactory().createSocket(s, s.getInetAddress().getHostName(), s.getPort(), true); 
						sslSocket.setUseClientMode(false); 
						sslSocket.startHandshake(); 
						System.out.println("Server sleeping"); 
						Thread.sleep(3000); 
						sslSocket.getOutputStream().write(new byte[18]); 
						sslSocket.getOutputStream().write(new byte[18]); 
						sslSocket.getOutputStream().write(new byte[18]); 
						sslSocket.getOutputStream().write(new byte[18]); 
						sslSocket.getOutputStream().flush(); 
						sslSocket.getOutputStream().close(); 
						sslSocket.close(); 
					} catch (IOException e) { 
						e.printStackTrace(); 
					} catch (InterruptedException e) { 
						e.printStackTrace(); 
					} 
				} 
			} 
		}.start(); 
		Socket s = new Socket("localhost", 9000); 
		SSLSocket sslSocket = (SSLSocket) context.getSocketFactory().createSocket(s, "localhost", 9000, true); 
		sslSocket.setUseClientMode(true); 
		sslSocket.startHandshake(); 

		sslSocket.getOutputStream().write(new byte[1024]); 
		Thread.sleep(5000); 
		byte[] b = new byte[18]; 
		int totalRead = 0; 
		while (totalRead < 72) { 
			int read = sslSocket.getInputStream().read(b); 
			System.out.println("read " + read + " " + new String(b, 0, read)); 
			totalRead += read; 
		} 
		System.out.println(sslSocket.getInputStream().read() == -1); 

	}

}
