Problema com o exercicio

7 respostas
C

Bom Dia Pesoal!

Estou com outro problema novamente.
Estou precisando de uma ajuda como eu posso fazer tipo um msn com tela usando sistemas distribuidos?
eu preciso me comunicar com outro computador, e ele deve responder atraves de C: se estiver online e estabelecer uma conexão, D: se estiver offline e retornar que a pessoa não esta online.
Eu comecei a ver sistemas distribuidos neste semestre e não sei bem como desenvolver o problema acima citado.
Eu comecei comecei a desenvolver um programa bem simples no qual vc informa o IP que deseja enviar um texto, más preciso adaptar para um MSN com tela e não sei bem como continuar.
Alguem pode me dar uma ajuda?

package msn;
import java.net.*;
import java.io.*;
import javax.swing.JOptionPane;

public class Principal {

    
    public static void main(String[] args) 
    throws Exception 
    {
        DatagramSocket p2pSocket = new DatagramSocket(9874);
        String ip,texto;
        ip=JOptionPane.showInputDialog("Informe o IP do outro PC");
        InetAddress IPAddress = InetAddress.getByName(ip);
        byte[] receiveData = new byte[1024];
        byte[] sendData = new byte[1024];
        while(true) 
        {
            texto=JOptionPane.showInputDialog("Escreva um texto");
            sendData = texto.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length, IPAddress, 9874);
            p2pSocket.send(sendPacket);
            JOptionPane.showMessageDialog(null,"Mensagem enviada a"+ sendPacket.getAddress().getHostName()+";porta="+sendPacket.getPort());
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            p2pSocket.receive(receivePacket);
            int tam=receivePacket.getLength();
            String modifiedtexto = new String(receivePacket.getData());
            modifiedtexto=modifiedtexto.substring(0,tam);
            JOptionPane.showMessageDialog(null,"Mensagemn recebida"+modifiedtexto);
        }
        
    }
        
    }

7 Respostas

L

Na verdade a idéia do msn é assim:

Existe um servidor do msn central onde todos os clientes se comunicam a ele…
Um cliente não se comunica diretamente com outro…
O que acontece é…
1)O cliente1 envia uma msg para o server dizendo que a msg é para o cliente2
2)O server redireciona a mensagem vinda do cliente1 para o cliente2…

C

Blz entendi a ideia, mas como eu poderia adaptar meu codigo para esta ideia?

C
Eu fiz este codigo abaixo de uma comunicação cliente/ servidor. Como posso fazer para que uma maquina1 envie um sinal para o servidor informando que deseja se comunicar com a maquina 2 e caso esta maquina esteja online estabeleça uma comunicação entre as duas??? como posso fazer isso?
package exercicios01;
import java.net.*; //prove as classes para implementação de aplicações de rede
import java.io.*; //sistema de entrada e saída através de fluxo de dados,
import java.util.*; //serialização e sistemas de arquivos */

/**
 *
 * @author aluno
 */
public class UDPServerUpperCase {
    /** Creates a new instance of UDPServer1 */
public UDPServerUpperCase() {
}
public static void main(String args[]) throws Exception {
// cria socket do servidor com a porta 9876
DatagramSocket serverSocket = new DatagramSocket(9874);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while(true) {
System.out.println("Servidor no ar....");
// Declara o pacote a ser recebido
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
// Recebe o pacote do cliente
serverSocket.receive(receivePacket);
// Obtém os dados, o endereço IP e a porta do cliente para mandar
//a mensagem de volta
String sentence = new String(receivePacket.getData());
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
//Mostra na tela
System.out.println("Recebido desde "+
receivePacket.getAddress().getHostName()+" porta= "+port+
" Mensagem = "+sentence);
//Transforma em maiúsculas
String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
//Monta o pacote com endereço IP e porta
DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length,IPAddress, port);
//Envia ao cliente
serverSocket.send(sendPacket);
}
}
}
package exercicios01;
import java.net.*; //prove as classes para implementação de aplicações de rede
import java.io.*; /*sistema de entrada e saída através de fluxo de dados,
/serialização e sistemas de arquivos */


