Limitar sockets conectados ao server

13 respostas
dsystem

Boa tarde pessoal,

Eu estou desenvolvendo um Chat básico com socket e eu gostaria de saber como faço para limitar quantos usuários se conectarão ao servidor.

A idéia do meu Chat é :
1 - O servidor só poderá ter 6 usuários conectados a ele.
2 - A comunicação Cliente/Cliente deve ser feita somente entre dois clientes por vez, ou seja, eu vejo a lista de todos os usuários que estão on line e mando uma requisição para o usuário que eu quero conversar… Isso eu consegui fazer, o problema é que não consegui fazer essas limitações.

Alguem poderia me dar um ajuda?

Outra coisa é o seguinte, como eu disse acima, o usuário verifica a lista dos outros usuários on line. Eu coloquei essa lista no servidor, assim que um usuário se conecta, seus dados vai para uma lista. Essa lista tem que ser mostrada ao cliente sempre que ele apertar um button… Como que eu consigo mostrar essa lista que está no servidor para o usuário?

Desculpa tantas perguntas pessoal… Mas é que realmente não encontrei algo que me ajudasse

Desde já agradeço!

13 Respostas

fantomas

Oi dsystem,

Se entendi bem o que vc está querendo é o seguinte:

Uma idéia é quando o usuário se conectar ele tem que enviar uma identificação (igual a um login) essa identificação vai para sua lista de usuários no servidor. Esta parte entendi que vc já fêz, a diferença é que antes de incluir o usuário na lista vc tem verificar o número de usuários presentes na lista, se a condição não for satisfeita vc desvia o fluxo para ignorar a conexão. Ao ignorar a conexão seria interessante avisar o usuario sobre o porque da conexão negada.

flws

dsystem

Hum entendi fantomas.

Mas esse desvio que você disse, como eu posso tratar ele?

fantomas

Ao receber a conexão do usuário, antes de qualquer coisa, vc percorre a lista no servidor (comparando os identificadores - login) para se certificar de sua existencia.

Se não existir vc inclui o usuario na lista caso contrário você escreve no socket um dado (pode ser um código) que informa que a conexão não foi possivel por causa do número de usuários conectados. Pode ser apenas uma mensagem também - vc estabelece o protocolo de conversação.

A verificação na lista pode ser feita com uma declaração while ou for ou utilizando o método contains da lista; detalhe: para utilizar o método contains vc precisa sobreescrever os métodos hash e equals do objeto ref. ao usuário incluido na lista.

flws

dizanorton

já tentou:

int numero_de_clientes=0;
while(numero_de_clientes<=6){
numero_de_clientes++; //incrementa o seu valor para cada cliente que se conecta
ss.accept(); //o socket fica a espera de um novo cliente
}
dsystem

Então dizanorton…

Eu tentei fazer assim

int numeroPossivel = 2;
 int numeroCliente = 0;

        while (numeroCliente <= numeroPossivel) {
            if (!encerrar) {
                numeroCliente++;
                cliente = servidor.accept();
                    
                

                String msg = receive(cliente);
                String lis = listaIps.toString();
                if (listaIps.contains(msg)) {
                    String returno = "Usuário já existe";
                    send(cliente, returno);
                } else {
                    listaIps.add(msg);
                    send(cliente, lis);
                }

                System.out.println("Lis" + lis);
                System.out.println((new StringBuilder()).append("NOva conex43o com ").append(cliente.getInetAddress().getHostAddress()).toString());

                cliente.close();

            }
            if (numeroCliente > numeroPossivel) {
                send(cliente, "Estorou");
            }



        }

mas quando ele ultrapassa o numero… Ele não mostra msg para o usuário que tenta se conectar Na vdd, ele deixa se conectar…

fantomas

Dá uma olhada nas modificações que fiz pra ver se atende.

int numeroPossivel = 2;

while (!encerrar) {
       
     cliente = servidor.accept();
                
     String msg = receive(cliente);
            
     String lis = listaIps.toString();
           
     if (listaIps.contains(msg)) {
         send(cliente, "Usuário já existe");
     } else {
      	if( listaIps.size() < numeroPossivel ) {
            listaIps.add(msg);
            send(cliente, lis);
        } else {
            send(cliente, "Estorou");
        }
     }

     System.out.println("Lis" + lis);
     System.out.println((new StringBuilder()).append("NOva conex43o com ").append(cliente.getInetAddress().getHostAddress()).toString());

     cliente.close();
}

