Eu estou fazendo um projeto de servidor que precisa trocar vários objetos durante a vida útil do Socket. Primeiro esbarrei no problema de que o ObjectOutputStream().writeObject(); enviava o objeto só uma vez. Depois que ele era chamado novamente com um novo objeto, ele enviava o mesmo objeto antigo. A única coisa que resolveu isso foi dar um .reset() no ObjectOutputStream. Só que agora apareceu outro problema: Muitas vezes o código no servidor chegava no “reset()” antes do inputStream do cliente terminar de receber o fluxo de dados. Eu não sei como resolver isso, não parece ter nenhum método que verifica se ainda existe fluxo.
O que você está dizendo não faz sentido, a não ser que você sobrescreveu os métodos especiais de serialização fazendo algo diferente.
Posta o código do seu server e seu client.
Eu tive o mesmo problema desse cara e assim como ele, resolvi dando reset(); no outputStream();. Acontecia isso mesmo, eu enviava o objeto uma vez, depois enviava novamente um objeto diferente e ele enviava o mesmo objeto antigo. Nem flush() resolvia. Mas agora as vezes da erro de (socketException: Connection reset). Nem sei se é o reset() mesmo que causa isso, até porque nem sempre acontece. Não sei se o output.write() espera o input.read() do cliente terminar de ler para o código seguir ou não, é a primeira vez que mexo com sockets;
O código ainda não está pronto, tem muita coisa que não terminei de fazer.
Trecho do cliente:
try {
client = new Socket("192.168.1.2", 12000);
client.setTcpNoDelay(true);
output = new ObjectOutputStream(client.getOutputStream());
input = new ObjectInputStream(client.getInputStream());
System.out.println("Digite um caminho de arquivo ou diretório no servidor: ");
fileName = scan.nextLine();
System.out.println("Você quer listar ou baixar? L/B");
requestType = scan.nextLine().toUpperCase();
//Criando e configurando a requisição
request = new Requisicao();
request.setRequestContent(fileName);
if(requestType.contains("L")){
request.setRequestCode(Requisicao.LISTFILES_REQUEST);
//Enviando requisição
writeObject(output, request);
//Esperando a resposta
response = (Resposta) input.readObject();
if(response.getResponseCode()==Resposta.FILE_EXISTS){
System.out.println("Arquivo existe!!");
System.out.println("");
System.out.println(response.getResponseContent());
}else if(response.getResponseCode()==Resposta.FILE_NOT_FOUND){
System.out.println("Arquivo não encontrado :(");
}
}else{
request.setRequestCode(Requisicao.FILE_REQUEST);
//Enviando requisição
writeObject(output, request);
output.reset();
//Esperando a resposta
client.getOutputStream().flush();
response = (Resposta) input.readObject();
if(response.getResponseCode()==Resposta.FILE_EXISTS){
//Criando o arquivo local;
File f = new File("C:/Users/Gabriel Alves/Desktop/File request/"+response.getFile().getName());
f.setLastModified(response.getFile().lastModified());
f.createNewFile();
OutputStream out = new FileOutputStream(f);
cleanRequest(request);
request.setRequestCode(Requisicao.FILECONTENT_REQUEST);
System.out.println("Enviando requisicao final");
writeObject(output, request);
output.reset();
System.out.println("Enviado!");
//Primeira leitura
response = (Resposta) input.readObject();
System.out.println("Resposta recebida");
while(response.getResponseCode()==Resposta.CONTENT_AVAILABLE){
out.write(response.getContent(), 0, response.getLenBuffer());
writeObject(output, request);
response = (Resposta) input.readObject();
}
out.close();
}
}
input.close();
output.close();
client.close();
} catch (IOException | ClassNotFoundException ex) {
Logger.getLogger(AndroidProbeClient.class.getName()).log(Level.SEVERE, null, ex);
}
private static void cleanRequest(Requisicao request){
request.setRequestCode(Requisicao.NOP);
request.setRequestContent(null);
}
private static void writeObject(ObjectOutputStream output, Object obj) throws IOException {
output.reset();
output.writeObject(obj);
}