






Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Os melhores documentos à venda: Trabalhos de alunos formados
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Comunidade
Peça ajuda à comunidade e tire suas dúvidas relacionadas ao estudo
Descubra as melhores universidades em seu país de acordo com os usuários da Docsity
Guias grátis
Baixe gratuitamente nossos guias de estudo, métodos para diminuir a ansiedade, dicas de TCC preparadas pelos professores da Docsity
como criar sockets em java
Tipologia: Notas de estudo
1 / 10
Esta página não é visível na pré-visualização
Não perca as partes importantes!
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 Modo orientado a datagrama UDP/IP
Desvantagens:
Vantagem:
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:
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);
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).
//Cria um canal para receber dados. DataInputStream in=new DataInputStream(socket.getInputStream()); //Cria um canal para enviar dados. DataOutputStream out=new DataOutputStream(socket.getOutputStream());
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.
//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();
//Fechando o servidor. serverSocket.close();
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:
//sender socket não precisa de uma porta em especial. DatagramSocket clientSocket=new DatagramSocket();
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);
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.
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.
//Fechando o servidor. serverSocket.close();
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. //não mais chegarão até o socket s. s.leaveGroup(group);
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
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).