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

Servidor TCP

Estas en el tema de Servidor TCP en el foro de Java en Foros del Web. hola, he creado un servidor TCP con java, si le pongo un cliente también programado en java funciona perfecto, sin embargo, si el cliente es ...
  #1 (permalink)  
Antiguo 05/02/2009, 07:03
och
 
Fecha de Ingreso: enero-2009
Mensajes: 29
Antigüedad: 15 años, 3 meses
Puntos: 0
Servidor TCP

hola, he creado un servidor TCP con java, si le pongo un cliente también programado en java funciona perfecto, sin embargo, si el cliente es uno "real", no recibe los datos que le envía, estoy viendo los paquetes y es correcto, los comparo (el "real" y el cliente java) y son iguales, ¿no es un inputStream por no ser java?

Código:
//El cliente se conecta

				servidor = server.accept();
				logger.info("aceptada la conexion");
				
//El servidor envía los datos al cliente
                                envio = "OK";
				flujoSalida = servidor.getOutputStream();
				datoEnv = new DataOutputStream(flujoSalida);
				datoEnv.writeUTF(envio);
				logger.info("se ha enviado el saludo");

//El servidor recibe datos del cliente					
				flujoEntrada = servidor.getInputStream();
				datoRec = new DataInputStream(flujoEntrada);
	        		recibido =datoRec.readUTF();
				logger.info(recibido);

Gracias. Saludos
  #2 (permalink)  
Antiguo 05/02/2009, 12:14
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Servidor TCP

Haría falta algo más de información para adivinar que pasa:
.- ¿Que significa "cliente real"?
.- ¿Y "no recibe los datos"?

Lo mas que puede pasar es que los String no se reciban bien por que Java usa por defecto una codificacion y el cliente use otra, pero recibir algo debería recibir.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 06/02/2009, 02:11
och
 
Fecha de Ingreso: enero-2009
Mensajes: 29
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Servidor TCP

Hola de nuevo.

Con "cliente real" me refiero a un cliente que se conecta a internet, y que manda datos al servidor java. El "irreal" es un programa java también.

Como puedes ver en el código, el servidor acepta conexiones (funciona), envía datos(funciona) y los recibe (no funciona). Con el logger, mostrando mensajes por pantalla veo que el problema está en
Código:
			DataInputStream datoRec = new DataInputStream(flujoEntrada);
	        	String recibido =datoRec.readUTF(); //aquí falla
Según veo genera una EOFException,

Código:
java.io.EOFException
        at java.io.DataInputStream.readFully(DataInputStream.java:268)
        at java.io.DataInputStream.readUTF(DataInputStream.java:639)
        at java.io.DataInputStream.readUTF(DataInputStream.java:610)
qeu por lo que estoy viendo es que intenta leer más allá del final del dataInputStream, pero también veo que eso pasa con otro tipo de datos, que con los DataInputStream java solo sabe donde parar... total que estoy echa un lío. ¿alguna idea?

Gracias.

Saludos

Última edición por och; 06/02/2009 a las 02:55
  #4 (permalink)  
Antiguo 06/02/2009, 03:43
och
 
Fecha de Ingreso: enero-2009
Mensajes: 29
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Servidor TCP

Ya he descubierto el problema. La codificación UTF manda en primer lugar, en 2 bytes la longitud de los datos, por eso no me funcionaba.
  #5 (permalink)  
Antiguo 06/02/2009, 05:05
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Servidor TCP

Aha, sí, ese suele ser el problema más común cuando comunicas dos lenguajes diferentes. En estos casos no se pueden usar metodos "avanzados" como readUTF, que lee una cadena pre-suponiendo que viene codificada de una forma especial, y hay que optar por leer byte a byte.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #6 (permalink)  
Antiguo 10/02/2009, 01:33
och
 
Fecha de Ingreso: enero-2009
Mensajes: 29
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Servidor TCP

Sí, leerla byte a byte es una opción, pero yo he optado por otra que me parece mejor (porque como no sé la longitud del paquete no sé cuantos bytes debo leero), por si le es útil a alguien, lo que he hecho de la siguiente manera:

Código:
InputStream flujoEntrada = servidor.getInputStream();
DataInputStream datoRec = new DataInputStream(flujoEntrada);
InputStreamReader datosEntrada = new InputStreamReader(datoRec);
BufferedReader buffer = new BufferedReader(datosEntrada);			
Strin recibido = buffer.readLine();
Saludos
  #7 (permalink)  
Antiguo 10/02/2009, 02:19
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Servidor TCP

Bueno, con byte a byte no me referia de forma literal, me refería a que tenías que leer bytes y no carácteres.
En el codigo que muestras, DataInputStream no hace nada, así que podrías quitar ese paso sin problemas.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #8 (permalink)  
Antiguo 12/02/2009, 06:29
och
 
Fecha de Ingreso: enero-2009
Mensajes: 29
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Servidor TCP

Sigo a vueltas con mi servidor.

Lo que quiero que pase es que alguien se le conecte, y durante todo el tiempo de conexión, si recibe algo lo muestre por pantalla:

Código:
        server = new ServerSocket(puerto);
	logger.info("servidor creado en el puerto " + puerto);
	servidor = server.accept();
	logger.info("aceptada la conexion");
		
	while(!servidor.isClosed()){		

			logger.info("conexion abierta");				
			flujoEntrada = servidor.getInputStream();
			datoRec = new DataInputStream(flujoEntrada);
			datosEntrada = new InputStreamReader(datoRec);
			buffer = new BufferedReader(datosEntrada);			
			recibido = buffer.readLine();
		        logger.info(recibido);
Pero nada, solo escribe linea por linea recibido cuando cierro en el cliente cierro la conexión, no cada vez que recibe algo como yo quiero.

Otra cosa que me extraña es que cuando cierro el cliente, me dice "conexión abierta" y null.

¿como es posible que se meta en

Código:
while (!servidor.isClosed())
esté abierta o cerrada??

Gracias.

Saludos

PEro no funciona,
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 17:18.