Desenvolvimento Client-Server

14 respostas
T

E ai pessoal,

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.

Valeu!

14 Respostas

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.

T

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

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

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:

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.List;


public class Server extends Thread {
	private Socket cliente = null;
	private BufferedReader entradaCliente;
	private PrintWriter saidaCliente;

	public Server(Socket cliente) {
		this.cliente = cliente;

		try {
			entradaCliente = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
			saidaCliente = new PrintWriter(cliente.getOutputStream(), true);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

	public void run() {
                             //aqui define o que o Server faz com as entradas do cliente.

	}

	public static void main(String[] args) {
		int i = 1;

		try {
			ServerSocket s = new ServerSocket(1234);

			while (true) {
				Server server = new Server(s.accept());
				server.start();
			          }
			}
		} catch (Exception e) {
	}
}

[]s

T

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

Zeed01:
Bom dia colegas !

Titôsca:

Vê se esse pedaço de código te ajuda:

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.List;


public class Server extends Thread {
	private Socket cliente = null;
	private BufferedReader entradaCliente;
	private PrintWriter saidaCliente;

	public Server(Socket cliente) {
		this.cliente = cliente;

		try {
			entradaCliente = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
			saidaCliente = new PrintWriter(cliente.getOutputStream(), true);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

	public void run() {
                             //aqui define o que o Server faz com as entradas do cliente.

	}

	public static void main(String[] args) {
		int i = 1;

		try {
			ServerSocket s = new ServerSocket(1234);

			while (true) {
				Server server = new Server(s.accept());
				server.start();
			          }
			}
		} catch (Exception e) {
	}
}

[]s

Mas aonde ai que ta o lance q faz o meu server aceitar varios clientes! eu nao consegui ver!

T

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!

Zeed01

Boa tarde colegas !

[b]Titosca:[/]

Nessa parte:

ServerSocket s = newServerSocket(1234); 
while(true) {   
  
                Server server = newServer(s.accept());   
                server.start();   
                      }   
            }

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.

[]s

Criado 13 de setembro de 2007
Ultima resposta 13 de set. de 2007
Respostas 14
Participantes 4