public class UDPClientUpperCase {
    /** Creates a new instance of UDPClient1 */
public UDPClientUpperCase() {
}
public static void main (String args[]) throws Exception {
// Cria o stream do teclado
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Escreve um texto:");
// Declara socket cliente
DatagramSocket clientSocket = new DatagramSocket();
// Obtém endereço IP
InetAddress IPAddress = InetAddress.getByName("localhost");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
// Lê uma linha do teclado
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
// Cria pacote com os dados, o endereço do servidor e porta do servidor
DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, IPAddress, 9874);
//Envia o pacote
clientSocket.send(sendPacket);
System.out.println("Mensagem enviado a:"
+sendPacket.getAddress().getHostName()+";porta="+sendPacket.getPort());
//Declara o pacote a ser recebido
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
//Recebe pacote do servidor
clientSocket.receive(receivePacket);
//Separa somente o dado recebido
String modifiedSentence = new String(receivePacket.getData());
//Mostra na tela
System.out.println("Mensagem recebida: " + modifiedSentence);
//Fecha o cliente
clientSocket.close();
}
    
}
E

coutinho11:
Eu fiz este codigo abaixo de uma comunicação cliente/ servidor.
Como posso fazer para que uma maquina1 envie um sinal para o servidor informando que deseja se comunicar com a maquina 2 e caso esta maquina esteja online estabeleça uma comunicação entre as duas???

Típico problema que requer um desenho (diagrama) bem feito, em vez de sair botando a mão no código. Não estou falando em diagramas UML - invente o seu próprio esquema.

Já ouviu falar em “desenvolver seu protocolo de comunicação”?

douglaskd

você vai ter 3 jars.

cliente1.jar, cliente2.jar, Servidor.Jar…

Você inicializa o Jar do seu Servidor…e o deixa rodando aguardando conexões.

quando um cliente conecta ele pega o ip da maquina e (outras informações que você quizer)…o msn usa o e-mail como chave primaria, mais você para testes pode usar apenas o IP…

…continuando, correto é você ter um objeto do tipo cliente (no servidor), dentro desse objeto manter os seguintes atributos: string IP_Origem, string Nome, string IP_Destino.

quando alguem se conecta ao servidor o cliente, recebe uma lista dos clientes conectados com seus nomes e ips, e então tem a opção de selecionar um desses clientes_destino, quando o mesmo é selecionado ele grava o ip deste cliente no atributo string IP_destino
(essa seria a idéia básica do servidor)

quando um cliente envia uma mensagem para um dos clientes que estão conectados…ele pode “anexar junto a esta mensagem um cabeçalho” <- poderia concatenar no inicio da mensagem…para ficar mais facil

IP_Origem //seria o ip do cliente
IP_Destino //seria o ip do cliente_destino
Mensagem //aqui fica a mensagem

no Servidor, você da um split nessa string, pega os parâmetros e redireciona a mensagem para o IP_Destino.

douglaskd

perae…

vc ta fazendo P2P ? se for não tem servidor…cada cliente é um servidor com uma lista de clientes…formando um Grafo

C

Então a ideia de comunicação de como vai funcionar eu entendi,
no codigo acima que eu consegui implementar você só informa o IP e digita uma mensagem para outro pc.
Eu não estou sabendo como implementar esta ideia pois comecei ter aula de sistemas distribuidos
neste semestre e ta meio vago ainda e o professor passou este exercicio pra nós.
O professor quer que envie um protocolo L de login, O de online e F de logoff, dai vc loga em seguida o servidor envia o protocolo O de online
para as maquinas e as que tiver online retornam se a maquina ta online ou não.

Criado 27 de março de 2012
Ultima resposta 27 de mar. de 2012
Respostas 7
Participantes 4