Ajuda em aplicação de chat

4 respostas
J

Pessoal,

Não sei Java e tive que fazer um trabalho para a disciplina de redes.

Trata-se de um chat utilizando sockets, onde um cliente manda uma mensagem e o servidor distribui para todos os outros usuários. Mas só a primeira mensagem vai e volta, as subsequentes não são enviadas para os demais usuários.

Alguém pode me ajudar?

import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;
import sun.misc.Queue;

public class TCPServer extends Thread {

    private static Queue filaClientes;
    private Socket connection;

    public static void main(String argv[]) throws Exception {

        filaClientes = new Queue();

        // cria socket de comunicação com os clientes na porta 6789
        ServerSocket welcomeSocket = new ServerSocket(6789);
        // espera msg de algum cliente e trata
        while (true) {
            // espera conexão de algum cliente
            Socket connectionSocket = welcomeSocket.accept();

            Thread thread = new TCPServer(connectionSocket);
            thread.start();
        }
    }

    public TCPServer(Socket socket)
    {
        connection = socket;
    }

    public void run()
    {
        try
        {
            // cria streams de entrada e saida com o cliente que chegou
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            PrintStream outToClient = new PrintStream(connection.getOutputStream());

            filaClientes.enqueue(outToClient);

            String linha = inFromClient.readLine();
            String texto = linha.substring(linha.indexOf("#")+1);

            //Lê as mensagens do cliente recém conectado em loop e envia para todos os usuários
            while (texto != null && !texto.equals(""))
            {
                try
                {
                    Queue filaEnvio = filaClientes;

                    while(!filaEnvio.isEmpty())
                    {
                        PrintStream out = (PrintStream) filaEnvio.dequeue();

                        //Não envia para o usuário atual
                        if (out != outToClient)
                        {
                            out.println("Mensagem: " + texto);

                            //Capturo a hora de envio para exibir a diferença

                            long currentTime = System.currentTimeMillis();
                            SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

                            dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
                            long previousTime = Long.parseLong(linha.substring(0,linha.indexOf("#")));

                            long elapsed = currentTime-previousTime;

                            out.println("Tempo: " + dateFormat.format(new Date(elapsed)));
                        }
                    }
                }
                catch (InterruptedException exception)
                {

                }
            }
            
        }
        catch(IOException exception)
        {

        }
    }
}
import java.io.*; // classes para input e output streams
import java.net.*; // classes para socket, serversocket e clientsocket

public class TCPClient extends Thread {

    private static Boolean finalizar = false;
    private Socket connection;

    public static void main(String argv[]) throws Exception {

        try {
            // cria o socket de acesso ao server hostname na porta 6789
            Socket clientSocket = new Socket("127.0.0.1", 6789);

            PrintStream out = new PrintStream(clientSocket.getOutputStream());

            Thread thread = new TCPClient(clientSocket);
            thread.start();

            BufferedReader inFromServer =
                    new BufferedReader(new InputStreamReader(
                    System.in));

            String sentence;
            while (true) {
                sentence = inFromServer.readLine();

                if (finalizar) {
                    return;
                }

                long startTime = System.currentTimeMillis();
                out.println(startTime + "#" + sentence);
            }
        } catch (IOException exception) {
        }

        finalizar = true;
    }

    public TCPClient(Socket socket)
    {
        connection = socket;
    }

    public void run()
    {
        try
        {
            BufferedReader inFromServer =
                    new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));

            String texto;

            while (true)
            {
                texto = inFromServer.readLine();

                if (texto == null)
                {
                    System.out.println("Conexão finalizada");
                    break;
                }
                else
                {
                    System.out.println("\n" + texto + "\n");
                }
            }

            
        }
        catch (IOException exception)
        {

        }
        finalizar = true;
    }
}

Desculpa passar um código desse tamanho, mas não estou encontrando o erro. Se conseguir aqui aviso vocês.

Valeu!

4 Respostas

romarcio

Posta o erro que está dando, fica mais fácil para a galera encontra-lo no código.

renamed

Cara, chat em java deve ta cheio de exemplo feito no google hehehe

Mas posta ai o erro que fica mais facil verificarmos :smiley:

J

O problema é esse galera, não dá mensagem de erro.

As mensagens param de ser enviadas após a primeira. Tenho que executar debugando, mas o debug do NetBeans não é muito bacana.

romarcio
Juliano.net:
import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;
import sun.misc.Queue;

public class TCPServer extends Thread {

    private static Queue filaClientes;
    private Socket connection;

    public static void main(String argv[]) throws Exception {

        filaClientes = new Queue();

        // cria socket de comunicação com os clientes na porta 6789
        ServerSocket welcomeSocket = new ServerSocket(6789);
        // espera msg de algum cliente e trata
        while (true) {
            // espera conexão de algum cliente
            Socket connectionSocket = welcomeSocket.accept();

            /** cria uma nova thread para tratar essa conexão */
            TCPServer tcp = new TCPServer(connectionSocket); 
            Thread thread = new TCPServer(tcp);
            thread.start();
        }
    }

Da uma olhada na alteração que fiz na linha 23-24, da uma testada assim.

Criado 12 de dezembro de 2009
Ultima resposta 14 de dez. de 2009
Respostas 4
Participantes 3