PageRenderTime 25ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/customsagetv/DummyNetworkTuner/src/main/java/org/jdna/sagetv/networkencoder/NetworkTunerServer.java

http://customsagetv.googlecode.com/
Java | 225 lines | 178 code | 26 blank | 21 comment | 23 complexity | 61f4fd25e0880aad741ab9de97d8dc41 MD5 | raw file
Possible License(s): AGPL-1.0
  1. package org.jdna.sagetv.networkencoder;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. import org.apache.log4j.Logger;
  8. import sagex.SageAPI;
  9. import sagex.phoenix.configuration.proxy.GroupProxy;
  10. import sagex.util.Log4jConfigurator;
  11. /**
  12. * Main server for handling the network encoder communications.
  13. *
  14. * Server should automatically register with sagetv if the server has <b>network_encoder_discovery=true</b> set.
  15. * <br/>
  16. *
  17. * If sage does not find the server, then add this to the sage.properties
  18. * <pre>
  19. mmc/encoders/123/1/0/video_crossbar_index=0
  20. mmc/encoders/123/1/0/video_crossbar_type=1
  21. mmc/encoders/123/capture_config=2050
  22. mmc/encoders/123/encoder_merit=0
  23. mmc/encoders/123/encoding_host=localhost:5000
  24. mmc/encoders/123/encoding_host_login_md5=
  25. mmc/encoders/123/video_capture_device_name=Faker
  26. mmc/encoders/123/video_capture_device_num=0
  27. * </pre>
  28. *
  29. * @author seans
  30. *
  31. */
  32. public class NetworkTunerServer {
  33. private Logger logger = Logger.getLogger(NetworkTunerServer.class);
  34. private ServerSocket serversocket = null;
  35. private DatagramSocket datagramSocket = null;
  36. private INetworkEncoder encoder = null;
  37. private boolean isRunning = false;
  38. private ServerConfiguration config = null;
  39. private Thread multiCastThread;
  40. public NetworkTunerServer() {
  41. }
  42. public static void main(String args[]) throws Exception {
  43. Log4jConfigurator.configureQuietly("sagex-networktuner");
  44. SageAPI.setProvider(new ConsoleSageAPIProvider());
  45. final NetworkTunerServer server = new NetworkTunerServer();
  46. Runtime.getRuntime().addShutdownHook(new Thread() {
  47. @Override
  48. public void run() {
  49. server.stopServer();
  50. }
  51. });
  52. server.startServer();
  53. while (true);
  54. }
  55. public void stopServer() {
  56. try {
  57. if (encoder!=null) {
  58. encoder.stop(new StopCommand("STOP ALL"));
  59. }
  60. } catch (Throwable t) {
  61. logger.warn("Failed to stop network tuner!", t);
  62. }
  63. try {
  64. if (serversocket!=null) {
  65. serversocket.close();
  66. }
  67. } catch (Throwable e) {
  68. logger.warn("Failed to close network tuner socket", e);
  69. }
  70. try {
  71. if (datagramSocket!=null) {
  72. datagramSocket.close();
  73. }
  74. } catch (Throwable e) {
  75. logger.warn("Failed to close network tuner broadcast listener socket", e);
  76. }
  77. logger.info("Network Tuner has been stopped.");
  78. isRunning = false;
  79. }
  80. public void init() throws Exception {
  81. config = GroupProxy.get(ServerConfiguration.class);
  82. logger.debug("Network Tuner creating: " + config.getDefaultEncoderClass());
  83. this.encoder = ((AbstractNetworkEncoderService) Class.forName(config.getDefaultEncoderClass()).newInstance()).createNetworkEncoder();
  84. }
  85. public void startServer() {
  86. try {
  87. init();
  88. } catch (Exception e) {
  89. logger.error("Failed to initialize the network tuner: " + e.getMessage(), e);
  90. return;
  91. }
  92. runMulticast();
  93. try {
  94. serversocket = new ServerSocket(config.getPort());
  95. } catch (Exception exception) {
  96. logger.error("Error creating network tuner socket: " + config.getPort(), exception);
  97. return;
  98. }
  99. Runnable run = new Runnable() {
  100. @Override
  101. public void run() {
  102. while (true) {
  103. try {
  104. Socket socket = serversocket.accept();
  105. socket.setSoTimeout(15000);
  106. logger.debug("EncodingServer received connection:" + socket);
  107. new CommandHandler(socket, encoder);
  108. try {
  109. Thread.sleep(100);
  110. } catch (InterruptedException ie) {
  111. logger.warn("Main Network Encoding Server interrupted. Exiting.");
  112. Thread.currentThread().interrupt();
  113. break;
  114. }
  115. socket.close();
  116. } catch (Exception exception1) {
  117. logger.error("Error with EncodingServer socket!", exception1);
  118. }
  119. }
  120. }
  121. };
  122. Thread t = new Thread(run);
  123. t.start();
  124. logger.info("EncodingServer launched on port " + config.getPort());
  125. System.out.println("EncodingServer launched on port " + config.getPort());
  126. }
  127. public void runMulticast() {
  128. if (!config.getDiscoveryEnabled()) {
  129. logger.info("Discovery is disabled.");
  130. return;
  131. }
  132. final int port = config.getPort();
  133. isRunning = true;
  134. multiCastThread = new Thread("DVBNetworkEncoderDiscoveryServer-" + port) {
  135. public void run() {
  136. datagramSocket = null;
  137. try {
  138. try {
  139. datagramSocket = new DatagramSocket(8271);
  140. } catch (IOException ioexception) {
  141. logger.error("Error creating discovery socket! (discovery disabled)", ioexception);
  142. return;
  143. }
  144. logger.info("Encoding Discovery Server was instantiated.");
  145. do {
  146. if (datagramSocket == null) break;
  147. try {
  148. DatagramPacket datagrampacket = new DatagramPacket(new byte[4096], 4096);
  149. datagramSocket.receive(datagrampacket);
  150. logger.debug("Server got broadcast packet: " + datagrampacket);
  151. if (datagrampacket.getLength() >= 6) {
  152. byte abyte0[] = datagrampacket.getData();
  153. if (abyte0[0] == 83 && abyte0[1] == 84 && abyte0[2] == 78) {
  154. byte byte0 = abyte0[3];
  155. byte byte1 = abyte0[4];
  156. byte byte2 = abyte0[5];
  157. if (byte0 > 4 || byte0 == 4 && (byte1 > 1 || byte1 == 1 && byte2 >= 0)) {
  158. abyte0[3] = 4;
  159. abyte0[4] = 1;
  160. abyte0[5] = 0;
  161. abyte0[6] = (byte) (port >> 8 & 255);
  162. abyte0[7] = (byte) (port & 255);
  163. String s = "DVB Network Encoder ("+config.getPort()+")";
  164. byte abyte1[] = s.getBytes("UTF-8");
  165. abyte0[8] = (byte) abyte1.length;
  166. System.arraycopy(abyte1, 0, abyte0, 9, abyte1.length);
  167. datagrampacket.setLength(9 + abyte1.length);
  168. logger.debug("Server sent back discovery data:" + datagrampacket);
  169. datagramSocket.send(datagrampacket);
  170. }
  171. }
  172. }
  173. } catch (IOException ioexception1) {
  174. logger.error("Error client connection!", ioexception1);
  175. try {
  176. Thread.sleep(100L);
  177. } catch (Exception exception4) {
  178. }
  179. }
  180. } while (isRunning);
  181. try {
  182. datagramSocket.close();
  183. } catch (Exception exception3) {
  184. }
  185. } finally {
  186. logger.info("Discovery Server shutting down...");
  187. }
  188. }
  189. };
  190. multiCastThread.setDaemon(true);
  191. multiCastThread.start();
  192. }
  193. public void restart() {
  194. logger.info("Restart Requested");
  195. stopServer();
  196. startServer();
  197. logger.info("Restart Finished");
  198. }
  199. }