Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/04/2010, 04:31
drewich
 
Fecha de Ingreso: abril-2010
Mensajes: 2
Antigüedad: 14 años, 7 meses
Puntos: 0
Comunicación Applet-Servlet EOFException

Hola! La verdad que ya había pasado por aquí buscando soluciones a algún que otro problema que me había encontrado con anterioridad, pero nunca me había hecho falta registrarme ya que siempre encontraba soluciones, pero con este problema no he encontrado nada que me sirva y eso que he ido por foros y foros....

El caso es que tengo un código (que funcionaba perfectamente) que hacía la comunicación entre un applet y un servlet, el caso es que necesitaba modificarlo porque quería mandar más información del servlet al applet, al hacer esos cambios me saltó la excepción de EOFException al intentar leer el inputStream y lo mejor de todo es que aunque vuelva a la versión que me funcionaba a la perfección ahora ya no me funciona sino que sigue lanzando la EOFException, así que alguien sabe cual es la razón de que pase esto? ya he agotado mis posibilidades la verdad...

Aquí les dejo el código para que puedan echar un vistazo y ver si encuentran algo que a mi se me haya pasado.

Esta es la parte del applet que hace la comunicación
Código:
	public ListasComponentesSeleccionables cargarListasComponentes( ) throws IOException, ClassNotFoundException {
		
		String serv = "/Desaladora/cargarListasComponentesApplet.do";
		String host = Principal.documentBase.getHost( );
		
		URL direccion = new URL( "http", host, 8080, serv );
		// Creamos la conexion con el servidor.
		URLConnection connection = direccion.openConnection( );
		
		connection.setDoInput( true ); // Permitimos datos de respuesta
		connection.setDoOutput( true ); // Vamos a enviar datos de salida
		connection.setUseCaches( false ); // Desactivamos cache por si realizamos varias comunicaciones
		
		/**
		 * Ahora indicamos en la cabecera de la peticion POST que tipos de datos viajan.
		 * Vamos a enviar un objeto al servidor asi que enviamos el nombre de su clase.
		 * Para poder enviar objetos, estos tienen que ser serializables, es decir,
		 * implementar la interfaz Serializable.
		 */
		connection.setRequestProperty( "Content-Type", "application/x-java-serialized-object" );
		
		/*Enviamos la peticion al servidor. Para eso hay que meter el objeto en el flujo de salida de la conexion */
		ObjectOutputStream output;
		output = new ObjectOutputStream( connection.getOutputStream( ) );
		
		output.writeObject( new Boolean(true) );
		
		output.flush( );
		output.close( );
		
		
		// En la siguiente linea es donde salta la excepcion
		ObjectInputStream input = new ObjectInputStream( connection.getInputStream( ) );
		ListasComponentesSeleccionables response = new ListasComponentesSeleccionables( );
		
		response = ( ListasComponentesSeleccionables ) input.readObject( );
		
		return response;
	}
Este es el servlet
Código:
public class CargarListasComponentesAppletAction extends Action {

	
public ActionForward execute(	ActionMapping mapping,
			                             	ActionForm form,
			                             	HttpServletRequest request,
			                             	HttpServletResponse response ) throws ServletException, IOException, Exception  {

		InitialContext context = new InitialContext();
		SensorManagerService sensor_service;
		ActuatorManagerService actuator_service;
		

		Globals.LOGGER_SECURITY.debug( "Entering ACTION 'CargarListasComponentesAppletAction'" );
		
		// establecemos el formato de la respuesta
		response.setContentType("application/x-java-serialized-object");
		
		try
		{
			// recuperamos el stream de entrada
			ObjectInputStream bufferentrada = new ObjectInputStream(request.getInputStream());
			
			// leemos el objeto enviado
			Boolean peticionOK = (Boolean)bufferentrada.readObject();
			
			// Configurarmos un Stream de Salida
			ObjectOutputStream buffersalida = new ObjectOutputStream(response.getOutputStream());
			
			// construimos el objeto a retornar
			sensor_service = ( SensorManagerService ) context.lookup( "desaladora/SensorManagerServiceBean/local" );
			ArrayList<AlarmConnectedSensorDTO> sensorList = sensor_service.findAllSensorsToAlarms();
			
			actuator_service = ( ActuatorManagerService ) context.lookup( "desaladora/ActuatorManagerServiceBean/local" );
			ArrayList<AlarmConnectedActuatorDTO> actuatorList = actuator_service.findAllActuatorsToAlarms();
			
			// escribimos los datos
			buffersalida.writeObject( crearListasSeleccionables(sensorList, actuatorList) );
			
			// y los enviamos
			buffersalida.flush();
		}
		catch(Exception e)
		{
			System.out.println("Error en la trasmision de datos");
		}
		
		return null;
	}
	
	private ListasComponentesSeleccionables crearListasSeleccionables(ArrayList<AlarmConnectedSensorDTO> sensorList, ArrayList<AlarmConnectedActuatorDTO> actuatorList) {

		Vector<Integer> vectorSensores = new Vector<Integer>();
		Vector<Integer> vectorActuadores = new Vector<Integer>();
		
		for(AlarmConnectedSensorDTO sensor : sensorList) {
			vectorSensores.add(sensor.getIdSensor( ));
		}
		for(AlarmConnectedActuatorDTO actuator : actuatorList) {
			vectorActuadores.add(actuator.getIdActuator( ));
		}
		ListasComponentesSeleccionables listasComponentesSeleccionables = new ListasComponentesSeleccionables(vectorSensores, vectorActuadores);
		
		return listasComponentesSeleccionables;
	}
	
}
Gracias por adelantado.