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

Enviar Bytes a través de Sockets

Estas en el tema de Enviar Bytes a través de Sockets en el foro de Java en Foros del Web. Tengo que enviar unas tramas tcp a través de sockets, pero quiero enviarlas en formato byte (no unicode). Como no tengo mucha idea he ido ...
  #1 (permalink)  
Antiguo 16/11/2007, 07:24
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 19 años, 4 meses
Puntos: 0
Enviar Bytes a través de Sockets

Tengo que enviar unas tramas tcp a través de sockets, pero quiero enviarlas en formato byte (no unicode).

Como no tengo mucha idea he ido cogiendo ejemplos de enviar sockets de aquí y de allà y por ahora uso este configuración de streams para enviar datos:
Código:
out = new PrintWriter( socket.getOutputStream(), true );
out.println( "Hola");
Esto sospecho que envia los datos en formato unicode.
Me he mirado el tema de I/O pero lo encuentro muy lioso y no me acabo de aclarar...
Alguien puede orientarme un poco?
  #2 (permalink)  
Antiguo 18/11/2007, 15:16
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Enviar Bytes a través de Sockets

¿Que quieres decir con "enviar en formato byte"?
  #3 (permalink)  
Antiguo 18/11/2007, 19:47
 
Fecha de Ingreso: noviembre-2007
Mensajes: 157
Antigüedad: 16 años, 5 meses
Puntos: 3
Re: Enviar Bytes a través de Sockets

Supongo que se referirá a ascii, donde cada caracter es un byte
Otra cosa ya es qué tiene que ver eso con los sockets :?
  #4 (permalink)  
Antiguo 19/11/2007, 01:53
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 19 años, 4 meses
Puntos: 0
Re: Enviar Bytes a través de Sockets

Lanselot tiene razon, un caracter un byte.
Lo de los sockets era para poner en contexto y porque tengo un lío que no veas con los streams y los buffers.

Pero ahora con la ayuda de un amigo he resuelto la parte I/O (he pasado de usar el objeto socket a usar el objeto socketchannel y un bytebuffer), pero aún tengo dudas de como formar la trama de datos que quiero enviar.

Por ejemplo... como puedo enviar la palabra "hola" sin que java convierta cada caracter a UNicode evitando asi que cada caracter ocupe el doble?
De momento estoy haciendo esto pero no se si es correcto:
Código:
String aux = new String("HOLA");
try
{
	this.start = aux.getBytes("UTF-8");
}
catch( Exception e){}
System.out.println( "Numero de bytes : " + this.start.length );
Esto me retorna 4, que si entiendo bien significa que obtengo lo que deseo, un caracter un byte... no?

PD: Por otra parte he leido que la JVM trata los bytes como 32bits y no como 8bit... pensando que luego debo leer estas tramas desde otro programa (no escrito en java) puede darme algun problema el uso de este tipo de dato??

Última edición por clinisbut; 19/11/2007 a las 03:15
  #5 (permalink)  
Antiguo 19/11/2007, 09:25
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Enviar Bytes a través de Sockets

Cita:
Iniciado por clinisbut Ver Mensaje
Lanselot tiene razon, un caracter un byte.
Ok, pero eso no se conoce como "formato byte" .

Cita:
Iniciado por clinisbut Ver Mensaje
Lo de los sockets era para poner en contexto y porque tengo un lío que no veas con los streams y los buffers.

Pero ahora con la ayuda de un amigo he resuelto la parte I/O (he pasado de usar el objeto socket a usar el objeto socketchannel y un bytebuffer), pero aún tengo dudas de como formar la trama de datos que quiero enviar.

Por ejemplo... como puedo enviar la palabra "hola" sin que java convierta cada caracter a UNicode evitando asi que cada caracter ocupe el doble?
De momento estoy haciendo esto pero no se si es correcto:
Código:
String aux = new String("HOLA");
try
{
	this.start = aux.getBytes("UTF-8");
}
catch( Exception e){}
System.out.println( "Numero de bytes : " + this.start.length );
Esto me retorna 4, que si entiendo bien significa que obtengo lo que deseo, un caracter un byte... no?
Si y no. UTF-8 no codifica cada caracter en un solo byte, de la misma forma que tampoco los codifica en 2. Si sólo envías caracteres ASCII, sólo usaras un byte por caracter, si envías caracteres que no estén en la tabla ASCII, se enviarán más de un byte por caracter. No se puede enviar caracteres que no sean ASCII usando sólo un byte.

Cita:
Iniciado por clinisbut Ver Mensaje
PD: Por otra parte he leido que la JVM trata los bytes como 32bits y no como 8bit... pensando que luego debo leer estas tramas desde otro programa (no escrito en java) puede darme algun problema el uso de este tipo de dato??
¿Donde lo has leido? Más que nada por que no tiene sentido . Para conectar dos ordenadores con lenguajes operativos diferentes y usando lenguajes de programacion diferentes, usar directamente sockets es bastante complejo, por las diferencias a nivel interno de los lenguajes. Tamaño de un caracter, codificacion, posición del bit más significativo... casi nada.

Por eso es por lo que se suelen usar otras soluciones como CORBA o Web Services para hacerlo.

S!
  #6 (permalink)  
