Problema com Performance em Chat com TCP

1 resposta
JaVinha1

Estou com o seguinte problema, o código do servidor q postei e o do cliente funcionam. Mas fica extremamente lento, e quanto mas clientes entram uma nova thread é criada com um loop infinito verificando se chegou uma nova mensagem e encaminha para todos os outros clientes, e se houver mensagens após 10 segundos são apagadas.
Quem puder dar uma dica, como melhorar isto, ou uma nova ideia para refazer tudo de uma maneira melhor...

public class Server {

	public static void main (String [] args)
	{
		try
		{
			ServerSocket servSock = new ServerSocket(3292);	
			
			ArrayList<Mensagem> mensagens = new ArrayList<Mensagem>();
			ThreadApagaMensagens a = new ThreadApagaMensagens(mensagens);
			a.start();
			
			while (true)
			{			
				Socket sock = servSock.accept();
			
				ThreadServidor t = new ThreadServidor(sock, mensagens);
				ThreadMensagens m = new ThreadMensagens(sock, mensagens);
				
				t.start();
				m.start();
			}
		}
		catch (Exception e)
		{
		}
		
	}
}
class ThreadServidor extends Thread
{
	private Socket sock;
	ArrayList<Mensagem> mensagens;
	public ThreadServidor(Socket s, ArrayList<Mensagem> m)
	{
		sock = s;
		mensagens = m;
	}
	public void run()
	{
		try
		{			
			InputStream entrada = sock.getInputStream();
			DataInputStream entradaStr = new DataInputStream(entrada);						
			OutputStream saida = sock.getOutputStream();
			DataOutputStream saidaStr = new DataOutputStream(saida);
			
			int opcao = entradaStr.readInt();
			
			LoginCadastro loginCadastro = new LoginCadastro(sock, mensagens);
			
			if(opcao == 0)
			{
				loginCadastro.Login();
			}
			else
			{
				loginCadastro.Cadastro();
			}
						
			//fecha a conexão
			sock.close();
		}
		catch(Exception e)
		{
		}		
	}
}

class ThreadMensagens extends Thread
{
	private Socket sock;
	ArrayList<Mensagem> mensagens;
	int tam = 0;
	public ThreadMensagens(Socket s, ArrayList<Mensagem> m)
	{
		sock = s;
		mensagens = m;
	}
	public void run()
	{
		while(true)
		{
			if(mensagens.size() > tam)
			{
				try
				{
					OutputStream saida = sock.getOutputStream();
					DataOutputStream saidaStr = new DataOutputStream(saida);
					
					saidaStr.writeInt(1);
					String mensagem = mensagens.get(0).getLogin() +"#"+
					mensagens.get(0).getNick() +"#"+
					mensagens.get(0).getHora().getHora() +"#"+
					mensagens.get(0).getHora().getMin() +"#"+
					mensagens.get(0).getTexto();
					saidaStr.writeUTF(mensagem);
					System.out.println("Mensagem enviada: "+ mensagens.get(0).getTexto());
				}
				catch(Exception e)
				{
				}			
				tam++;
			}
			if(mensagens.size() < tam)
			{
				tam--;
			}
		}
	}
}
class ThreadApagaMensagens extends Thread
{
	ArrayList<Mensagem> mensagens;
	int tam = 0;
	public ThreadApagaMensagens(ArrayList<Mensagem> m)
	{
		mensagens = m;
	}
	public void run()
	{
		while(true)
		{
			if(mensagens.size() > 0)
			{
				try {
					sleep(10000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				mensagens.remove(0);
			}
		}
	}
}

1 Resposta

Flavio_machine

Já tentou fazer com JMS ?

Criado 23 de janeiro de 2012
Ultima resposta 24 de jan. de 2012
Respostas 1
Participantes 2