Artigo: Usando Sockets em Applets não assinadas

1 resposta
S

:arrow:Introdução

Olá pessoal, sou usuário aqui do GUJ a pouco tempo. Esse fórum me ajudou muito, sempre que possível quero colaborar aqui também para ajudar aqueles que estão tão perdidos ( ou mais…) que eu em Java.

:arrow:Conceitos Básicos :

Java é uma linguagem de programação que se parece muito com C/C++. Como o C++ é orientada a objetos. A linguagem é muito famosa por sua portabilidade:um mesmo código Java, na maioria das veses não precisa nem sequer ser recompilado para rodar outro sistema operacional.
Ao fazer um OlaMundo.java e compilá-lo, o seu .class(o “excecutavel do java”) pode rodar tanto em windows como em Linux ou outro sistema Operacional.

:?:Como isso é possível? :?:
Quando você compila o programa Java, ele é convertido em bytecodes, que é uma espécie de código de máquina, mas ainda não são totalmente código de máquina puro. Esses bytecodes são então interpretados pela máquina virtual instalada no seu Sistema Operacional ( ou Java Virtual Machine).Logo, java é compilada e interpretada.

Applets são pequenos aplicativos Java que rodam no Browser. Os navegadores precisam de um “plug-in”(como se fosse aquele plug-in para rodar o flash)para que possam interpretar os códigos java dessas Applets. Resumindo, esse plug-in no Navegador faz a função da Java Virtual Machine.

Existe um tipo de comunicação em java que se baseia em Socket.Funciona assim: Uma aplicação faz o lado cliente ( ClientSocket ou simplesmente Socket) e outra aplicação faz o lado servidor(ServerSocket).
A aplicação Cliente, chamaremos de Fala, envia a mensagem pelos protocolos de rede TCP( um protocolo que faz transferencia de dados de maneira confiável) ou UDP(Esse protocolo se baseia em datagramas, uma forma de envio mais rápida porque não se estabelece efetivamente uma conexão, porém menos confiável, indicada se deseja enviar uma música para ouvir na hora, por exemplo) para determinado endereço IP e porta

A Aplicação Servidora, chamaremos de Escuta, define a porta de escuta, por meio da qual haverá a conexão.

:arrow:O conceito de SandBox

As Applets tem uma série de restrições para que seu uso não se torne perigoso.Na prática, quase nada que não esteja relacionado com gráficos e cálculos pode ser feito em Applets. As Applets estão proibidas de acessar via socket, por exemplo, um domínio que não seja aquele que a Hospeda ou que a acessa.(O servidor ou o seu computador que está abrindo ela)

Observação:Essa explicação é muito superficial. Para exclarecimentos mais sólidos, sugiro que veja os Artigos e Tutoriais do GUJ.

:arrow:Problema:
Como faço para uma applet Localizada no SERVIDOR-1, do meu computador o HOST-1 e enviar uma mensagem para o computador em outro lugar, o HOST-2 :?:

:arrow:Soluções

As soluções que encontrei são duas:
Uma é assinar a Applet. Assinar é garantir que seu conteúdo não será malicioso, e dessa forma, pode-se liberar os recursos que se deseja.
O site : http://www.lcmi.ufsc.br/jacoweb/restrito/documentos/assinatura/ ensina como assinar as Applets.

O problema desse método, apesar de trazer maior sensação de segurança ao usuário, é o inconveniente de ter que usar uma chave em cada computador que precise acessar a Applet Assinada.

O acesso, nessa situação fica dessa forma:

Host-1 :arrow: :arrow: (Socket) Host-2
(rodando Applet assinada) (rodando ServerSocket)

Outra solução, é usar o Servidor que hospeda a Applet como ponte para conectar-se ao Host-2.

Fica da seguinte forma:

Host-1 :arrow: :arrow: (Socket[fala]) Servidor-1 :arrow: :arrow: (Socket[escuta/fala]) Host-2 (Socket[escuta])

O código abaixo dá uma ideia do que acontece:

/**
Ver artigo em http://www.guj.com.br/posts/list/97810.java
Applet localizada no Servidor-1 e rodando no Host-1
 * @(#)ShamanPyro.java
 *
 *
 * @author Shamanpyro :Eduardo Pacheco
 * @version 1.00 2008/7/23
 */
 import java.io.IOException;
 import java.io.PrintStream;
 import java.net.Socket; //1
 import java.net.*;
import java.awt.*;

public class ShamanPyro extends java.applet.Applet {
    
