Socket does not send message to correct clients

1

When typed /msg nome mensagem should send this message to nome , but he will send it to whoever typed

Manager.java

private Socket cliente;
public static String nomeCliente;
private static BufferedReader leitor;
private static PrintWriter escritor;
private static final HashMap<String, Gerenciador> clientes = new HashMap<String, Gerenciador>();

public Gerenciador(Socket cliente)
{
    this.cliente = cliente;
    start();
}

public void run()
{
    try
    {
        leitor = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
        escritor = new PrintWriter(cliente.getOutputStream(), true);
        escritor.println("Qual seu nome ??");
        String mensagem = leitor.readLine();
        nomeCliente = mensagem;
        clientes.put(this.nomeCliente, this);

        clientes.get(nomeCliente).getEscritor().println("Bem vindo ao ChatP2P " + nomeCliente);
        while(true)
        {
            mensagem = leitor.readLine();
            mensagem.replaceAll("\s+"," ");

            if(mensagem.startsWith("/"))
            {   
                String[] args = getComandos(mensagem.replace("/", "")); 

                if(args.length == 3)
                {
                    String arg1 = args[0];
                    String arg2 = args[1];
                    String arg3 = args[2];

                    if(arg1.equalsIgnoreCase("msg"))
                    {
                        if(clientes.get(arg2) != null)
                        {
                            clientes.get(arg2).getEscritor().println(nomeCliente + ": " + arg3);

                            /*chatAtual.put(arg2, clientes.get(nomeCliente));
                            chatAtual.put(nomeCliente, clientes.get(arg2));
                            clientes.get(nomeCliente).getEscritor().println("Você iniciou um CHAT com " + arg2);
                            clientes.get(arg2).getEscritor().println(nomeCliente + " iniciou um CHAT com você");*/
                        }   
                        else
                        {
                            clientes.get(nomeCliente).getEscritor().println(arg2 + " não existe");
                        }
                    }   
                }
            }
        }
    }
    catch(IOException e)
    {
        System.err.println("O cliente fechou a conexão terminada");
        e.printStackTrace();
    }
}
private static String[] getComandos(String mensagem)
{
    mensagem.replace("/", "");
    return mensagem.split(" ");
}

public PrintWriter getEscritor() 
{
    return escritor;
}
public String getNomeCliente() {
    return nomeCliente;
}
public BufferedReader getLeitor() 
{
    return leitor;
}

Server.java

    public static void main(String[] args)
{
    ServerSocket servidor = null;

    try 
    {   
        servidor = new ServerSocket(9999);
        System.out.println("Servidor iniciou");

        while(true)
        {
            Socket cliente = servidor.accept();
            System.out.println("Um novo CLIENTE se conectou ao servidor");
            new Gerenciador(cliente);
        }
    } 
    catch (IOException e) 
    {
        System.err.println("A porta não esta disponivel");
        try 
        {
            if(servidor != null)
            {
                servidor.close();
            }
        } 
        catch (IOException e1) 
        {
            e1.printStackTrace();
        }
        e.printStackTrace();
    }
}

Client.java

    public static void main(String[] args) 
{
    try 
    {
        @SuppressWarnings("resource")
        final Socket cliente = new Socket("127.0.0.1", 9999);

        new Thread()
        {
            public void run()
            {
                try
                {
                    BufferedReader leitor = new BufferedReader(new InputStreamReader(cliente.getInputStream()));

                    while(true)
                    {
                        String mensagem = leitor.readLine();
                        System.out.println(mensagem);
                    }
                }
                catch (IOException e)
                {
                    System.err.println("Impossivel ler a mensagem do servidor");
                    e.printStackTrace();
                    System.exit(0);
                }
            }
        }.start();

        PrintWriter escritor = new PrintWriter(cliente.getOutputStream(), true);
        BufferedReader leitorTerminal = new BufferedReader(new InputStreamReader(System.in));
        String mensagemTerminal = "";
        while((mensagemTerminal = leitorTerminal.readLine()) != null)
        {
            escritor.println(mensagemTerminal);

            if(mensagemTerminal.equalsIgnoreCase("/sair"))
            {

                System.exit(0);
            }                   
        } 
    }
    catch (UnknownHostException e) 
    {
        System.err.println("O endereço é invalido");
        e.printStackTrace();
    } 
    catch (IOException e) 
    {
        System.err.println("O servidor esta fora do ar");
        e.printStackTrace();
    }
}
    
asked by anonymous 04.08.2015 / 02:49

1 answer

1

I debugged the code and realized that in the Manager class there are some static attributes.

public static String nomeCliente;
private static BufferedReader leitor;
private static PrintWriter escritor;

None of this should be static, since it will always be replaced by the last one to register with the server.

    
04.08.2015 / 04:01