Sockets em Java. Leonardo R. Nunes - leonardo@sumersoft.com. 1. Introdução. 2. Sockets TCP/IP



Documentos relacionados
Implementando comunicação em JAVA via Sockets. Alcides Calsavara - alcides@ppgia.pucpr.br Leonardo R. Nunes - leonardo@sumersoft.

Programação com sockets (em Java)

Sistemas Distribuídos

INF1013 MODELAGEM DE SOFTWARE

Programação Paralela e Distribuída. Prof. Cidcley T. de Souza

Mecanismos de Comunicação. Sockets em java (

Sistemas Distribuídos

Olho por olho, e o mundo acabará cego. Mohandas Gandhi

Sockets com Java Parte I

Cliente-servidor com Sockets TCP

socket Objetivo: aprender a construir aplicações cliente/servidor que se comunicam usando sockets

Programação de sockets com TCP

Java 2 Standard Edition Fundamentos de

Programação de Sockets

UNIVERSIDADE ESTADUAL DO OESTE DO PARANÁ CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS COLEGIADO DE INFORMÁTICA

Programação em Rede Baseada em Java. Luiz Affonso Guedes Tópicos em Redes de Computadores Programação Distribuída

Sistemas Distribuídos Java Sockets

IMPLEMENTAÇÃO DE SOCKETS E THREADS NO DESENVOLVIMENTO DE SISTEMAS CLIENTE / SERVIDOR: UM ESTUDO EM VB.NET

Computação Distribuída

Comunicação em Sistemas Distribuídos. Conceitos: Paradigma C/S. Conceitos: Paradigma C/S. Paradigma Cliente/Servidor

Sockets. Bruno Guimarães Lucas Rossini

UNIVERSIDADE. Sistemas Distribuídos

Passagem de Mensagens

Tópicos em Sistemas Distribuídos. Modelos de Comunicação

Aula 30 - Sockets em Java

Comunicação entre processos

Um pouco do Java. Prof. Eduardo

Comunicação Inter-Processos. Prof. Adriano Fiorese. Conceitos Iniciais

Orientação a Objetos

Sistemas Distribuídos Capítulos 3 e 4 - Aula 4

Camada de Transporte. Bruno Silvério Costa

Sistemas Distribuídos. Professora: Ana Paula Couto DCC 064

INF01018 Aula Prática 1 Cliente-Servidor e Multicast

Programação: Sockets em Java

Sockets e Threads em Java

Capítulo II Modelos de Programação Distribuída

Redes de Computadores. Protocolos de comunicação: TCP, UDP

Rede de Computadores II

Redes de Computadores

Java : Comunicação Cliente-Servidor.

Sistemas Distribuídos. Coulouris Capítulo 4

Considerações no Projeto de Sistemas Cliente/Servidor

REDES DE COMPUTADORES

Sistemas Distribuídos. Prof. Ricardo Ribeiro dos Santos

1 Redes de Computadores - TCP/IP Luiz Arthur

MÓDULO 8 Modelo de Referência TCP/IP

Redes de Computadores

TCP/IP TCP UDP IP HTTP HTTPS FTP TFTP TELNET POP3 IMAP SMTP SNMP DHCP

Sockets. Introdução. Introdução. Programando para redes em Java. mecanismo de alto nível para acessar recursos na Internet.

Sistemas Distribuídos

Engenharia Elétrica Eletrônica Slides 20: TCP/IP em Winsocks 2. API do Windows para programar utilizando o protocolo TCP/IP Prof. Jean Marcelo SIMÃO

FTP FILE F TRANSFER PROTOCOL. Tópicos

Programação de Sockets

Rede de Computadores

Redes de Computadores II

Capítulo 7 CAMADA DE TRANSPORTE

USO GERAL DOS PROTOCOLOS SMTP, FTP, TCP, UDP E IP

Tipos de Servidores. Servidores com estado

6 de Julho de Exercício 23 Para que servem portas na camada de transporte?

Módulo 13. Socket. Programação Orientada a Objetos Java (Rone Ilídio)

Prof. Marcelo Cunha Parte 5

Descrição. Implementação. Departamento de Informática e Estatística Universidade Federal de Santa Catarina LAB 4 Transferência de Arquivos

Caso 1 NetScanner Main

Entendendo como funciona o NAT

Aula Prática. Comunicação em SOCKTS. Disciplina: INF01151


Um pouco sobre Pacotes e sobre os protocolos de Transporte

Redes de Computadores. Camada de Transporte

Segurança de redes com Linux. Everson Scherrer Borges Willen Borges de Deus

IP significa Internet Protocol. A Internet é uma rede, e assim como ocorre em qualquer tipo de rede, os seus nós (computadores, impressoras, etc.

REDES DE COMPUTADORES Prof. Ricardo Rodrigues Barcelar

Conceitos Básicos. Conceitos Básicos. Networking. Programando para redes em Java. empregando os protocolos:

Programa de Computador que funciona em Rede

Disciplina Fundamentos de Redes. Introdução ao Endereço IP. Professor Airton Ribeiro de Sousa Outubro de 2014

SIMULADOR DE ROTEAMENTO DE PACOTES (V. 3 20/05/2010)

Modelo Cliente/Servidor e Introdução a Sockets

Redes de Computadores (RCOMP 2014/2015)

Capítulo 7 CAMADA DE TRANSPORTE

Invocação de Métodos Remotos RMI (Remote Method Invocation)

Arquitetura de Redes de Computadores. Bruno Silvério Costa

Conexão Socket na MIDP

Sistemas Distribuídos

Redes de Computadores Modelo de referência TCP/IP. Prof. MSc. Hugo Souza

CONECTO. Tecnologia Java. Rua Henrique Setter, 85 Itoupava Central Blumenau SC Página - 1

FTIN Formação Técnica em Informática Módulo de Administração de Servidores de Rede AULA 02. Prof. Gabriel Silva

Arquiteturas de Rede. Prof. Leonardo Barreto Campos


Camadas de Transporte, Sessão & Apresentação. Função. Camadas REDES x TRANSPORTE. Redes de Computadores Prof. Leandro C. Pykosz

INFORMÁTICA FUNDAMENTOS DE INTERNET. Prof. Marcondes Ribeiro Lima

MÓDULO 7 Modelo OSI. 7.1 Serviços Versus Protocolos

SISTEMAS DISTRIBUÍDOS

Sistemas Distribuídos

Protocolos de Internet (família TCP/IP e WWW) Primeiro Técnico. Prof. Cesar

Capítulo 9 - Conjunto de Protocolos TCP/IP e Endereçamento. Associação dos Instrutores NetAcademy - Julho de Página

Um Driver NDIS Para Interceptação de Datagramas IP

Sockets em Ruby. Curso de Tecnologia em Redes de Computadores Programação para Redes

Adriano Reine Bueno Rafael Barros Silva

ECD1200 Equipamento de Consulta de Dados KIT DE DESENVOLVIMENTO

Transcrição:

Sockets em Java Leonardo R. Nunes - leonardo@sumersoft.com 1. Introdução A comunicação entre processos de software tornou-se indispensável nos sistemas atuais. O mecanismo mais utilizado atualmente para possibilitar comunicação entre aplicações é chamado socket. Neste artigo será apresentado o suporte que Java oferece para a utilização desse mecanismo de comunicação. Java oferece os seguintes modos de utilização de sockets: o modo orientado a conexão, que funciona sobre o protocolo TCP (Transmission Control Protocol, ou protocolo de controle de transmissão), e o modo orientado a datagrama, que funciona sobre o protocolo UDP (User Datagram Protocol, ou protocolo de datagrama de usuários). Os dois modos funcionam sobre o protocolo IP (Internet Protocol). Cada um desses modos tem sua aplicabilidade, e possuem vantagens e desvantagens em sua utilização. Modo orientado a conexão TCP/IP Serviços confiáveis: o Sem perdas de dados na rede; o Garantia de ordem dos pacotes; Possibilidade de utilização de fluxo de dados (DataStreams); Desvantagens: É mais lento que o modo orientado a datagrama; Comportamento servidor diferente de comportamento cliente; Modo orientado a datagrama UDP/IP Serviços não confiáveis: o Mensagens podem ser perdidas; o Ordem das mensagens não é garantida; Cada mensagem é um datagrama: [sender (remetente), receiver (receptor), contents (conteúdo da mensagem)] Vantagem: É muito mais rápido que o modo orientado a conexão; 2. Sockets TCP/IP O processo de comunicação no modo orientado à conexão ocorre da seguinte forma: O servidor escolhe uma determinada porta (o termo correto seria porto, em inglês port, mas aqui no Brasil o termo utilizado comumente é porta) e fica aguardando conexões nesta porta. O cliente deve saber previamente qual a máquina servidora (host) e a porta que o servidor está aguardando conexões. Então o cliente solicita uma conexão em um host/porta, conforme demonstrado na figura 1.

Figura 1 Se nenhum problema ocorrer, o servidor aceita a conexão gerando um socket em uma porta qualquer do lado servidor, criando assim um canal de comunicação entre o cliente e o servidor. A figura 2 demonstra este canal de comunicação. Figura 2 Tipicamente o comportamento do servidor é ficar em um loop aguardando novas conexões e gerando sockets para atender as solicitações de clientes. A seguir serão apresentadas as ações necessárias para implementar comunicação sobre TCP através de um socket cliente e um socket servidor: 2.1. Criando um socket cliente: Passo 1 - Abrir a conexão: import java.io.* ; // streams import java.net.* ; // sockets //Conectar no servidor java.sun.com na porta 80. Socket client = new Socket( java.sun.com, 80);

Passo 2 - Obter fluxos (streams) de entrada e saída para comunicação com o servidor: //Cria um canal para receber dados. DataInputStream in=new DataInputStream(client.getInputStream()); //Cria um canal para enviar dados. DataOutputStream out=new DataOutputStream(client.getOutputStream()); Passo 3 - Realizar comunicação com o servidor: out.writeint( 3 ); //Envia o inteiro 3. out.writeutf( Hello ); //Envia a string Hello. int k = in.readint(); //Aguarda o recebimento de um inteiro. String s = in.readutf(); //Aguarda o recebimento de uma string. Passo 4 - Fechar fluxos (streams) e conexão: //Fecha os canais de entrada e saída. in.close(); out.close(); //Fecha o socket. client.close(); 2.2. Criando um socket servidor: Passo 1 - Criar o socket servidor: //Cria um socket servidor na porta 80 ServerSocket serversocket=new ServerSocket(80); Passo 2 - Aguardar novas conexões: // O metodo accept retorna um socket para comunicação com o próximo //cliente a conectar. // A execução do método bloqueia até que algum cliente conecte no servidor. Socket socket = serversocket.accept();

Passo 3 - Obter fluxos (streams) de entrada e saída para comunicação com o cliente: //Cria um canal para receber dados. DataInputStream in=new DataInputStream(socket.getInputStream()); //Cria um canal para enviar dados. DataOutputStream out=new DataOutputStream(socket.getOutputStream()); Passo 4 - Realizar comunicação com o servidor: int k = in.readint(); //Aguarda o recebimento de um int. String s = in.readutf() ; //Aguarda o recebimento de uma string. out.writeint(3); //Envia um int. out.writeutf( Hello ); //Envia uma string. Passo 5 - Fechar fluxos (streams) e socket cliente: //Fecha os canais in e out do socket que está atendendo o cliente in.close(); out.close(); //Fecha o socket que está atendendo o cliente. socket.close(); Passo 6 - Fechar o socket servidor: //Fechando o servidor. serversocket.close(); A utilização do modo orientado a conexão possibilita algumas funcionalidades interessantes como a utilização de canais unidirecionais, que podem ser obtidos através dos métodos socket.shutdowninput() ou socket.shutdownoutput(). Java provê também algumas implementações de alto nível para sockets TCP/IP, como por exemplo, um conector para o protocolo HTTP (java.net.httpurlconnection).

3. Sockets UDP/IP Sockets UDP/IP são muito mais rápidos que sockets TCP/IP. São mais simples, porém menos confiáveis. Em UDP não temos o estabelecimento de conexão, sendo que a comunicação ocorre apenas com o envio de mensagens. Uma mensagem é um datagrama, que é composto de um remetente (sender), um destinatário ou receptor (receiver), e a mensagem (content). Em UDP, caso o destinatário não esteja aguardando uma mensagem, ela é perdida. A figura 3 apresenta o envio de um datagrama de uma suposta máquina (Maq1) para outra (Maq2) em uma rede. Figura 3 A seguir serão apresentadas as ações necessárias para implementar comunicação utilizando sockets UDP: 3.1. Enviando uma mensagem: Passo 1 - Criar o socket: //sender socket não precisa de uma porta em especial. DatagramSocket clientsocket=new DatagramSocket(); Passo2 - Criando e enviando o datagrama: InetAddress addr=inetaddress.getbyname( www.javasoft.com ); String tosend = PERGUNTA ; byte[] buffer = tosend.getbytes(); //Enviar datagrama para destinatário na porta 4545. DatagramPacket question = new DatagramPacket(buffer, buffer.length, addr, 4545); //Envia o datagrama. clientsocket.send(question);

Passo 3 - Recebendo e abrindo uma resposta: //Passa um buffer e o tamanho do buffer para receber a mensagem. //Caso o conteúdo da mensagem recebida for maior que o buffer // o excedente é perdido. DatagramPacket answer=new DatagramPacket(new byte[512], 512); clientsocket.receive(answer); Passo 4 - Fechando o socket: //Fechando o socket. clientsocket.close(); 3.2. Recebendo mensagens: Passo 1 - Criando um socket servidor: //Escutando na porta 4545. DatagramSocket serversocket=new DatagramSocket(4545); Passo 2 - Recebendo um datagrama: //Cria o datagrama para receber uma mensagem. DatagramPacket question=new DatagramPacket(new byte[512], 512); //Aguarda até o recebimento de uma mensagem. serversocket.receive(question); Passo 3 - Enviando uma resposta: String tosend= RESPOSTA ; byte[] buffer = tosend.getbytes(); DatagramPacket answer = new DatagramPacket (buffer, buffer.length, question.getaddress()/*sender info*/, question.getport()/*sender info*/); serversocket.send(answer);

Passo 4 - Fechando o servidor: //Fechando o servidor. serversocket.close(); 3.3. Multicast O protocolo UDP suporta o envio de uma mensagem para um grupo de destinatários ao invés de um único destinatário. Isto é denominado multicast. Um grupo multicast é especificado por um endereço IP de classe D (224.0.0.1 até 239.255.255.255, inclusive) e uma porta UDP. Classes IP definem ranges de endereços. O endereço 224.0.0.0 é reservado e não deve ser utilizado. Em Java o suporte a multicast é oferecido através da classe java.net.multicastsocket. A seguir temos as ações necessárias para a utilização de multicast com sockets UDP. InetAddress group = InetAddress.getByName("228.5.6.7"); MulticastSocket s = new MulticastSocket(6789); // Entra no grupo. A partir deste momento as mensagens //para 228.5.6.7 serao recebidas em s. s.joingroup(group); // Envia e recebe mensagens UDP conforme apresentado anteriormente... // Retira-se do grupo. Mensagens para 228.5.6.7 //não mais chegarão até o socket s. s.leavegroup(group); 4. New I/O API O novo pacote de I/O (java.nio), introduzido na versão J2SE 1.4 traz novas funcionalidades e avanços significativos de desempenho em I/O em JAVA. Dentre as diversas funcionalidades temos uma nova abstração para I/O que são os canais (channels). Um canal é uma abstração que representa uma conexão entre entidades que fazem operações de I/O. No caso de sockets temos as classes java.nio.channels.serversocketchannel e java.nio.channels.socketchannel. A utilização de canais possibilita uma forma mais simples para realizar comunicação, pois basta abrir o canal, escrever e/ou ler, e ao final da execução, fechar o canal. As implementações destas classes de canais de socket utilizam as classes java.net.serversocket e java.net.socket, já vistas. Ao final deste artigo será apresentado um exemplo de utilização de canais para acessar um servidor www.

5. Conclusão Este artigo apresentou as principais formas de networking oferecidas por Java, porém o suporte a networking oferecido por Java é mais abrangente. Existem algumas configurações que podem ser realizadas na utilização de IP, como a configuração de timeouts (tempo de espera máximo para realização de operações), buffers (tamanho do buffer dos pacotes), keep alive (mensagem automática para verificação de disponibilidade dos pares em uma conexão quando a conexão não está em utilização), além de outras configurações. Estas configurações podem ser verificadas na interface java.net.socketoptions. Para os entusiastas em networking, temos algumas outras funcionalidades do J2SE 1.4 que não mencionamos, porém são muito interessantes. Entre elas podemos destacar o suporte à IPv6, suporte à operações assíncronas, suporte à Secure Socket Layer (permite socket seguro), além de outras novidades. Maiores detalhes podem ser encontrados em: http://java.sun.com/j2se/1.4.2/docs/guide/net/enhancements14.html

Exemplo de conexão em um servidor www utilizando Channels: import java.io.ioexception; import java.net.inetsocketaddress; import java.nio.charset.charset; import java.nio.bytebuffer; import java.nio.channels.socketchannel; public class Test { static public void main(string[] args) { Charset charset=charset.forname("utf-8"); SocketChannel channel=null; try { InetSocketAddress socketaddr= new InetSocketAddress("www.sumersoft.com", 80); //Abre a conexão channel=socketchannel.open(socketaddr); //Envia dados channel.write(charset.encode("get /index.html\r\n\r\n")); ByteBuffer buffer=bytebuffer.allocate(2048); //Enquanto houver dados pega do buffer e imprime. while((channel.read(buffer))!=-1) { buffer.flip(); System.err.println(charset.decode(buffer)); buffer.clear(); catch(ioexception e) { e.printstacktrace(); finally { if(channel!=null) { try { channel.close(); catch(ioexception e) { e.printstacktrace();

Autor: Leonardo R. Nunes - leonardo@sumersoft.com - Formado em Ciência da Computação pela PUCPR, mestrando em Sistemas Distribuídos na PUCPR, trabalha com desenvolvimento de software orientado a objetos utilizando Java desde 1997. Desenvolveu aplicações Java para a área de telefonia, área industrial e de telecomunicações. Atualmente é Diretor da Sumersoft Tecnologia (http://www.sumersoft.com) e Coordenador do PRoJAVA (http://www.projava.com.br).