    /** Initialization method that will be called after the applet is loaded
     *  into the browser.
     */
     Label Avisos;
     String Pacote;
    public void init() {
    	
    	Socket SocketCliente = null; //3
    	Label Avisos = new Label("");
    		add(Avisos);
    	try{
    			Avisos.setText("Applet não assinada que envia Sockets");
     
        SocketCliente = new Socket("10.8.56.22", 8000); // Coloque aqui o IP do Servidor
        
    	}catch(IOException ex){
    		Avisos.setText("Excecao em socket");}
        
        
         try{

Pacote = "Socket em Applet!!!";

		   PrintStream StreamDeSaidaDeDados = new PrintStream(SocketCliente.getOutputStream()); //6
           		   StreamDeSaidaDeDados.println(Pacote);// 7
		   StreamDeSaidaDeDados.println(Pacote);// 8
Avisos.setText("Enviou Certinho!!");

	     }catch(IOException excecao)
	  {
      Avisos.setText("Erro ou na hora de enviar ou na hora de criar dados pelo socket."); // 9
      } finally
      {
	  try{
		  SocketCliente.close();//10
         }catch(IOException excecao){}
  }
        
        
    } 

    public void paint(Graphics g) {
        
    }
}

Agora a ponte, rodando no servidor:

// Ponte rodando no servidor e faz o meio-de-campo desse mini-sistema.
  import java.io.PrintStream;
         import java.io.BufferedReader;
         import java.io.IOException;
         import java.io.InputStreamReader;
         import java.net.ServerSocket;
         import java.net.Socket;
         // importa classes necessarias para o funcionamento do programa
         public class Ponte
         {



         public static void main (String[] args)
          {

          String mensagem="";
           ServerSocket SocketServidor = null; 
           	Socket Socket = null;
           	Socket SocketCliente = null; 
           
           BufferedReader Entrada = null; // Declara os objetos usados.Usamos também a ServerSocket que fará a parte de //escuta.


           try{
            
             SocketServidor = new ServerSocket(8000); // instancia serversocket e coloca a porta 8000
             Socket = SocketServidor.accept(); // 1
             System.out.println("Aguardando...");

             Entrada = new BufferedReader(new InputStreamReader(Socket.getInputStream())); //2
           }catch(Exception exc){System.out.println("Inicializando variaveis");}


            try{
                
                 mensagem = Entrada.readLine(); // guarda o pacote que recebeu do cliente na variavel mensagem
                
                      
				  System.out.println("Recebi e repasso" + mensagem);
				  
				  
				  
				
				  
				   
				  }catch(Exception naodeu){System.out.println("Nao consegui repassar");}
			
                
         finally{
			try{
			
			//	 
			Socket.close();
				 SocketServidor.close();
				 
			
				  SocketCliente = new Socket("10.8.56.22", 8001); // Coloque aqui o IP do HOST-2
				   PrintStream StreamDeSaidaDeDados = new PrintStream(SocketCliente.getOutputStream()); //6
           		   StreamDeSaidaDeDados.println(mensagem);// 7
		   StreamDeSaidaDeDados.println(mensagem);// 8
				  SocketCliente.close();
				 
         }catch(Exception A){}

			 }

			 }
			}

Agora, a aplicação que roda no Host-2:

import java.io.BufferedReader;
         import java.io.IOException;
         import java.io.InputStreamReader;
         import java.net.ServerSocket;
         import java.net.Socket;
         // importa classes necessarias para o funcionamento do programa
         public class Casa
         {



         public static void main (String[] args)
          {


           ServerSocket SocketServidor = null;  
           Socket Socket = null;
           BufferedReader Entrada = null; // Declara os objetos usados.Usamos também a ServerSocket que fará a parte de //escuta.


           try{

             SocketServidor = new ServerSocket(8001); // instancia serversocket e coloca a porta 8001
             Socket = SocketServidor.accept(); // 1
             System.out.println("Aguardando...");

             Entrada = new BufferedReader(new InputStreamReader(Socket.getInputStream())); //2


               //inicia variaveis
               
                 String mensagem;
                mensagem = Entrada.readLine(); // guarda o pacote que recebeu do cliente na variavel mensagem
                
                   
				  System.out.println(mensagem);

	          

                  }


           catch( IOException excecao){
           System.out.println("Ocorreu erro para criar ou receber o socket.");
	          }
         finally{
			 try{
				 Socket.close();
				 SocketServidor.close();
			 }
			 catch(IOException excecao){
			 }

			 }

			 }
			}
Comentarios:

        1.  O socket fará as conexões pela porta 8000 ou 8001 definida no socket servidor.
        2. O objeto entrada do tipo bufferedReader é instanciado com os parâmetros  que dizem que a entrada pegara os dados enviados via socket.
        3. Nao implementei Threads e outros detalhes para não complicar demais o código. 
        4. Podem usar o código, contanto que mantenham os comentários para que outros possam entender

[color=red]Editado pela moderação (Luca) para incluir as tags Code que sei lá por que o autor esqueceu [/color]

1 Resposta

S

Como cria artigos disponíveis na área Artigos/Tutoriais?

Criado 23 de julho de 2008
Ultima resposta 24 de jul. de 2008
Respostas 1
Participantes 1