elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Duda con sockets en java
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con sockets en java  (Leído 2,514 veces)
fekaa30

Desconectado Desconectado

Mensajes: 2


fekaa


Ver Perfil
Duda con sockets en java
« en: 8 Octubre 2012, 00:29 am »

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:

-> Esperar conexión en el servidor
   -> Cliente conectado
-> Obtener socket del cliente con server.accept();
-> Abrir flujos DataInputStream y DataOutputStream del socket
-> Enviar un paquete al cliente, para ello uso DataOutputStream
   -> Recibir paquete del servidor, para ello uso DataInputStream
   -> Enviar respuesta al servidor
-> Recibir respuesta del cliente
-> Enviar paquete al cliente
   -> Recibir paquete del servidor, para ello vuelvo a usar DataInputStream
   -> Enviar paquete al servidor
-> Recibir paquete del cliente
-> 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
  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!


En línea

Exígete mucho de tí mismo y espera poco de los demás. Así te ahorrarás disgustos.
Proteus1989

Desconectado Desconectado

Mensajes: 184



Ver Perfil WWW
Re: Duda con sockets en java
« Respuesta #1 en: 8 Octubre 2012, 21:31 pm »

No abras y cierres la comunicación cada vez que des una vuelta en el while, abrelos antes del while y déjalos abiertos hasta que salgas del mismo.
Eso es posible que solucione tus problemas.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
sockets bloqueados + java
Java
Ctesias 1 6,921 Último mensaje 5 Abril 2005, 03:57 am
por AnKeR
sockets + java?
Java
coolfrog 3 4,233 Último mensaje 23 Octubre 2005, 05:25 am
por coolfrog
Java: Sockets TCP
Java
BlaineMonkey 0 3,735 Último mensaje 6 Mayo 2010, 13:21 pm
por BlaineMonkey
Sockets en Java
Java
mapers 3 4,181 Último mensaje 11 Julio 2011, 10:22 am
por Debci
Ayuda con Sockets en java
Java
juancaa 1 1,890 Último mensaje 28 Agosto 2012, 03:35 am
por xmbeat
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines