test/jdk/com/sun/jndi/dns/lib/DNSTracer.java
changeset 51192 499b873761d8
parent 48851 1d8f882f2b2f
--- a/test/jdk/com/sun/jndi/dns/lib/DNSTracer.java	Tue Jul 24 08:58:32 2018 -0700
+++ b/test/jdk/com/sun/jndi/dns/lib/DNSTracer.java	Wed Jul 25 11:03:07 2018 +0800
@@ -26,6 +26,7 @@
 import java.io.PrintStream;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
+import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.net.SocketException;
@@ -46,7 +47,7 @@
  *
  * Typically, the capture file data will be used by DNSServer for playback
  */
-public class DNSTracer implements Runnable {
+public class DNSTracer extends Thread implements Server {
     public static final int DNS_DEFAULT_PORT = 53;
     public static final int DNS_PACKET_SIZE = 512;
     static HexDumpEncoder encoder = new HexDumpEncoder();
@@ -56,28 +57,30 @@
     private ByteBuffer reqBuffer = ByteBuffer.allocate(DNS_PACKET_SIZE);
     private ByteBuffer resBuffer = ByteBuffer.allocate(DNS_PACKET_SIZE);
     private PrintStream out = null;
+    private volatile boolean isRunning;
 
-    public DNSTracer(DatagramSocket socket, String dnsHostname) {
-        this(socket, dnsHostname, DNS_DEFAULT_PORT);
+    public DNSTracer(String dnsHostname) throws SocketException {
+        this(dnsHostname, DNS_DEFAULT_PORT);
     }
 
-    public DNSTracer(DatagramSocket socket, PrintStream outStream,
-            String dnsHostname) {
-        this(socket, outStream, dnsHostname, DNS_DEFAULT_PORT);
+    public DNSTracer(PrintStream outStream, String dnsHostname)
+            throws SocketException {
+        this(outStream, dnsHostname, DNS_DEFAULT_PORT);
     }
 
-    public DNSTracer(DatagramSocket socket, String dnsHostname, int dnsPort) {
-        this(socket, System.out, dnsHostname, dnsPort);
+    public DNSTracer(String dnsHostname, int dnsPort) throws SocketException {
+        this(System.out, dnsHostname, dnsPort);
     }
 
-    public DNSTracer(DatagramSocket socket, PrintStream outStream,
-            String dnsHostname, int dnsPort) {
-        inSocket = socket;
+    public DNSTracer(PrintStream outStream, String dnsHostname, int dnsPort)
+            throws SocketException {
+        inSocket = new DatagramSocket(0, InetAddress.getLoopbackAddress());
         out = outStream;
         dnsServerAddress = new InetSocketAddress(dnsHostname, dnsPort);
     }
 
     public void run() {
+        isRunning = true;
         System.out.println(
                 "DNSTracer: listening on port " + inSocket.getLocalPort());
 
@@ -116,7 +119,7 @@
                         resPacket.getLength(), reqPacket.getSocketAddress()));
             }
         } catch (SocketException se) {
-            if (inSocket.isClosed()) {
+            if (!isRunning) {
                 out.flush();
                 System.out.println("DNSTracer: Exit");
             } else {
@@ -127,4 +130,22 @@
         }
     }
 
+    @Override public void stopServer() {
+        isRunning = false;
+        if (inSocket != null) {
+            try {
+                inSocket.close();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+    }
+
+    @Override public int getPort() {
+        if (inSocket != null) {
+            return inSocket.getLocalPort();
+        } else {
+            return -1;
+        }
+    }
 }