Jump to content
davide92

Enviar mensagens Intervaladas UDP/TCP

Recommended Posts

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

Edited by davide92

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Edited by 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%.

Share this post


Link to post
Share on other 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 ?

Edited by davide92

Share this post


Link to post
Share on other sites
HappyHippyHippo

isso já uma questão completamente diferente.

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


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

Share this post


Link to post
Share on other 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 ?

Edited by davide92

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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));

Share this post


Link to post
Share on other 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

Edited by davide92

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.