import java.io.IOException; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; /** * LaunchThread class which starts services * @author bencall * */ public class LaunchThread extends Thread { private BonjourEmitter emitter; private ServerSocket servSock = null; private String name; private String password; private boolean stopThread = false; /** * Constructor * @param name */ public LaunchThread(String name){ super(); this.name = name; } /** * Constructor * @param name */ public LaunchThread(String name, String pass){ super(); this.name = name; this.password = pass; } private byte[] getHardwareAdress() { byte[] hwAddr = null; InetAddress local; try { local = InetAddress.getLocalHost(); NetworkInterface ni = NetworkInterface.getByInetAddress(local); if (ni != null) hwAddr = ni.getHardwareAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e) { e.printStackTrace(); } return hwAddr; } private String getStringHardwareAdress(byte[] hwAddr) { StringBuilder sb = new StringBuilder(); for (byte b : hwAddr) sb.append(String.format("%02x", b)); return sb.toString(); } public void run() { System.out.println("starting service..."); // Setup safe shutdown Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { System.out.println("shutting down..."); LaunchThread.this.stopThread(); try { LaunchThread.this.emitter.stop(); LaunchThread.this.servSock.close(); System.out.println("service stopped."); } catch (IOException e) { // } } }); int port = 5000; try { // DNS Emitter (Bonjour) byte[] hwAddr = getHardwareAdress(); // Check if password is set if(password == null) emitter = new BonjourEmitter(name, getStringHardwareAdress(hwAddr), port, false); else emitter = new BonjourEmitter(name, getStringHardwareAdress(hwAddr), port, true); System.out.println("announced ["+name+" @ "+getStringHardwareAdress(hwAddr)+"]"); // We listen for new connections try { servSock = new ServerSocket(port); } catch (IOException e) { System.out.println("port busy, using default."); servSock = new ServerSocket(); } servSock.setSoTimeout(1000); System.out.println("service started."); while (!stopThread) { try { Socket socket = servSock.accept(); System.out.println("accepted connection from " + socket.toString()); // Check if password is set if(password == null) new RTSPResponder(hwAddr, socket).start(); else new RTSPResponder(hwAddr, socket, password).start(); } catch(SocketTimeoutException e) { // } } } catch (IOException e) { throw new RuntimeException(e); } finally { try { emitter.stop(); servSock.close(); } catch (IOException e) { e.printStackTrace(); } } } public synchronized void stopThread() { stopThread = true; } }