Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 2 1 Sockets
Aula 2 1 Sockets
Estrutura de dados
Tipo abstrato de dados
Sockets
(TAD)
Sockets
1. Introdução
SAIBA MAIS
2. Conexão
Request
Ouve
Cliente Servidor
Comunica
Protocolo UDP
o Protocolo não orientado à conexão. Não é necessário
efetuar o pedido de conexão antes de enviar a
mensagem.
o Não há garantia de entrega dos dados (não há
mensagens de confirmação).
o Perdas durante as transmissões não são tratadas por
este protocolo.
o Utilizado em redes com alta confiabilidade, onde as taxas
de perda são baixas.
o Exemplos: Videoconferência, transmissão de áudio e
vídeo.
SAIBA MAIS
<http://www.inf.ufes.br/~zegonc/material/Redes%20de%20Computadores%2
02011-2/1%20-%20Aulas/2012-1/O%20Protocolo%20TCP.pdf>.
- UDP: Disponível em: <http://www.cbpf.br/~sun/pdf/udp.pdf>.
3. Comunicação
4. Sockets em Java
Para criarmos uma aplicação em Java (DEITEL, 2010), que utiliza
Sockets, há pacotes que podemos utilizar. Os pacotes dependem do
protocolo a ser utilizado. Caso seja TCP, utilizamos as classes Socket e
ServerSocket que são do tipo StreamSocket. Se for UDP, utilizamos a classe
DatagramSocket.
O StreamSocket é orientado a conexão (o servidor precisa aceitar o
pedido de conexão do cliente) e o DatagramSocket é não orientado a
conexão.
Neste tópico, nós vamos criar um exemplo utilizando o protocolo TCP.
O StreamSocket utiliza as classes que estão nos seguintes pacotes:
SAIBA MAIS
1 import java.net.*;
2 import java.io.*;
3 public class Conexao {
4
5 public static void send(Socket socket,String txt)
6 {
7 OutputStream out;
8 try {
9 out = socket.getOutputStream();
10 out.write(txt.getBytes());
11 }catch (Exception e){
12 System.out.println(”Exceção no OutputStream");
13 }
14 }
15
16 public static String receive(Socket socket)
17 {
18 InputStream in;
19 int bt;
20 byte btxt[] = new byte[79];
21 String txt="";
22 try{
23 in = socket.getInputStream();
24 bt = in.read(btxt);
25 if (bt > 0) txt = new String(btxt);
26 } catch(Exception e){
27 System.out.println("Excecao no InputStream: "+e);
28 }return txt;
31 }
32 }
// Classe Servidor
1 public class Servidor
2 {
3 static ServerSocket serversocket;
4 static Socket client_socket;
5 static Conexao c;
6 static String msg;
7 public Servidor() {
8 try {
9 serversocket = new ServerSocket(9600);
10 }catch (Exception e) {
11 System.out.println("Nao criei o server socket..."); }
12 }
13
14 public static void main(String args[]) {
15 String texto;
16 new Servidor();
17 c = new Conexao();
18 try {
19 client_socket = serversocket.accept(); // fase de
conexão
20 for(int i=0; i<10; i++){
21 texto = c.receive(client_socket); // fase de
dados
22 System.out.println(texto);
23 c.send(client_socket,”Servidor Envia: Olá
Cliente");
24 }
25 7 – Classe Servidor client_socket.close(); serversocket.close();}
Figura //
desconexao
26 }catch (Exception e){
A aplicação do Servidor é composta pelas classes: Servidor e
27 e.printStackTrace();
28 }
Sistemas29distribuidos} } – Sockets 12
Conexão. Assim que a aplicação é executada, a classe Servidor chama o
construtor da sua classe e, nela vemos que a linha 9 realiza a criação de um
objeto do tipo ServerSocket. Ele é o responsável por criar o Socket do lado
do servidor que será responsável por aceitar os pedidos de conexão do
cliente. Na execução da linha 9, nós também definimos a porta que o Socket
do servidor ficará escutando os pedidos de conexão. No caso, definimos que
será a porá 9600.
Após isso, o Socket do servidor (serversocket) ficará em estado de
espera na linha 19, bloqueado no método accept. Ele sairá desta linha
somente quando o cliente fizer o pedido de conexão. Após ele executar o
método accept, retornamos um objeto da classe Socket (cliente_socket). Este
objeto retornado será o responsável pela comunicação com o cliente,
devendo ser utilizado para o envio e recebimento de mensagens.
Na fase de comunicação, o servidor fica em um loop de 10 iterações,
sendo que a cada iteração, o servidor recebe uma mensagem, imprime o
conteúdo da mensagem recebida e envia uma mensagem ao cliente com o
conteúdo “Servidor envia: Olá Cliente!”. Ao final das 10 iterações, o servidor
fecha a conexão do Socket e finaliza a sua execução.
Para o envio e o recebimento das mensagens, utilizamos os métodos
da classe Conexão.
Agora que já explicamos o funcionamento do Servidor, chegou o
momento de explicarmos o funcionamento do Cliente. A Figura 8 mostra a
classe Cliente que contém a lógica da aplicação cliente.
A aplicação do Cliente é composta pelas classes: Cliente e Conexão.
Assim que a aplicação é executada, a classe Cliente chama o construtor da
sua classe e, nela vemos que a linha 7 realiza a criação de um objeto do tipo
Socket. Ele é o responsável por criar o Socket do lado do cliente que será o
responsável por se conectar com o servidor e para realizar a troca de
mensagens. Na execução da linha 7, além da criação do objeto, nós também
realizamos a conexão com o servidor. Para isso, passamos como argumento
o ip e a porta que o servidor está escutando pedidos de conexão. No caso o
ip é 200.18.98.106 e a porta é a 9600.
Assim que esta linha é executada, o servidor aceita o pedido de
conexão, caso esteja bloqueado no método accept, e a troca de mensagens
entre o cliente e o servidor esteja liberada, com o canal de comunicação
estabelecido.
5. Referências
DEITEL, Paul; DEITEL, Harvey. Java, Como Programar. 8ª ed. São Paulo:
Pearson Prentice Hall Brasil, 2010.