PageRenderTime 2665ms CodeModel.GetById 34ms RepoModel.GetById 1ms app.codeStats 0ms

/SDTP_Socket_Mongo/src/tpsocket/servidores/ThreadAtenderSatelite.java

https://gitlab.com/HeanGee/SD_Socket
Java | 196 lines | 135 code | 25 blank | 36 comment | 4 complexity | d5412835372ecc52ce6f7f08347b7d03 MD5 | raw file
  1. package tpsocket.servidores;
  2. import tpsocket.constantes.Defaults;
  3. import tpsocket.imgmanager.ImgEncoderB64;
  4. import tpsocket.logs.LogFileManager;
  5. import tpsocket.clientes.Satelite;
  6. import tpsocket.basededatos.ConexionBD;
  7. import com.google.gson.Gson;
  8. import java.awt.image.BufferedImage;
  9. import java.io.DataInputStream;
  10. import java.io.DataOutputStream;
  11. import java.io.File;
  12. import java.io.IOException;
  13. import java.net.Socket;
  14. import java.util.logging.Level;
  15. import java.util.logging.Logger;
  16. import javax.imageio.ImageIO;
  17. import javax.swing.JOptionPane;
  18. public class ThreadAtenderSatelite extends Thread
  19. {
  20. private final Socket clientSocket;
  21. private DataOutputStream canalSalida;
  22. private DataInputStream canalEntrada;
  23. public ThreadAtenderSatelite(Socket clientSocket)
  24. {
  25. super("ThreadAtenderSatelite");
  26. this.clientSocket = clientSocket;
  27. }
  28. @Override
  29. public void run()
  30. {
  31. try
  32. {
  33. /** Crear canales de entrada y salida. */
  34. this.canalEntrada = new DataInputStream(this.clientSocket.getInputStream());
  35. this.canalSalida = new DataOutputStream(this.clientSocket.getOutputStream());
  36. int longitudString;
  37. StringBuilder log = new StringBuilder();
  38. do
  39. {
  40. log.append("Esperando recibir longitud del mensaje en bytes...");
  41. this.escribirLog(log.toString());
  42. log = log.delete(0, log.length());
  43. /** Negociacion - Obtener la longitud del mensaje en bytes. */
  44. longitudString = this.canalEntrada.readInt();
  45. if(longitudString>0)
  46. {
  47. log.append("Longitud recibida; ").append(longitudString);
  48. this.escribirLog(log.toString());
  49. log = log.delete(0, log.length());
  50. /** Replay de recepción de longitud. */
  51. this.canalSalida.writeUTF("ok");
  52. /** Dimensionar un byte[] con el tamanho recibido. */
  53. byte[] bytesReceived = new byte[longitudString];
  54. /** Cargar bytesReceived, byte a byte, con los bytes que envia el cliente. */
  55. log.append("Leyendo bytes del buffer de entrada...");
  56. this.escribirLog(log.toString());
  57. log = log.delete(0, log.length());
  58. for(int i=0; i<longitudString; i++) {
  59. bytesReceived[i] = (byte)this.canalEntrada.readByte();
  60. }
  61. /** Convierte en String el mensaje recibido en bytes. */
  62. String contentReceived_inString;
  63. contentReceived_inString = new String(bytesReceived);
  64. log.append("Lectura del buffer de entrada terminado. Mensaje convertido a String.");
  65. this.escribirLog(log.toString());
  66. log = log.delete(0, log.length());
  67. StringBuilder msgTmp = new StringBuilder(contentReceived_inString);
  68. log.append("Mensaje: ").append(msgTmp.substring(0, 130)+"... y mas ...");
  69. this.escribirLog(log.toString());
  70. log = log.delete(0, log.length());
  71. /* --------------------------------------------------------- */
  72. // /** GUARDAR EN BASE DE DATOS contentReceived_inString. */
  73. // ConexionBD conec = new ConexionBD("localhost" , 27017,"test"); //Crea un Cliente del MongoDB
  74. // conec.crear(); //crea la conexion a la BD
  75. // System.out.println("***Insertando a la Base de Datos...");
  76. // conec.insertar("Satelite",contentReceived_inString); //Inserta a la Base de Datos
  77. // System.out.println("***JSON string insertado***");
  78. /* --------------------------------------------------------- */
  79. /** Replay de recepción y procesado de msg. */
  80. this.canalSalida.writeUTF("ok");
  81. /** Registrar log. */
  82. log.append("Peticion de Satelite ")
  83. .append(clientSocket.getPort())
  84. .append(" procesado correctamenete.");
  85. this.escribirLog(log.toString());
  86. log = log.delete(0, log.length());
  87. /* -------------------------------------------------------------- */
  88. /** TEST. */
  89. /** NO FORMA PARTE DE INDICACIÓN PDF. */
  90. /** Crea un objeto JSON. */
  91. Gson obJSON = new Gson();
  92. /** Des-gson-nea al String, obteniendo un objeto de tipo Satelite. */
  93. /** Instancia ese objeto Satelite. */
  94. log.append("Construyendo objeto a partir del mensaje...");
  95. this.escribirLog(log.toString());
  96. log = log.delete(0, log.length());
  97. Satelite objSatelite = obJSON.fromJson(contentReceived_inString, Satelite.class);
  98. /** lOG. */
  99. log.append("Objeto construido correctamente: ").append(objSatelite.getClass());
  100. this.escribirLog(log.toString());
  101. log = log.delete(0, log.length());
  102. /** Probar a recounstruir una imagen. */
  103. BufferedImage imagenDelSatelite;
  104. imagenDelSatelite = ImgEncoderB64.decodeToImage(objSatelite.getImgProcesadoABase64());
  105. String tipo = objSatelite.getTypeOfImg();
  106. log.append("Probando reconstruir imagen...");
  107. this.escribirLog(log.toString());
  108. log = log.delete(0, log.length());
  109. ImageIO.write(
  110. imagenDelSatelite, tipo, new File(
  111. "Satelite_"+objSatelite.getIdentificador()
  112. +"_"+objSatelite.getCodCultivo()
  113. +"."+tipo)
  114. );
  115. log.append("Imagen Reconstruido correctamente.");
  116. this.escribirLog(log.toString());
  117. log = log.delete(0, log.length());
  118. /* -------------------------------------------------------------- */
  119. }
  120. }
  121. while(longitudString>0); /** mientras el cliente le envie una longitud valida. */
  122. /** Cierre de canales y socket. */
  123. this.cerrarFlujos(log);
  124. // if(!this.clientSocket.isClosed() || this.clientSocket.isConnected())
  125. // {
  126. // log.append("Cliente cerro conexion."
  127. // + " Cerrando flujos en el servidor de Satelite.");
  128. // this.escribirLog(log.toString());
  129. // this.canalEntrada.close();
  130. // this.canalSalida.close();
  131. // this.clientSocket.close();
  132. // }
  133. }
  134. catch (IOException ex)
  135. {
  136. //JOptionPane.showMessageDialog(null, "IOException desde run() de "+this.getName(), "Exception", JOptionPane.ERROR_MESSAGE);
  137. Logger.getLogger(ThreadAtenderSatelite.class.getName()).log(Level.SEVERE, null, ex);
  138. this.escribirLog("I/O Exception desde run() de "+this.getName()+". SE HA PERDIDO EL MENSAJE.");
  139. try {
  140. this.cerrarFlujos(new StringBuilder());
  141. } catch (IOException ex1) {
  142. Logger.getLogger(ThreadAtenderSatelite.class.getName()).log(Level.SEVERE, null, ex1);
  143. }
  144. } catch (Throwable ex) {
  145. Logger.getLogger(ThreadAtenderSatelite.class.getName()).log(Level.SEVERE, null, ex);
  146. }
  147. }
  148. private void cerrarFlujos(StringBuilder log) throws IOException {
  149. if(!this.clientSocket.isClosed() || this.clientSocket.isConnected())
  150. {
  151. log.append("Cliente cerro conexion."
  152. + " Cerrando flujos en el servidor de Satelite.");
  153. this.escribirLog(log.toString());
  154. this.canalEntrada.close();
  155. this.canalSalida.close();
  156. this.clientSocket.close();
  157. }
  158. }
  159. public void escribirLog(String msg)
  160. {
  161. try {
  162. System.out.println("\t[Sat-"+this.clientSocket.getPort()+"]:"+msg);
  163. LogFileManager log = new LogFileManager(Defaults.SERVER_OF_SATELITE_LOGFILEPATH, true);
  164. log.writeTo("\t[Sat-"+this.clientSocket.getPort()+"]:"+msg);
  165. log.closeWriter();
  166. } catch (IOException ex) {
  167. JOptionPane.showMessageDialog(null, "IOException desde escribirLog() de "+this.getName(), "Exception", JOptionPane.ERROR_MESSAGE);
  168. Logger.getLogger(ThreadAtenderSatelite.class.getName()).log(Level.SEVERE, null, ex);
  169. }
  170. }
  171. }