Antiguo 20/11/2007, 02:02
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 19 años, 4 meses
Puntos: 0
Re: Enviar Bytes a través de Sockets

Cita:
¿Donde lo has leido?
Pues aquí: http://biese.wordpress.com/2006/10/0...es-in-java-01/

Voy a tener problemas entonces?? :( En principio el sistema operativo sera el mismo en ambos lados... lo concerniente a las diferencias de socket en C++ y Java las desconozco.

Última edición por clinisbut; 20/11/2007 a las 03:04
  #7 (permalink)  
Antiguo 20/11/2007, 06:51
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Enviar Bytes a través de Sockets

Ummm, vamos a ver, la especificación de Java no dice que los bytes sean de 32 bits, pero la mayoría de las implementaciones de procesadores de 32bits usan 32bits para almacenar los byte simplemente por comodidad. Y seguramente las implementaciones que salgan para procesadores de 64bits usarán 64... Y puede que algunas implementaciones de JVM no usen 32bits por byte cuando hagas un array de bytes para ahorrarse espacio... Así que realmente no puedes decir que Java lo hace así, por que depende de la implementación de la JVM. Lo que dice Java es que los bytes son con signo y de 8 bits, eso es lo único que puedes asegurar.

Lo que quiero decir es que, a no ser que te dediques a hacer maquinas virtuales o hagas tus programas sobre una en concreto donde necesites hacer optimizaciones críticas, de las que solo suelen hacer los fabricantes de hard... entonces ese dato no es muy fiable.

De igual forma, al enviar un byte por un socket, al igual que escribirlo en disco, no estás almacenandolo en la JVM así que seguramente sólo enviará/guardara "8 bits".

En cuanto a problemas de comunicación, si ambos S.O. son el mismo, los unicos "problemas" que se me ocurren son problemas en la codificacion de los carácteres y asegurarse de que si se envian tipos de datos primitivos, se leen adecuadamente segun el tamaño em ambos lenguajes.

S!
  #8 (permalink)  
Antiguo 20/11/2007, 08:22
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 19 años, 4 meses
Puntos: 0
Re: Enviar Bytes a través de Sockets

Muchas gracias, creo que ya entiendo lo que quieres decir:
trate como trate internamente Java sus datos, a la hora de depositarlos en un fichero/socket/lo que sea, estos permanecen en el "formato" del sistema (16, 32 o 64 bits).

Otra cosa es como los maneje internamente la maquina virtual.
Mis primeras pruebas a recibir los datos enviados por mi programa Java de momento estan saliendo bien, pero hacen falta pruebas mas profundas.

Muchas gracias de nuevo.
  #9 (permalink)  
Antiguo 20/11/2007, 11:25
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Enviar Bytes a través de Sockets

Exacto, una de las cosas buenas de Java y que lo diferencia de otros lenguajes "portables", como el ANSI C por ejemplo, es que Java "simula la CPU completa" de forma que los byte siempre son 8 bit sin signo, los short 16... en muchos otros lenguajes depende de la CPU y por eso a la hora de compilar hay que pasar parametros del tipo de S.O. y procesador que se usa etc.

Se pierde en rendimiento pero se gana en "portabilidad".

Suerte
  #10 (permalink)  
Antiguo 12/12/2013, 03:28
 
Fecha de Ingreso: diciembre-2013
Mensajes: 2
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Enviar Bytes a través de Sockets

Buennas:

Estoy un poco pegado en java. Estoy haciendo una aplicación para comunicarme mediante sockets y necesito enviar la una secuencia de bytes en hexadecimal (en bruto). Ya tengo medio hecho el programa. Buscando y mirando por ahí encontré el siguiente código, que es el que utilizo,

Código:
byte[] prueba = {0x5C, 0x02, 0x00, 0x00}

PrintWriter salidaTCP = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);

ByteArrayOutputStream prueba_raw = new ByteArrayOutputStream();
prueba_raw.write(prueba,0,prueba.length);

salidaTCP.print(prueba_raw);
Hasta aquí todo bien, consigo lo que quiero, más o menos. El problema viene cuando en byte[] pongo algún carácter mayor de 127, (0xA0, 0x80...), no puedo porque los bytes en Java son con signo, el eclipse me da error como que no puedo convertir el tipo.

Necesito enviar los bytes sin signo, es decir poder enviar 0xA0, 0x80, 0x97... y con shorts no puedo porque la función ByteArrayOutputStream solo me permite byte[]. Alguna idea o consejo?

Gracias.
Saludos.
  #11 (permalink)  
Antiguo 12/12/2013, 07:56
 
Fecha de Ingreso: diciembre-2013
Mensajes: 2
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Enviar Bytes a través de Sockets

Bueno, he conseguido algo, modo cutre, ya que lo suyo seria ir enviar un array de bytes pero de momento para las pruebas puede valer.

Código:
DataOutputStream salidaTCP = new DataOutputStream(socket.getOutputStream());
salidaTCP.write(0xA0);
salidaTCP.write(0x80);
salidaTCP.write(0x00);
salidaTCP.write(0x01);
salidaTCP.write(0x00);
salidaTCP.write(0x01);
De todas maneras esta forma no es la eficiente, hay que mejorarlo.
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 13:50.