Socket multi cliente

Olá pessoal, estava vendo algumas coisas de socket para fazer um novo modulo no sistema aqui da empresa e peguei uns tutoriais, mas ele mostra fazer um servidor e UM cliente, ai surgiu as dúvidas:

- Como fazer mais de um cliente (ilimitado)
- Como fazer a conexão de um cliente para outro como se fosse um comunicador
- Como fazer o cliente saber quais outros clientes estão conectado

Alguém ai pode me explicar ?
Valeu

Um servidor, por natureza, é multi-cliente. Quando você escreve o lado servidor da aplicação, você deve abrir um socket para escutar requisições de cliente. É a famosa porta TCP. Quando um cliente pede para estabelecer uma comunicação, uma nova porta é aberta para realizar a comunicação de fato, liberando a porta original para atender novas requisições. A sua aplicação pode limitar o número de clientes atendidos, mas o número de conexões pode (e geralmente é) por outros mecanismos como o SO, firewall, etc.

Uma comunicação cliente-cliente é, na verdade uma comunicação cliente-servidor de 2 vias. Ou seja, um cliente desse tipo pode tanto pedir por conexões quanto ouvir por pedidos de comunicação. Em termos de socket, cada um deve ter um server socket e um client socket. Não é possível estabelecer uma conexão entre dois sockets clientes.

A informação sobre quais clientes estão conectados devem ser centralizadas no servidor.

Agora, é fato que desenvolver uma aplicação de rede conhecendo apenas a API de sockets é muito difícil. A API é apenas um facilitador para implementar esse tipo de aplicação. Você precisa conhecer muito bem protocolos de rede, pelo menos protocolos de aplicação, transporte e rede, para que você tome decisões de projeto corretas.

[quote=rmendes08]Um servidor, por natureza, é multi-cliente. Quando você escreve o lado servidor da aplicação, você deve abrir um socket para escutar requisições de cliente. É a famosa porta TCP. Quando um cliente pede para estabelecer uma comunicação, uma nova porta é aberta para realizar a comunicação de fato, liberando a porta original para atender novas requisições. A sua aplicação pode limitar o número de clientes atendidos, mas o número de conexões pode (e geralmente é) por outros mecanismos como o SO, firewall, etc.

Uma comunicação cliente-cliente é, na verdade uma comunicação cliente-servidor de 2 vias. Ou seja, um cliente desse tipo pode tanto pedir por conexões quanto ouvir por pedidos de comunicação. Em termos de socket, cada um deve ter um server socket e um client socket. Não é possível estabelecer uma conexão entre dois sockets clientes.

A informação sobre quais clientes estão conectados devem ser centralizadas no servidor.

Agora, é fato que desenvolver uma aplicação de rede conhecendo apenas a API de sockets é muito difícil. A API é apenas um facilitador para implementar esse tipo de aplicação. Você precisa conhecer muito bem protocolos de rede, pelo menos protocolos de aplicação, transporte e rede, para que você tome decisões de projeto corretas.[/quote]

mas como o criar vários clientes no servidor ? e como gerenciar a partir do servidor.accept() ?

Você cria uma Thread por cliente:

http://download.oracle.com/javase/tutorial/networking/sockets/clientServer.html#later

[quote=rmendes08]Você cria uma Thread por cliente:

http://download.oracle.com/javase/tutorial/networking/sockets/clientServer.html#later[/quote]
Consegui, achei um tutorial que explica, mas como eu faço para o servidor saber que um cliente quer falar com outro ?

É relativamente simples, o servidor tem que passar pro cliente A o IP do cliente B. Daí o cliente A tem que pedir uma conexão entre o cliente B. Uma outra opção é o servidor intermediar a conversa. O servidor mantêm as duas conexões, recebe a mensagem de A e envia para B. Pura estrutura de dados. A questão é que nesse ponto a API de sockets não vai te ajudar muito, porque você já entra na alçada da camada de aplicação. A API de sockets te oferece uma interface para a camada de transporte.

mas como fazer o cliente informar ao servidor que o mesmo quer conversar um determinado cliente ?

Cara, isso já faz parte do protocolo da sua aplicação. Você tem que enviar essa informação através do socket. É isso que você precisa entender, a não ser que você encontre algum protocolo pronto, você precisa desenvolver o seu, a API não vai te oferecer essa funcionalidade.