Ir para o conteúdo
davide92

Enviar mensagens Intervaladas UDP/TCP

Mensagens Recomendadas

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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
davide92

Neste caso seria necessário ser rápido, e ter a certeza que se o outro servidor estiver a trabalhar que ele receba a informação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação 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.