[RESOLVIDO] Socket em java

Pessoal alguem tem ideia como faço tipo um chat somente com SOCKET nao posso usar theed, pois um server deve controlar esses usuarios conectados e essesusuarios devem se conectar entre si, mais um usuario nao pode ser conectado por 2 maquinas ou seja tem que ser um para um, pois nao posso usar theed nesse caso, ja tenho a implementacao de servidor/cliente, ouseja as duas classes que uma conversar com a outra, mais preciso fazer esse outro desafio…
Alguem tem ideiaou entendeu o que falei???
essecodigo foi o que ja fiz da primeira parte,

`public class Cliente {

 public static void main(String[] args) throws Exception {
     System.out.println("Iniciando cliente.");
     System.out.println("Iniciando conexao com o servidor.");
     Socket socket = new Socket("192.168.0.110", 5000);
     System.out.println("Conexao estabelecida.");
     
     InputStream input = socket.getInputStream();
    OutputStream output = socket.getOutputStream();
    
    BufferedReader in = new BufferedReader(new InputStreamReader(input));
    PrintStream out = new PrintStream(output);
    
     Scanner scanner = new Scanner(System.in);
     
     while (true){
         System.out.println("digite uma mensagem: ");
         String mensagem = scanner.nextLine();
         
         out.println(mensagem);
         
         if ("FIM".equals(mensagem)){
             break;
         }
         mensagem = in.readLine();
         
         System.out.println("Mensagem recebida do servidor: " + 
                 mensagem);
     }
     
     System.out.println("Encerrando conexao.");
     
     in.close();
     
     out.close();
     
     socket.close();
     
    
     
 }

}`

servidor

`public class Servidor {

/**
 * @param args the command line arguments
 */


public static void main(String[] args) throws IOException {
    // TODO code application logic here
    
    //System.out.println("-----------------------------------");
   
    System.out.println("Iniciando Servidor.");
    ServerSocket server = new ServerSocket(5000);
    System.out.println("Aguardando conexao.");
    Socket socket = server.accept();
    System.out.println("conexão estabelecida com sucesso.");
    InputStream input = socket.getInputStream();
    OutputStream output = socket.getOutputStream();
    
    BufferedReader in = new BufferedReader(new InputStreamReader(input));
    PrintStream out = new PrintStream(output);
    
    while(true){
        String mensagem = in.readLine();
        
        System.out.println("Mensagem recebida do cliente[" + 
                socket.getInetAddress().getHostName() + "]:" + 
                mensagem);
        
        if ("Fim".equals(mensagem)){
            break;
        }
        out.println(mensagem);
    }
    System.out.println("Encerrando conexao.");
    
    in.close();
    
    out.close();
    
    socket.close();
    
    System.out.println("Encerrando servidor");
    
    server.close();
    
}

}

`

Para aceitar mais de um usuário usando TCP vc precisa usar thread no servidor senão apenas um usuário poderá conectar.

eu entendo, mais posso usar UDP nesse caso, pq nao posso usar theeds entao meu server so lista os usuarios conectados, quandoum ussuario se conecta com outro, nem um outro mais pode se conectar a ele…vc ta entendendo?

chat é TCP.
UDP é só pra streaming de audio ou video

E se quiser fazer correto, como a maioria dos mensageiros, podendo trocar msgs com várias pessoas, vai ter que usar threads sim.

Não necessariamente. Da pra fazer com non-blocking I/O, usando selectors e channels.

bom o que o meu professor falou épara fazer sem usar theeds e ele disse que tem com, a proxima parte que irá comecar ver theeds

Para fazer um servidor em Java com apenas uma thread gerenciar vários clientes, vejo duas opções:

  1. non-blocking I/O. Não é um conceito trivial, principalmente pra alguém que está aprendendo o básico, mas nada que uma pesquisa dedicada não resolva;
  2. definir timeouts nas operações que bloqueiam a thread, com métodos como o setSoTimeout.

Então oq ele está qerendo n é multicliente. É só conectar cliente e servidor e fazer a troca de msgs

Vamos la

I/O não bloqueante sem threads é chatinho, mas não é impossivel. uma das formas é fazer multiplexing de I/O - eu fiz um artigo sobre isso em Perl anos atras cujos conceitos a gente pode usar aqui também:

http://sao-paulo.pm.org/pub/i-o-nao-bloqueante-com-io-select-na-unha

basicamente:

vc vai ter um loop principal onde vc tenta ler todos os sockets (o que inclui gerenciar novas conexões), depois vai escrever em todos os sockets.

com I/O não bloqueante, vc pode saber quais sockets estão prontos para leitura dentro de um intervalo de tempo maximo ( timeout ). o mesmo para escrita. o conceito por traz é o conceito de select

basicamente vc pergunta:

  • quem esta pronto para ler?

    • o socket principal ( servidor ) tem um cara novo
      • vc aceita e coloca esse cara em uma coleção
    • um outro cara esta pronto pois ele escreveu a mensagem “oi q tc?”
      • vc le e adiciona isso em um buffer
  • quem esta pronto para escrever?

    • um carinha esta pronto
      • vc despeja os buffer nele

isso para uma sala de chat funciona super bem.

o que java te oferece?

perceba que o conceito é o mesmo, a API vai ser diferente.