11/*
2- * Copyright (c) 2020, 2024 , Oracle and/or its affiliates. All rights reserved.
2+ * Copyright (c) 2020, 2025 , Oracle and/or its affiliates. All rights reserved.
33 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44 *
55 * This code is free software; you can redistribute it and/or modify it
3131import java .security .cert .X509CertSelector ;
3232import java .util .ArrayList ;
3333import java .util .List ;
34- import java .util .concurrent .ConcurrentHashMap ;
35- import java .util .concurrent .ExecutorService ;
36- import java .util .concurrent .Executors ;
37- import java .util .concurrent .TimeUnit ;
34+ import java .util .concurrent .*;
3835
3936/**
4037 * This is a base setup for creating a server and clients. All clients will
@@ -84,14 +81,16 @@ abstract public class TLSBase {
8481 byte [] read (SSLSocket sock ) throws Exception {
8582 BufferedInputStream is = new BufferedInputStream (sock .getInputStream ());
8683 byte [] b = is .readNBytes (5 );
87- System .err .println ("(read) " + Thread .currentThread ().getName () + ": " + new String (b ));
84+ System .err .println ("(read) " + Thread .currentThread ().getName () + ": " +
85+ new String (b ));
8886 return b ;
8987 }
9088
9189 // Base write operation
9290 public void write (SSLSocket sock , byte [] data ) throws Exception {
9391 sock .getOutputStream ().write (data );
94- System .err .println ("(write)" + Thread .currentThread ().getName () + ": " + new String (data ));
92+ System .err .println ("(write)" + Thread .currentThread ().getName () + ": " +
93+ new String (data ));
9594 }
9695
9796 private static KeyManager [] getKeyManager (boolean empty ) throws Exception {
@@ -148,14 +147,9 @@ static class Server extends TLSBase {
148147 // Clients sockets are kept in a hash table with the port as the key.
149148 ConcurrentHashMap <Integer , SSLSocket > clientMap =
150149 new ConcurrentHashMap <>();
151- Thread t ;
152150 List <Exception > exceptionList = new ArrayList <>();
153- ExecutorService threadPool = Executors .newFixedThreadPool (1 ,
154- r -> {
155- Thread t = Executors .defaultThreadFactory ().newThread (r );
156- return t ;
157- });
158-
151+ ExecutorService threadPool = Executors .newFixedThreadPool (1 );
152+ CountDownLatch serverLatch = new CountDownLatch (1 );
159153 Server (ServerBuilder builder ) {
160154 super ();
161155 name = "server" ;
@@ -168,43 +162,45 @@ static class Server extends TLSBase {
168162 ssock .setReuseAddress (true );
169163 ssock .setNeedClientAuth (builder .clientauth );
170164 serverPort = ssock .getLocalPort ();
171- System .out .println ("Server Port: " + serverPort );
165+ System .err .println ("Server Port: " + serverPort );
172166 } catch (Exception e ) {
173167 System .err .println ("Failure during server initialization" );
174168 e .printStackTrace ();
175169 }
176170
177171 // Thread to allow multiple clients to connect
178- t = new Thread (() -> {
172+ new Thread (() -> {
179173 try {
180- while (true ) {
174+ System .err .println ("Server starting to accept" );
175+ serverLatch .countDown ();
176+ do {
181177 SSLSocket sock = (SSLSocket )ssock .accept ();
182178 threadPool .submit (new ServerThread (sock ));
183- }
179+ } while ( true );
184180 } catch (Exception ex ) {
185181 System .err .println ("Server Down" );
186182 ex .printStackTrace ();
187183 } finally {
188184 threadPool .close ();
189185 }
190- });
191- t .start ();
186+ }).start ();
192187 }
193188
194189 class ServerThread extends Thread {
195190 SSLSocket sock ;
196191
197192 ServerThread (SSLSocket s ) {
198193 this .sock = s ;
199- System .err .println ("ServerThread(" +sock .getPort ()+")" );
194+ System .err .println ("(Server) client connection on port " +
195+ sock .getPort ());
200196 clientMap .put (sock .getPort (), sock );
201197 }
202198
203199 public void run () {
204200 try {
205201 write (sock , read (sock ));
206202 } catch (Exception e ) {
207- System .out .println ("Caught " + e .getMessage ());
203+ System .err .println ("Caught " + e .getMessage ());
208204 e .printStackTrace ();
209205 exceptionList .add (e );
210206 }
@@ -289,7 +285,8 @@ static class Client extends TLSBase {
289285 this .tm = tm ;
290286 try {
291287 sslContext = SSLContext .getInstance ("TLS" );
292- sslContext .init (TLSBase .getKeyManager (km ), TLSBase .getTrustManager (tm ), null );
288+ sslContext .init (TLSBase .getKeyManager (km ),
289+ TLSBase .getTrustManager (tm ), null );
293290 socket = createSocket ();
294291 } catch (Exception ex ) {
295292 ex .printStackTrace ();
@@ -312,9 +309,12 @@ public SSLSocket createSocket() {
312309
313310 public SSLSocket connect () {
314311 try {
315- socket .connect (new InetSocketAddress (InetAddress .getLoopbackAddress (), serverPort ));
316- System .err .println ("Client (" + Thread .currentThread ().getName () + ") connected using port " +
317- socket .getLocalPort () + " to " + socket .getPort ());
312+ socket .connect (new InetSocketAddress (
313+ InetAddress .getLoopbackAddress (), serverPort ));
314+ System .err .println ("Client (" +
315+ Thread .currentThread ().getName () +
316+ ") connected using port " + socket .getLocalPort () + " to " +
317+ socket .getPort ());
318318 writeRead ();
319319 } catch (Exception ex ) {
320320 ex .printStackTrace ();
0 commit comments