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.
Como verificar se ainda existe fluxo de dados no outputStream() do Socket?
2 Respostas
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);
}