Networking Programando para redes em Java 1 Conceitos Básicos n Computadores na internet se comunicam empregando os protocolos: Transmission Control Protocol (TCP); ou User Datagram Protocol (UDP). Conceitos Básicos n Ao escrever um programa em Java que se comunica através da rede, estamos trabalhando na Application Layer. n Normalmente não será necessário se preocupar com as camadas TCP e UDP (camadas de transporte) n As camadas do pacote java.net provêem estes serviços e são independentes do sistema. 1
Conceitos Básicos - TCP n Definição: TCP (Transmission Control Protocol) é um protocolo baseado em conexão (connectionbased) que provê um fluxo confiável de dados entre dois computador. n Quando dois programas querem se comunicar, estes estabelecem uma conexão entre eles de forma análoga a uma ligação telefônica. n Assim como a companhia telefônica, o TCP garante que os dados enviados cheguem na mesma ordem ao destinatário. Conceitos Básicos - TCP n O TCP cria um canal ponto-à-ponto para os programas. n O Hypertext Transfer Protocol (HTTP), o File Transfer Protocol (FTP), e o Telnet são exemplos de aplicativos que necessitam de um canal confiável de comunicação. n Quando o HTTP é empregado para ler dados de uma URL, os dados devem ser recebidos na ordem que são enviados, caso contrário a página HTML seria corrompida, ou um arquivo de imagem, ou zip seriam inválidos. Conceitos Básicos - UDP n Definição: UDP (User Datagram Protocol) é um protocolo que envia pacotes independentes de dados, denominados datagramas. O UDP não é um protocolo connection-based como o TCP. n O protocolo UDP permite a comunicação entre dois programas através da rede, porém sem estabelecer um conexão entre eles. 2
Conceitos Básicos - UDP n Enviar datagramas é muito semelhante a enviar cartas. A ordem de entrega não é garantida e cada mensagem é independente uma da outra. n Um exemplo de serviço que não requer um canal confiável para comuniação é o comando ping. O seu objetivo é testar a comunicação entre dois computadores. Conceito Básicos - Portas n Um computador tem, normalmente, uma única conexão física com a rede. n Todos os dados chegam a este computador através desta conexão física, porém os dados podem ser destinados a diferentes programas que estejam rodando nesta máquina. n O destino dos dados em um mesmo computador é definido através das portas (ports). Conceito Básicos - Portas n Definição: os protocolos TCP e UDP empregam portas para mapear os dados para um processo particular que esteja rodando no computador. n O computador é identificado pelo seu endereço IP com 32-bit e as portas são identificadas por um número de 16-bit. 3
Conceito Básicos - Portas n Nos protocolos baseados em datagramas, como o UDP, os pacotes de dados contém o número da porta do destino e o UDP faz o roteamento para o aplicativo correto: Interface de Rede n Uma interface de rede é o ponto da ligação entre um computador e uma rede privada ou pública. n É geralmente um cartão de interface de rede (NIC), mas não é necessariamente um hardware, a interface de rede pode ser implementada no software. Por exemplo, a interface de laço de retorno (127.0.0.1 para IPv4 e:: 1 para IPv6) não é um dispositivo físico mas uma parte do software que simula uma interface de rede. n A interface de laço de retorno é comumente usada em ambientes de teste. Interface de Rede n A classe NetworkInterface, do pacote java.net, representa ambos os tipos de interfaces. n Esta classe é útil para sistemas multihomed, ou seja, sistemas com múltiplos NICs. n Por meio da classe NetworkInterface pode ser especificado qual NIC usar para uma determinada atividade de rede. 4
Interface de Rede n Por exemplo, assumindo que haja uma máquina com dois NICs, e você quer enviar dados a um servidor. Você cria um socket: Socket soc = new java.net.socket(); soc.connect(new InetSocketAddress(address, port)); n Para enviar os dados, o sistema determina que interface será usada. Interface de Rede n Para especificar que NIC usar, você pode questionar o sistema quais as interfaces apropriadas e encontrar o endereço da interface que você quer usar. n Quando você cria o socket e o conecta àquele endereço, o sistema usará a interface associada. Por exemplo: NetworkInterface nif = NetworkInterface.getByName("bge0"); MulticastSocket() ms = new MulticastSocket(); ms.joingroup( new InetSocketAddress(hostname, port), nif); InetAddress n Pertence ao pacote java.net. n A classe InetAddress representa endereços de IP. n Ela trabalha com: qualquer hostname (www.unieuro.edu.br); ou endereço IP numérico (200.199.197.148). n Oferece um número de métodos úteis para tratar endereços de IP e hostnames. 5
InetAddress n A classe InetAddress não tem nenhum construtor público. n Para instancia-la você passa o nome de host ou o endereço ao método InetAddress.getByName try { InetAddress unieuro = InetAddress.getByName("www.unieuro.edu.br"); "); InetAddress addunieuro = InetAddress.getByName("200.199.197.148"); catch (UnknownHostException ex) { System.err.println(ex); InetAddress n Alguns hosts têm múltiplos endereços. n Quando for este o caso, o método InetAddress.getAllByName retorna um array de objetos InetAddress: try { InetAddress[] addresses = InetAddress.getAllByName("www.google.com") "); for (int i = 0; i < addresses.length; i++) { System.out.println(addresses[i]); catch (UnknownHostException ex) { System.out.println("Não encontrei www.google.com"); InetAddress n O método InetAddress.getLocalHost retorna um objeto InetAddress que contém o endereço do computador onde o programa está rodando: try { InetAddress me = InetAddress.getLocalHost(); catch (UnknownHostException e) { System.err.println(e); 6
InetAddress n InetAddress.getByName n InetAddress.getAllByName n InetAddress.getLocalHost n InetAddress.getHostAddress n InetAddress.getHostName n InetAddress.getAddress Trabalhando com URLs n O HTTP utiliza URI (uniform resource identifier) para identificar dados na Internet. n URIs que especificam a localização de documentos são chamados URL(uniform resource locator). n URLs comuns referenciam arquivos, diretórios, ou objetos que realizam tarefas complexas, como pesquisas em bancos de dados ou mesmo na Internet. n Aplicativos Java que interagem com a Internet também usam URLs para encontrar os recursos que necessitam ter acesso, para tal podem empregar a classe URL, do pacote java.net, para representar um endereço URL. O que são URLs? n Definição: URL é a abrevatura de Uniform Resource Locator e é a referência (um endereço) para um recurso na Internet. Uma URL tem dois componentes principais: 1. identificador do Protocolo; e 2. o nome do Recurso. 7
Criando um Objeto URL n A maneira mais fácil é através de uma String: URL gamelan = new URL("http://www.gamelan.com/"); n O objeto URL criado desta forma representa um URL absoluto, uma vez que contém toda a informação necessária para alcançar o recurso. n Também podem ser criados objetos URL relativos a um endereço URL. Criando um Objeto URL n Um URL relativo contém somente a informação necessária para alcançar um recurso relativo (ou no contexto de) a outro URL. n URLs relativos são usados em páginas HTML. n Num programa Java por exemplo: URL gamelan = new URL("http://www.gamelan.com/pages/"); URL gamelangames = new URL(gamelan, "Gamelan.game.html"); URL gamelannetwork = new URL(gamelan, "Gamelan.net.html"); Ouros Construtores n A classe URL tem dois outros construtores que são empregados quando não há um objeto String que contenha a especificação completa da URL, mas seus componentes são conhecidos. 8
Outros Construtores n O primeiro construtor cria um objeto URL a partir do protocolo, host name e nome do arquivo, como no exemplo abaixo: new URL("http", "www.gamelan.com", "/pages/gamelan.net.html"); Que equivale: new URL("http://www.gamelan.com/pages/Gamelan.net. html"); Outros Construtores n Os argumentos passados para este construtor são: o protocolo; host name; e O caminho e o nome (pathname) do arquivo. n Observe que no exemplo o pathname continha uma barra invertida no início, o que indica que o caminho é referente à raiz do host. Outros Construtores n O último construtor adiciona o número da porta à lista de parâmetros empregadso no construtor anterior: URL gamelan = new URL("http", "www.gamelan.com", 80, "pages/gamelan.network.html"); n Para obter a string correspondente a URL dos objetos criados empregando estes 2 últimos construtores emprega-se o métdos tostring ou o método equivalent toexternalform. 9
URL com Caracteres Especiais n Alguns endereços URL possuem caracteres especiais como por exemplo: http://foo.com/hello world/ n Para poder empregar estes caracteres eles precisam ser codificados: URL url = new URL("http://foo.com/hello%20world"); URL com Caracteres Especiais n Para endereços URL que possuam vários caracteres especiais é necessário empregar o construtor com múltiplos parâmetros da classe java.net.uri que codificará estes caracteres: URI uri = new URI("http", "foo.com", "/hello world/", ""); e então converte-lo de URI para URL: URL url = uri.tourl(); MalformedURLException n Todo construtor de objetos URL lança a exceção MalformedURLException se os argumentos do construtor se referenciarem a um endereço inválido, ou cujo protocolo seja desconhecido. n Para capturar esta exceção deverá ser empregado o bloco try...catch: try { URL myurl = new URL(...); catch (MalformedURLException e) {... // tratamento da exceção... 10
Analisando uma URL n A classe URL possui métodos para interrogar os onjetos URL: getprotocol: retorna o protocolo. getauthority: retorna a autoridade gethost:retorna o nome do host. getport: retorna um inteiro crorrespondente ao número da porta. Se a porta não tiver sido selecionda retorna -1. Analisando uma URL getpath: retorna o caminho do componente. getquery: retorna a query. getfile: retorna o nome do arquivo associado à URL. O valor retornado é o mesmo que getpath mais o getquery juntos. getref: retorna a referencia da URL. ParseURL.java import java.net.*; import java.io.*; public class ParseURL { public static void main(string[] args) throws Exception { URL umaurl = new URL("http://java.sun.com:80/docs/books/tutorial" + "/index.html?name=networking#downloading"); System.out.println("protocol = " + umaurl.getprotocol()); System.out.println("authority = " + umaurl.getauthority()); System.out.println("host = " + umaurl.gethost()); System.out.println("port = " + umaurl.getport()); System.out.println("path = " + umaurl.getpath()); System.out.println("query = " + umaurl.getquery()); System.out.println("filename = " + umaurl.getfile()); System.out.println("ref = " + umaurl.getref()); 11
Lendo de uma URL n Uma vez criado o objeto URL, é possível obter um stream para ler o conteúdo da URL através do método openstream(). n O método openstream() retorna um objeto do tipo: java.io.inputstreamobject n Para ler de uma URL procede-se da mesma forma que de um input stream. URLReader.java import java.net.*; import java.io.*; public class URLReader { public static void main(string[] args) throws Exception { URL yahoo = new URL("http://www.yahoo.com/"); BufferedReader in = new BufferedReader( new InputStreamReader( yahoo.openstream())); String inputline; while ((inputline = in.readline())!= null) System.out.println(inputLine); in.close(); Conectando-se a uma URL n Uma vez instanciado o objeto URL pode-se chamar o método openconnection para criar um objeto URLConnection, ou uma das classes derivadas específicas para cada tipo de protocolo, como por exemplo: java.net.httpurlconnection 12
Conectando-se a uma URL n A conexão com a URL remota só se inicia quando o método URLConnection.connect é chamado. n Ao ser chamado este método inicia-se a comunicação entre o programa Java e a URL através da rede. n Um novo objeto URLConnection object é criado toda vez que o método openconnection é chamado. Conectando-se a uma URL try { URL yahoo = new URL("http://www.yahoo.com/"); URLConnection yahooconnection = yahoo.openconnection(); yahooconnection.connect(); catch (MalformedURLException e) { // new URL() failed... catch (IOException e) { // openconnection() failed... Conectando-se a uma URL n Nem sempre é necessário chamar o método connect para iniciar a conexão. n Operações que depende da conexão para acontecer, tais como, getinputstream, getoutputstream, implicitamente geram a conexão necessária. n Uma vez conectado a URL pode-se ler ou escrever através da conexão. 13
URLConnectionReader.java import java.net.*; import java.io.*; public class URLConnectionReader { public static void main(string[] args) throws Exception { URL yahoo = new URL("http://www.yahoo.com/"); URLConnection yc = yahoo.openconnection(); BufferedReader in = new BufferedReader( new InputStreamReader( yc.getinputstream())); String inputline; while ((inputline = in.readline())!= null) System.out.println(inputLine); in.close(); Escrevendo em uma URL n Muitas páginas HTML usam o HTTP POST METHOD para enviar dados para o servidor. n Escrever numa URL também é conhecido como posting para uma URL. n O servidor reconhece a solicitação POST e lê os dados enviados pelo cliente. Escrevendo em uma URL n Para um programa interagir com um servidor ele deve ser capaz de escrever em uma URL e isto é possível através dos seguintes passos: Criar um objeto URL. Referenciar o objeto URLConnection. Estabelecer a capacidade de escrever no objeto URLConnection. Conectar-se a um recurso. Instanciar um output stream a partir da conexão. Escrever no output stream. Fechar output stream. 14
Escrevendo em uma URL import java.io.*; import java.net.*; public class Reverse { public static void main(string[] args) throws Exception { if (args.length!= 2) { System.err.println("Usage: java Reverse " + "http://<location of your servlet/script>" + " string_to_reverse"); System.exit(1); String stringtoreverse = URLEncoder.encode(args[1], "UTF-8"); URL url = new URL(args[0]); URLConnection connection = url.openconnection(); connection.setdooutput(true); OutputStreamWriter out = new OutputStreamWriter( connection.getoutputstream()); out.write("string=" + stringtoreverse); out.close(); BufferedReader in = new BufferedReader( new InputStreamReader( connection.getinputstream())); String decodedstring; while ((decodedstring = in.readline())!= null) { System.out.println(decodedString); in.close(); 15