Olá pessoal.
Estou implementando um sistema em Swing que faz acesso a outro sistema (Web) implementado com Servlets.
O acesso via Swing é feito utilizando URLConnection.
Faço requisições e recebo respostas normalmente como se estivesse utilizando um Browser.
Meu sistema Web sempre recebe parametros do tipo String, mas pode enviar respostas de tipos distintos.
Até então, observei que terei que lidar com no mínimo 3 tipos de objetos (String, ArrayList e byte[]).
Bem…como disse antes, os sistemas funcionam normalmente (enviando e recebendo), o problema é quando faço acessos consecutivos ao sistema web.
Testando separadamente, as requisições funcionam, porém, quando em uma situação mais real, eu “tomo” a seguinte excessão logo após o envio da segunda conexão com a web:
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2435)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1245)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
at AcessoCorporativo.submit(Acesso.java:54)
at Principal.main(Principal.java:25)
Classes implementadas abaixo (removi código que não achei necessário).
Classe de teste SWING:
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Principal{
public static void main(String[] args) {
try {
//Setando o SERVLET alvo
acesso.setServlet("ServletFacade");
//*************TESTANDO ENVIO DE UMA STRING SIMPLES****************
acesso.addParametros("fase", "string");
System.out.println(acesso.submit());
//*************TESTANDO ENVIO DE UMA LISTA DE OBJETOS**************
acesso.addParametros("fase", "lista");
ArrayList listaRetorno = (ArrayList) acesso.submit();
for(int i = 0; i < listaRetorno.size(); i++){
Map map = (HashMap) listaRetorno.get(i);
System.out.print(map.get("Nome") + " - ");
System.out.print(map.get("Valor") + " - ");
System.out.print(map.get("Boleano"));
System.out.println("");
}
//*************TESTANDO ENVIO DE UM ARQUIVO****************
acesso.addParametros("fase", "arquivo");
FileOutputStream file = new FileOutputStream("c:/hudson.zip");
byte[] array = (byte[])acesso.submit();
ByteArrayInputStream input = new ByteArrayInputStream(array);
int len;
while((len = input.read(new byte[16 * 1024])) != -1)
file.write(array, 0, len);
file.flush();
file.close();
input.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Classe de conexão com a WEB:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
public class Acesso {
private Map mapParametros = new HashMap();
private String servlet;
private static AcessoCorporativo instance;
private static String urlSafi;
private AcessoCorporativo(){}
public static AcessoCorporativo getInstance(UsuarioCorporativo usuarioCorporativo)throws IOException{
if(instance == null){
instance = new AcessoCorporativo();
Properties propriedades = new Properties();
InputStream inStream = AcessoCorporativo.class.getResourceAsStream("AcessoCorporativo.properties");
try {
propriedades.load(inStream);
} catch (IOException e) {
new IOException("Arquivo de propriedades não encontrado.");
}
urlSafi = propriedades.getProperty("urlSafi");
}
return instance;
}
public Object submit()throws Exception{
this.urlSafi = this.urlSafi.concat(this.servlet);
URL url = new URL(this.urlSafi);
URLConnection connection = url.openConnection();
ObjectInputStream in = new ObjectInputStream(connection.getInputStream());
Object retorno = in.readObject();
in.close();
return retorno;
}
public final void setServlet(String servlet){
this.servlet = servlet;
}
}
Classe Servlet:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.context.Context;
public class Servlet extends Controller {
/**
* Construtor que recebe a requisição e a resposta
* @param request requisição - HttpServletRequest
* @param response resposta - HttpServletResponse
*/
public ServletFacade(HttpServletRequest request, HttpServletResponse response) {
super(request, response);
}
public String exec(Context ctx) {
try {
ObjectOutputStream writer = new ObjectOutputStream(this.response.getOutputStream());
//*************TESTANDO ENVIO DE UMA STRING****************
if(this.bean.getFase().equals("string")){
writer.writeObject(String.valueOf("Retorno no tipo String!!!"));
}
if(this.bean.getFase().equals("lista")){
//*************TESTANDO ENVIO DE UMA LISTA DE OBJETOS****************
ArrayList lstTeste = new ArrayList();
boolean correto = true;
for(int i = 0; i < 50; i++){
Map map = new HashMap();
correto = !correto;
map.put("Nome", "Hudson de Paula " + i);
map.put("Valor", String.valueOf(i * 10000));
map.put("Boleano", Boolean.valueOf(correto));
lstTeste.add(map);
}
writer.writeObject(lstTeste);
}
if(this.bean.getFase().equals("arquivo")){
//*************TESTANDO ENVIO DE UM ARQUIVO****************
byte[] conteudo = this.buscarArquivoFTP(Criptografia.decripta("C0638BB9C6382F30DF785F315B3E6FBD009E314D24A7E1E5E995F1E29D519556660C7BEBB62A413F").trim());
writer.writeObject(conteudo);
}
writer.flush();
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
Alguem sabe onde estou vacilando??? 
[]'s