Estou estudando a API sockets e já encontrei alguns tutorias ensinando a montar um server e um client simples que interagem entre si…
Só que agora necessito de uma aplicação servidor que aceite multiplas conexões e não somente uma que é o caso da maioria dos exemplos que tenho aqui…
Alguém tem um tutorial com o conceito para desenvolvimento de um server para multiplas conexões???
Queria ter uma noção das melhores praticas de projeto nesse tipo de desenvolvimento além de alguns exemplos em java para tirar uma noção mais prática também.
Qual a finalidade da aplicação ?
Acesso a banco ?
Troca de mensagens ?
Acesso a serviços ?
Para aceitar multiplas conexões acho que a saida é trabalhar com Thread.
Criar uma lógia no servidor que à cada conexão solicitada pelos clientes ele gere uma Thread para atender esse cliente e volte a esperar uma nova conexão.
Um abraço.
T
Titosca
Zeed01:
Bom dia colegas !
Titôsca:
Qual a finalidade da aplicação ?
Acesso a banco ?
Troca de mensagens ?
Acesso a serviços ?
Para aceitar multiplas conexões acho que a saida é trabalhar com Thread.
Criar uma lógia no servidor que à cada conexão solicitada pelos clientes ele gere uma Thread para atender esse cliente e volte a esperar uma nova conexão.
Um abraço.
Certo mas eu queria saber se tipo!
A cada client eu teria que abrir um socket exclusivo para thread que atenderia ele??
A aplicação é pra finalidade de estudos né…
Seria um chat estilo MESSENGEr, bem basico so pra aprender o conceito de um server que aceita multiplos clientes e tudo!
Agora estou em dúvidas com relação a isso ai se é preciso abrir um socket para cada thread que comunica com o processo do cliente ou tem uma forma mais elegante de se fazer isso…
andre_udi
ola amigo,
vc poderia, por exemplo, tratar a comunicacao com
cada cliente q se conecta no servidor em uma thread por exemplo.
entretanto, vc precisa pensar em qual solucao eh melhor, de acordo com a realidade do seu problema:
- threads ou
- processos
pra isso, vc precisa levar em consideracao
o quao ‘leve’ sera seu processamento, e o numero de conexoes esperadas.
andre_udi
ola amigo,
a chamada do metodo accept() te retorna o canal de comunicacao pra cada cliente.
bastaria vc passa-lo para a thread q ira tratar com o cliente, por exemplo.
abraços
T
Titosca
andre_udi:
ola amigo,
a chamada do metodo accept() te retorna o canal de comunicacao pra cada cliente.
bastaria vc passa-lo para a thread q ira tratar com o cliente, por exemplo.
abraços
Poderia me explanar melhor isto!
Acho q no caso de um chat poderiamos usar processos mesmos né??
os clients conectam e teria um processo que ficaria lendo os streams e atualizando o chat?
andre_udi
ola amigo,
olha, neste caso, nao sei se processos seriam uma boa alternativa, pois
vc precisa se preocupar com a sincornizacao destes dados.
Com diversas threads na mesma aplicacao, imagino q seria mais facil
controlar esse sincronismo, e nao ficaria pesado.
certa vez participei da implementacao de um servidor de jogos em C.
optamos por processos, e utilizamos mto a estrutura de processos e
arquivos do linux. Acho no seu caso, threads seriam + interessante e + facil de implementar.
abraços
D
Daniel.F
Alguem não quer me mandar uma implementação de um socket trocando mensagem pegando o texto de um
JTextArea ,so achei na internet com arquivo ,se alguem poder me ajudar eu agradeço.
andre_udi
ola daniel,
via sockets, sao transmitidos bytes.
nao importa a origem destes bystes.
basta vc obter o texto da JTextArea e enviar pelo socket, como se fosse retirado de um arquivo.
abraços
Zeed01
Bom dia colegas !
Titôsca:
Vê se esse pedaço de código te ajuda:
importjava.io.*;importjava.net.*;importjava.util.ArrayList;importjava.util.List;publicclassServerextendsThread{privateSocketcliente=null;privateBufferedReaderentradaCliente;privatePrintWritersaidaCliente;publicServer(Socketcliente){this.cliente=cliente;try{entradaCliente=newBufferedReader(newInputStreamReader(cliente.getInputStream()));saidaCliente=newPrintWriter(cliente.getOutputStream(),true);}catch(IOExceptione){e.printStackTrace();}}publicvoidrun(){//aqui define o que o Server faz com as entradas do cliente.}publicstaticvoidmain(String[]args){inti=1;try{ServerSockets=newServerSocket(1234);while(true){Serverserver=newServer(s.accept());server.start();}}}catch(Exceptione){}}
[]s
T
Titosca
andre_udi:
ola daniel,
via sockets, sao transmitidos bytes.
nao importa a origem destes bystes.
basta vc obter o texto da JTextArea e enviar pelo socket, como se fosse retirado de um arquivo.
abraços
Andre,
Vi que voce tem experiencia nessa area de aplicacões client server!
Quando voce fala q vai ser via processos seria o que??
Threads eu sei pq ja tive q utilizar mas esse conceito de processo acho q tow confundindo!
andre_udi
ola amigos,
tipo, pra uma app assim, vc teria teoricamente 2 opcoes:
- threads: sao leves, ou seja, a troca de contexto da execucao é rapida, pq é interno ao processo.
entretando, concorre com a linha de execucao principal da aplicacao, podendo torna-la pesada.
- processos: a troca de contexto é bem + lenta, pq envolve uma serie de pqnos processamentos.
porem, nao concorre com a aplicacao diretamente. muitos processos entretando, degradam o
desempenho do sistema como um todo.
thread -> outra linha de execucao dentro na area da propria app.
processo -> outra aplicacao rodando, sem nenhum conexao com a app original
entao, cabe ao desenvolvedor definir com qual dos 2 ele tera um ganho maior.
T
Titosca
Zeed01:
Bom dia colegas !
Titôsca:
Vê se esse pedaço de código te ajuda:
importjava.io.*;importjava.net.*;importjava.util.ArrayList;importjava.util.List;publicclassServerextendsThread{privateSocketcliente=null;privateBufferedReaderentradaCliente;privatePrintWritersaidaCliente;publicServer(Socketcliente){this.cliente=cliente;try{entradaCliente=newBufferedReader(newInputStreamReader(cliente.getInputStream()));saidaCliente=newPrintWriter(cliente.getOutputStream(),true);}catch(IOExceptione){e.printStackTrace();}}publicvoidrun(){//aqui define o que o Server faz com as entradas do cliente.}publicstaticvoidmain(String[]args){inti=1;try{ServerSockets=newServerSocket(1234);while(true){Serverserver=newServer(s.accept());server.start();}}}catch(Exceptione){}}
[]s
Mas aonde ai que ta o lance q faz o meu server aceitar varios clientes! eu nao consegui ver!
T
Titosca
andre_udi:
ola amigos,
tipo, pra uma app assim, vc teria teoricamente 2 opcoes:
- threads: sao leves, ou seja, a troca de contexto da execucao é rapida, pq é interno ao processo.
entretando, concorre com a linha de execucao principal da aplicacao, podendo torna-la pesada.
- processos: a troca de contexto é bem + lenta, pq envolve uma serie de pqnos processamentos.
porem, nao concorre com a aplicacao diretamente. muitos processos entretando, degradam o
desempenho do sistema como um todo.
thread -> outra linha de execucao dentro na area da propria app.
processo -> outra aplicacao rodando, sem nenhum conexao com a app original
entao, cabe ao desenvolvedor definir com qual dos 2 ele tera um ganho maior.
Andre perfeitoooo! ERa esse o conceito que eu tinha realmente na cabeça!
mas foi uma explanação perfeita! agora não esqueço!
Para cada socket cliente que o servidor recebe ele starta uma thread que “ouve” esse cliente e volta a esperar por uma nova conexão.
Bom… eu sou novato, talvez esteja falando besteira… mas criei um chat assim.
Claro que aí esta só a parte do server, esta faltando a parte do client.
No meu caso era uma coisa simples, só para estudo de Socket, então o que um cliente escrevia o server escutava e reenviava para todos os clientes conectados.
Como uma sala de bate-papo, sem opção de falar somente com uma pessoa.
Estou trabalhando nisso… mas dai acho que é só mexer lógica de envio do servidor… a parte de ouvir os clientes acho que vai ficar igual.