Foros del Web » Programación para mayores de 30 ;) » Java »

Duda sobre sockets en java

Estas en el tema de Duda sobre sockets en java en el foro de Java en Foros del Web. Buenos días. Tengo una duda que me está carcomiendo la cabeza: Intento hacer una aplicación cliente servidor, desde el servidor espero conexiones (es un servidor ...
  #1 (permalink)  
Antiguo 07/10/2012, 16:30
 
Fecha de Ingreso: abril-2008
Ubicación: Córdoba
Mensajes: 103
Antigüedad: 16 años
Puntos: 4
Pregunta Duda sobre sockets en java

Buenos días.

Tengo una duda que me está carcomiendo la cabeza: Intento hacer una aplicación cliente servidor, desde el servidor espero conexiones (es un servidor que acepta varios clientes).

La cuestion es que yo quiero realizar algo como lo siguiente:

Código Sockets:
Ver original
  1. -> Esperar conexión en el servidor
  2.    -> Cliente conectado
  3. -> Obtener socket del cliente con server.accept();
  4. -> Abrir flujos DataInputStream y DataOutputStream del socket
  5. -> Enviar un paquete al cliente, para ello uso DataOutputStream
  6.    -> Recibir paquete del servidor, para ello uso DataInputStream
  7.    -> Enviar respuesta al servidor
  8. -> Recibir respuesta del cliente
  9. -> Enviar paquete al cliente
  10.    -> Recibir paquete del servidor, para ello vuelvo a usar DataInputStream
  11.    -> Enviar paquete al servidor
  12. -> Recibir paquete del cliente
  13. -> Cerrar conexion

Bien, como pueden ver no es algo muy complicado ya que de ésa manera tengo entendido que funcionan los sockets (según lo que leí). La comunicación la hago en binario (osea, transmito y recibo paquetes pero no en formato texto, no se si me explico).

Mi problema es el siguiente: Cuando envío el primer paquete al cliente, me lo transmite correctamente. Luego, desde el cliente le respondo al servidor, quien recibe correctamente el paquete. Pero luego quiero enviar un nuevo paquete desde el servidor al cliente, y me dice que el Socket ya ha sido cerrado. Para enviar datos al cliente por el socket uso el método write(byte[] data) de DataOutputStream. Luego hago un dOutputStream.close(); (haciendo ésto es cuando me llegan los datos correctos al cliente). Pero se vé que cuando cierro el flujo de salida, no puedo enviar más nada.

Ésto es lo que tengo en el método run del ServerSocketThread

Código Javascript:
Ver original
  1. public void run(){
  2.        
  3.         int maxLen = 1024;
  4.         byte[] buffer; //Buffer de datos
  5.        
  6.         while(true){
  7.             try {
  8.                 dInputStream  = new DataInputStream(socket.getInputStream());
  9.                 dOutputStream = new DataOutputStream(socket.getOutputStream());
  10.                 //Leemos el paquete, y de aqui lo mandamos a analizar.
  11.                 buffer = new byte[maxLen]; //Definimos el buffer con el tamaño maximo de 1024 bytes
  12.                 int k = -1;
  13.                 int readLen = 0;
  14.                
  15.                 while((k = dInputStream.read()) != -1 && readLen < maxLen){ //Leemos byte a byte hasta que no queden mas bytes                 
  16.                     buffer[readLen] = (byte)k;
  17.                     readLen++;
  18.                     if(k == ConstantsProtocol.END)
  19.                         break;
  20.                 }
  21.                
  22.                 //Si recibimos menos del maximo, entonces lo guardaremos en un arreglo nuevo para que no queden espacios vacios (0x00)
  23.                 if(readLen <= maxLen){
  24.                     byte[] buffAux = new byte[readLen];
  25.                     ByteUtils.arrayCopy(buffer, 0, buffAux, 0, readLen);
  26.                     buffer = buffAux;
  27.                 }
  28.                
  29.                 Print.logInfo("Recv[" + readLen + "][Hex]: " + StringTools.toHexString(buffer));
  30.                 byte respuesta[] = new byte[3];
  31.                 respuesta[0] = 0x00;
  32.                 respuesta[1] = 0x00;
  33.                 respuesta[2] = 0x00;
  34.                 dOutputStream.write(respuesta);
  35.                 dOutputStream.close();
  36.             } catch(SocketTimeoutException timeout){
  37.                 Print.logError("Read timeout[30s]: Cerrando conexion");
  38.                 try {
  39.                     socket.close();
  40.                     Print.logError("Conexion cerrada.");
  41.                     break;
  42.                 } catch (IOException e) {
  43.                     Print.logError("Error al cerrar conexion por timeout: " + e.getMessage());
  44.                 } catch (Throwable e) {
  45.                     Print.logError("Error al cerrar Thread por timeout: " + e.getMessage());
  46.                 }
  47.             } catch (IOException e) {
  48.                 Print.logError("Error al leer: " + e.getMessage());
  49.                 break;
  50.             }
  51.         }
  52.     }

Gracias, espero puedan ayudarme.

saludos..
  #2 (permalink)  
Antiguo 07/10/2012, 21:32
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Duda sobre sockets en java

Pues es bastante claro, dOutputStream.close() cierra el Stream y el Stream es el socket. No lo cierres.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 07/10/2012, 22:50
 
Fecha de Ingreso: abril-2008
Ubicación: Córdoba
Mensajes: 103
Antigüedad: 16 años
Puntos: 4
Duda sobre sockets en java

Si ,ya solucioné el problema. El problema es que desde el lado del cliente no estaba poniendo un control para terminar de leer.

Por ejemplo, hacía algo así:

int k = 0;
public static final int END = 0x01;

Código Javascript:
Ver original
  1. while((k = dInputStream.read()) != -1 && k != END){
  2.      buffer[offset] = k;
  3.      offset++;
  4. }

mientras que lo correcto era hacer:

Código Javascript:
Ver original
  1. while((k = dInputStream.read()) != -1){
  2.      buffer[offset] = k;
  3.      offset++;
  4.      if(k == END)
  5.          break;
  6. }
Saludos y gracias.

Etiquetas: cliente, comunicacion, servidor, socket
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:18.