Como verificar se ainda existe fluxo de dados no outputStream() do Socket?

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);
    }