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

inconvenientes al leer tramas de bytes por tcp

Estas en el tema de inconvenientes al leer tramas de bytes por tcp en el foro de Java en Foros del Web. hola a todos. tengo un inconveniente al leer datos por tcp. he construido un servidor tcp necesito leer tramas que llegan al socket pero estas ...
  #1 (permalink)  
Antiguo 15/04/2011, 17:39
 
Fecha de Ingreso: abril-2011
Ubicación: bogota
Mensajes: 3
Antigüedad: 13 años
Puntos: 0
Pregunta inconvenientes al leer tramas de bytes por tcp

hola a todos. tengo un inconveniente al leer datos por tcp.
he construido un servidor tcp necesito leer tramas que llegan al socket pero estas tramas tienen las siguientes caracteristicas
-es de longitud variable
-tiene bytes de control, es decir distintos a los caracteres que se manejan normalmente
-entre esos bytes de control tienen varios bytes '0A' que son los de fin de linea

he tratado de leer todos los bytes que llegan al socket pero siempre tengo algun inconveniente:
si lo hago asi
trama=new BufferedReader(new InputStreamReader(socket.getInputStream() )
solo lee hasta el primer byte de fin de linea y me elimina el resto de la trama

y si lo leo byte por byte, no puedo determinar la longitud de la trama que llega y es vital porque es variable

si alguien sabe como a leer todos los bytes que me llegan a mi trama tcp y al igual de saber la longitud...
  #2 (permalink)  
Antiguo 15/04/2011, 23:46
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: inconvenientes al leer tramas de bytes por tcp

Hola,

Código:
comosabesdondeterminaestalineacomosabemosdondeiniciaestaotra
Ahora ... como sabes donde termina la primera frase y comienza la segunda?
Solo hay una opción,

Código:
/comosabesdondeterminaestalinea/comosabemosdondeinicialasiguiente/
Viste los separadores? Los separadores pueden ser, un caracter de control especial (en datos binarios se usan las 256 combinaciones posibles de un octeto), una breve pausa de tiempo o puede ser cualquier otra cosa que sea posible.

Sino existen los separadores ... ¿como quieres saber donde finalizó una y comienza la otra? Si tu pregunta es si hay algo mágico en Java para averiguarlo, no no hay, pero repito, cualquier cosa puede ser un separador, lo único es que tienes que saber que cosa separa una de la otra o saber la longitud por adelantado.

Saludos,
  #3 (permalink)  
Antiguo 16/04/2011, 21:36
 
Fecha de Ingreso: abril-2011
Ubicación: bogota
Mensajes: 3
Antigüedad: 13 años
Puntos: 0
Respuesta: inconvenientes al leer tramas de bytes por tcp

hola hackmanc, gracias por la respuesta.

resulta que las tramas que recibo ademas de ser de tamaño variable contienen datos aleatorios que tendre que analizar posteriormente, los datos no contienen ningun identificador que puedan ayudarme a reconocer cada una de las tramas...

pregunto si hay alguna forma porque como debes saber cuando se envia un paquete de datos por internet, se agregan algunos caracteres de control propios del protocolo tales como enrutamiento y cantidad de bytes enviados, los cuales ayudan a que la transmision sea fiel y no se pierdan datos. no domino bien las comunicaciones en java pero tengo un par de preguntas:

java reconoce la cantidad de bytes recibidos por el socket que tal ves pueda dedicir del protocolo IP?
si con un inputstremreader al parecer recibo la cadena completa, puedo de algun modo leerlo byte x byte antes de convertirlo a un objeto bufferedreader el cual solo maneja caracteres de texto?

gracias
  #4 (permalink)  
Antiguo 17/04/2011, 04:51
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: inconvenientes al leer tramas de bytes por tcp

Hola:

A bajo nivel todo se maneja solo, los paquetes IP tienen sus longitudes y sus cosas y te garantizan la fiabilidad completa. Pero a nivel de tu aplicación java todo eso es transparente para tí. A ti te garantizan que si desde el otro lado envían 10 bytes, a tí te llegan 10 bytes bien, independientemente que por debajo se haya enviado un paquete IP o dos, y las longitudes que tengan y checsums y demás.

Eres tú, a alto nivel, el que tiene que poner o saber cómo separar los mensajes.

Si los fin de línea son realmente fin de línea, puedes leerlo como lo haces. Cada lectura te dará hasta un fin de linea, pero el resto de los caracteres no se tiran (salvo que los tires tú inadvertidamente) y lo que tienes que hacer es ir leyendo repetidamente
Código java:
Ver original
  1. buffer=new BufferedReader(new InputStreamReader(socket.getInputStream() )
  2. String linea = buffer.readLine();
  3. while (linea != null) {
  4.    // trata linea
  5.    linea = buffer.readLine();
  6. }

Lo que no puedes hacer (no sé si lo haces, pero me da esa impresión por el nombre de la variable) es crear el BufferedReader cada vez que quieras leer una trama.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 17/04/2011, 10:33
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: inconvenientes al leer tramas de bytes por tcp

Hola,

Cita:
Iniciado por adogus Ver Mensaje
... pregunto si hay alguna forma porque como debes saber cuando se envia un paquete de datos por internet, se agregan algunos caracteres de control propios del protocolo tales como enrutamiento y cantidad de bytes enviados, los cuales ayudan a que la transmision sea fiel y no se pierdan datos. ...
No existe la información exactamente de lo que requieres en el protocolo IP. Es decir, no hay ninguna parte del protocolo donde diga cuantos bytes se están transmitiendo en total por cada trama, inclusive en el protocolo existe segmentación de paquetes, y una trama puede llegar en uno, dos, tres o la cantidad de packets que sean necesarios.

Cita:
Iniciado por chuidiang Ver Mensaje
Eres tú, a alto nivel, el que tiene que poner o saber cómo separar los mensajes.

Si los fin de línea son realmente fin de línea, puedes leerlo como lo haces.
Exactamente 'separar' los mensajes, aunque seguramente esta transmitiendo datos binarios, porque menciona los caracteres de control, así que creo que es poco probable que esten separados por un fin de línea.


La unica forma como yo logre separar los mensajes en un par de aplicaciones que tenian el mismo problema fue creando un timer, la separacion entre un 'flujo de informacion' y el siguiente no llegaba secuencialmente, siempre habia un pequeño lapso de tiempo entre uno y otro. Aun asi no era exacto porque si habian 'bottlenecks' en la red llegaban como 10 consecutivos y el programa tenia que deseachar 9.

Sobre todas las capas, red, OS, Java, etc., que estan involucradas en este proceso no encontre detalles que me dieran un dato exacto de como recibir información de longitud variable y consecutiva.

Saludos,
  #6 (permalink)  
Antiguo 18/04/2011, 22:15
 
Fecha de Ingreso: abril-2011
Ubicación: bogota
Mensajes: 3
Antigüedad: 13 años
Puntos: 0
Respuesta: inconvenientes al leer tramas de bytes por tcp

gracias por las respuestas. pues me he puesto a estudiar bien las tramas y veo algunas coincidencias que me pueden ayudar a identificar cada una, creo que por ahi va a ser la solucion.

ya que tocamos el tema de servidor tcp. cuantos clientes puede aceptar un servidor en java utilizando hilos?
  #7 (permalink)  
Antiguo 19/04/2011, 19:58
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: inconvenientes al leer tramas de bytes por tcp

Hola,

Cita:
Iniciado por adogus Ver Mensaje
gracias por las respuestas. pues me he puesto a estudiar bien las tramas y veo algunas coincidencias que me pueden ayudar a identificar cada una, creo que por ahi va a ser la solucion. ...
Normalmente, todas las estructuras de datos son estructuradas.

Es decir .. si vas a transmitir tramas con datos completamente al azar, ¿de que sirve transmitirlas en orden? Si ni siquiera vas a poder procesarlas. Veamos un ejemplo, un dispositivo transmite 200 bytes al azar, seguidamente transmite 500 bytes al azar. ¿Que diferencia hay que transmita 700 consecutivos?

Pero bueno, espero que encuentres la estructura de la información que seguramente existe pero todavía no la has encontrado.

Cita:
Iniciado por adogus Ver Mensaje
... ya que tocamos el tema de servidor tcp. cuantos clientes puede aceptar un servidor en java utilizando hilos?
Si alguien tiene ese dato exacto me gustaría mucho leerlo a mi también. Aunque entre combinaciones de hardware, sistemas operativos y versiones de java vamos a tener bastante para leer.

Saludos,

Etiquetas: buffer, byte, socket, tcp
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 14:13.