flws

dsystem

Então fantomas…

Ele até entra no else, não coloca o cliente na lista mas… permite que ele se conecte ao servidor…
:frowning:

Estou fazendo uns testes aqui pra ver se eu consigo… Outra coisa a minha listaIps do lado do servidor fica certinha, a cada vez que eu conecto, ele salva na lista…Agr…Qdo eu vou chamar no cliente, só aparece o primeiro que se conectou,vc sabe me dizer pq?

NO cliente está assim, na hora que faço a conexão ele já me traz a lista

String msg = c.receive(cliente);
            txtArea.setText(msg);

Você sabe me dizer se há algum erro?

fantomas
  1. Temos que pensar sobre o que quer dizer “conectar ao servidor”. Poderia-se admitir as seguintes idéias sobre o usuário estar conectado.

a) O usuário para ser considerado conectado deveria acessar o servidor e conseguir ser incluido na lista de usuários.
b) O usuário para ser considerado conectado deveria apenas conseguir acessar o servidor, ou seja, atingir a linha onde consta o accept (cliente = servidor.accept()) mesmo não sendo incluido na lista de usuários.

Baseado nestas duas idéias é que vc irá melhorar o bloqueio do usuário no servidor.

  1. Sobre o número de usuários que aparecem no lado client.
    Vc já verificou com o debugger o conteúdo da variável msg? Apartir do conteúdo vc irá perceber se o problema está no lado server ou no lado client (txtArea). Por ex. se o conteúdo da variável msg conter apenas um usuário certamente vc terá que explorar a conteúdo da lista no server.

flws

dsystem

Então fantomas

Olha só que engraçado…Vê se consegue me explicar isso…rsrs

Eu consegui fazer ele aparecer todos da lista, PORÉM, só aparece correto se eu coloca assim

System.out.println(i);

Se eu coloco

txtArea.setText(i);

ele só me retorna o ultimo inserido
Sabe me dizer o pq?

Quanto a questão de conexão, já consegui arrumar uma forma… Pq o que ele não poderia é deixar que o cara que não estava na lista se comunicar com os outros

:slight_smile:

fantomas

Que bom que consegui resolver o problema da conexão.

Tente utilizar o método append vamos ver o que acontece.

P.S Do jeito que vc está fazendo acho que irá aparecer uma única string no text area ex. [ana, tereza, solange, kelly] para aparecer em forma de lista vc terá que montar a string de forma diferente lá no servidor, vc terá que adicionar um \n após cada nome. Ficará assim:
ana
tereza
solange
kelly

flws

dsystem

Então

Eu fiz isso mas tambem… nada, ele só aparece o ultimo da lista

Creio que seja algo do textArea msm neh?

fantomas

O resultado esperado, partindo da maneira que vc fêz, seria igual ao teste abaixo.

public class Test {
	
	public static void main(String[] args) {
		
		List<String> nameslst = new ArrayList<String>(0);
		
		nameslst.add("Ana");
		nameslst.add("Maria");
		nameslst.add("Sonia");
		nameslst.add("Angela");
		
		JFrame frame = new JFrame("Teste");
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JTextArea txtArea = new JTextArea();
		
		txtArea.setText(nameslst.toString());
		
		frame.getContentPane().add(txtArea, BorderLayout.CENTER);
		frame.setSize(200, 400);
		
		frame.setVisible(true);
		
	}

}

É assim que vc está vendo o resultado?

flws

dsystem

Consegui

Na vdd o que eu tinha que fazer era usar o append…
Aff

Mas ai fiz um jList pra ficar mais bonito :slight_smile:

Oh, posso te pedir mais uma ajuda?rsrs

Então, essa lista será atualizada a cada vez que um usuário se conectar no servidor certo?

Aí assim… eu tenho essa jList e o que eu precisava era que a cada vez que o usuário solicitasse essa lista fosse atualizada…

mas nao consigo, pq não sei como devo fazer isso no lado do servidor… Será q vc saberia me dá uma luz?

Criado 2 de dezembro de 2010
Ultima resposta 3 de dez. de 2010
Respostas 13
Participantes 3