1616import java .net .SocketAddress ;
1717import java .nio .ByteBuffer ;
1818import java .nio .ByteOrder ;
19+ import java .util .Objects ;
1920import java .util .concurrent .BlockingQueue ;
2021import java .util .concurrent .ExecutorService ;
2122import java .util .concurrent .Executors ;
@@ -61,7 +62,7 @@ abstract public class TCPHandler
6162 private final boolean client_mode ;
6263
6364 /** TCP socket to PVA peer
64- *
65+ *
6566 * Reading and writing is handled by receive and send threads,
6667 * but 'protected' so that derived classes may peek at socket properties.
6768 */
@@ -105,10 +106,10 @@ public void encodeRequest(final byte version, final ByteBuffer buffer) throws Ex
105106 });
106107
107108 /** Thread that runs {@link TCPHandler#receiver()} */
108- private final Future <Void > receive_thread ;
109+ private volatile Future <Void > receive_thread = null ;
109110
110111 /** Thread that runs {@link TCPHandler#sender()} */
111- private volatile Future <Void > send_thread ;
112+ private volatile Future <Void > send_thread = null ;
112113
113114 /** Start receiving messages
114115 *
@@ -122,16 +123,21 @@ public void encodeRequest(final byte version, final ByteBuffer buffer) throws Ex
122123 */
123124 public TCPHandler (final Socket socket , final boolean client_mode )
124125 {
125- this .socket = socket ;
126+ this .socket = Objects . requireNonNull ( socket ) ;
126127 this .client_mode = client_mode ;
127128
128129 // Receive buffer byte order is set based on header flag of each received message.
129130 // Send buffer of server and client starts out with native byte order.
130131 // For server, it stays that way.
131132 // For client, order is updated during connection validation (PVAHeader.CTRL_SET_BYTE_ORDER)
132133 send_buffer .order (ByteOrder .nativeOrder ());
134+ }
133135
134- // Start receiving data
136+ /** Start receiving data
137+ * To be called by Client/ServerTCPHandler when fully constructed
138+ */
139+ protected void startReceiver ()
140+ {
135141 receive_thread = thread_pool .submit (this ::receiver );
136142 }
137143
@@ -558,7 +564,7 @@ public void close(final boolean wait)
558564 {
559565 running = false ;
560566 socket .close ();
561- if (wait )
567+ if (wait && receive_thread != null )
562568 receive_thread .get (5 , TimeUnit .SECONDS );
563569 }
564570 catch (Exception ex )
0 commit comments