Ir para o conteúdo
davide92

Enviar mensagens Intervaladas UDP/TCP

Mensagens Recomendadas

davide92    0
davide92

Boas a todos tenho dois servidores que comunicam entre si, e um cliente que se liga a um dos dois dependendo do load que eles têm. Como é que eu posso fazer para digamos o servidor A enviar para o servidor B de 5 em 5 min(por exemple) uma mensagem neste caso udp com o seu load ?

load = memoria utilizada no sistema

PS: Penso que para os dois ou mais servidores comunicarem entre si é por UDP ou é melhor TCP ?

Abraço

Editado por davide92

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

a escolha recai sempre em informação que não apresentaste

- necessidade de fiabilidade de notificação

- capacidade de recuperação de mensagens perdidas

- rapidez de transmissão necessária


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
brunoais    67
brunoais

Se tiveres tempo para desenvolver e precisas de espremer todo o bocado de performance: UDP

Mas tens que fazer mais à medida do teu sistema e soluções genéricas não farão sentido para aproveitar a vantagem.

Editado por brunoais

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
davide92    0
davide92

Então e por exemplo tenho um servidor A à espera que um cliente A se ligue para receber uma tabela(do servidor A). Como posso fazer para o servidor enviar mensagem com o seu load para outro servidor sem atrapalhar a recepção de clientes ?

Eu tenho este servidor criado para enviar datas:

public class DateServer extends Thread {
private ServerSocket dateServer;
public static void main(String argv[]) throws Exception {
 new DateServer();
}
public DateServer() throws Exception {
 dateServer = new ServerSocket(3000);
 System.out.println("Server listening on port 3000.");
 this.start();
}
public void run() {
 while(true) {
  try {
System.out.println("Waiting for connections.");
Socket client = dateServer.accept();
System.out.println("Accepted a connection from: "+ client.getInetAddress());
Connect c = new Connect(client);
  } catch(Exception e) {}
 }
}
}
class Connect extends Thread {
private Socket client = null;
private ObjectInputStream ois = null;
private ObjectOutputStream oos = null;
public Connect() {}
public Connect(Socket clientSocket) {
 client = clientSocket;
 try {
  ois = new ObjectInputStream(client.getInputStream());
  oos = new ObjectOutputStream(client.getOutputStream());
 } catch(Exception e1) {
  try {
client.close();
  }catch(Exception e) {
System.out.println(e.getMessage());
  }
  return;
 }
 this.start();
}

public void run() {
 try {
  oos.writeObject(new Date());
  oos.flush();
  // close streams and connections
  ois.close();
  oos.close();
  client.close();
 } catch(Exception e) {}	  
}
}

E como é que aqui posso meter o Timer e o respectivo TimerTask ?

Editado por davide92

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
davide92    0
davide92

isso já uma questão completamente diferente.

a solução mais convencional é com threads, sabes o que é ?

Sim sei, já usei num trabalho parecido. Uso uma thread para ligações TCP com os clientes, outra para ligações UDP com os servidores front end e outra para uma ligação UDP com o servidor back end ?

Editado por davide92

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

Sim sei, já usei num trabalho parecido. Uso uma thread para ligações TCP com os clientes, outra para ligações UDP com os servidores front end e outra para uma ligação UDP com o servidor back end ?

sem uma ideia geral do que estás a fazer, não vou dizer o que deves usar, quando deves usar


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
davide92    0
davide92

E como posso implementar o Thread t = new Thread(); ?

Já tentei meter algo deste genero mas não deu:

//Connect c = new Connect(client);
Thread t = new Thread(new Connect(client));

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
davide92    0
davide92

a classe Connect implementa o interface Runnable ?

Já sei qual era o erro, com um bocado de Google lá descubri.

Ao meter assim já dá:

public void run() {
 while(true) {
  try {
	System.out.println("Waiting for connections.");
	Socket client = dateServer.accept();
	System.out.println("Accepted a connection from: "+ client.getInetAddress());
	Thread t = new Connect(client);
	t.start();
	//Connect c = new Connect(client);
  } catch(Exception e) {}
 }
}

Agora neste caso sempre que alguem se liga a este servidor ele cria uma nova thread.

Para me fazer entender melhor deixo aqui parte do enunciado:

Este trabalho estabelece vários servidores Front-End (nós) que interceptam a comunicação entre um servidor Back-End e os clientes, como representado na figura 1. O propósito dos nós é o de aliviar a carga a que pode estar sujeito o servidor principal (Back-End). Os nós necessitam de suportar comunicação RMI com o servidor Back-End. O cliente deve invocar métodos no sistema Back-End enviando uma mensagem TCP ao nó. O nó invoca os métodos remoto via RMI. Os nós devem manter uma Tabela Hash Distribuida (DHT) com os endereços IPV4 e a respectiva carga dos nós conhecidos. A carga do servidor é determinada pela memória utilizada pela JVM. Pares (chave, valor) são armazenados na DHT e qualquer nó participante pode eficientemente recuperar o valor associado a uma dada chave. A responsabilidade de manter o mapeamento de chaves para valores é distribuída entre os nós tal que mudanças no conjunto de participantes causem o mínimo de desordem. Isso faz com que as DHTs escalem a um número extremamente grande de nós e controlem chegadas, saídas e falhas contínuas dos mesmos. Os nós devem manter a DHT, enviando mensagens entre si, informando da sua carga em cada 10 segundos. Qualquer dos nós verifica a cada 60 segundos se houve mensagens por parte dos outros nós. No caso de um dos nós não ter enviado mensagens durante esse periodo de tempo, é considerado “off-line”. Nestas circunstâncias o nó “off-line” mantem-se na tabela, sendo-lhe atribuido uma carga com valor null. Do mesmo modo, se um nó estiver em modo “off-line” por mais de 120 segundos, é removido da tabela.

a.JPG

Editado por davide92

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.