1
resposta

Cliente fecha depois do segundo input se eu nao colocar print

quando eu tento rodar o client eu coloco o primeiro input e dou enter depois quando eu coloco o segundo input e dou enter ele fecha e nem envia a request pro server `import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; import java.util.Scanner;

public class ClienteTarefas { public static void main(String[] args) throws Exception { Socket socket = new Socket("localhost", 12345);

    System.out.println("Conexao estabelecida");

    Thread threadEnviaComando = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                PrintStream saida = new PrintStream(socket.getOutputStream());

                Scanner teclado = new Scanner(System.in);
                while (teclado.hasNextLine()) {
                    String linha = teclado.nextLine();

// System.out.print(linha.trim()); if (linha.trim().equals("")) { System.out.println("linha " + linha); System.out.println(teclado.nextLine()); break; } saida.println(linha); } System.out.println("sai"); saida.close(); teclado.close(); } catch (Exception e) { throw new RuntimeException(e); }

        }
    });
    Thread threadRecebeResposta = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                System.out.println("recebendo dados do servidor");
                Scanner respostaServidor = new Scanner(socket.getInputStream());
                while (respostaServidor.hasNextLine()) {
                    String linha = respostaServidor.nextLine();
                    System.out.println(linha);
                }
                respostaServidor.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

        }
    });
    threadRecebeResposta.start();
    threadEnviaComando.start();

    threadEnviaComando.join();
    socket.close();

}

} `

import java.net.Socket;
import java.util.Scanner;

public class DistribuirTarefas implements Runnable{

    private Socket socket;

    public DistribuirTarefas(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {

        try{
        System.out.println("Distribuindo Tarefas para : " + socket);
            Scanner entradacliente = new Scanner(socket.getInputStream());
            while(entradacliente.hasNextLine()){
                String comando  = entradacliente.nextLine();
                System.out.println("estou imprimindo o comando  : " + comando);
            }
            entradacliente.close();
        } catch (Exception e){
            e.printStackTrace();
        }

    }
}
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ServidorTarefas {
    public static void main(String[] args) throws Exception {
        System.out.println("-------Rodando Servidor---------");
        ServerSocket servidor = new ServerSocket(12345);
        ExecutorService threadPool = Executors.newCachedThreadPool();

        while (true) {
            Socket socket = servidor.accept();
            System.out.println("Aceitando novo cliente na porta : " + socket.getPort());
            DistribuirTarefas distribuirTarefas = new DistribuirTarefas(socket);

            threadPool.execute(distribuirTarefas);

        }

    }
}
1 resposta

Olá Rafael, tudo bem?

Pelo código que você compartilhou, parece que o problema pode estar na condição do if dentro do while da Thread threadEnviaComando. Quando você digita o segundo input e dá enter, o programa verifica se a linha é vazia (linha.trim().equals("")). Se for vazia, ele imprime a próxima linha do Scanner, que pode não existir e acabar encerrando a Thread.

Uma solução seria adicionar um System.out.println() dentro do if, para que a próxima linha seja exibida e a Thread não seja encerrada. Ficaria assim:

if (linha.trim().equals("")) {
    System.out.println("linha  " + linha);
    System.out.println(teclado.nextLine());
    break;
}

Espero que isso ajude a resolver o problema. Qualquer dúvida, é só perguntar!

Espero ter ajudado e bons estudos!