Aula02_Sockets(2008-1).

Propaganda
Infra-Estrutura de Comunicação
(IF678)
Aula Prática 02
Programação de Sockets TCP e UDP
Hugo Simões ([email protected])
Original por: Flávio Almeida ([email protected])
Professor: Paulo Gonçalves ([email protected])
CIn/UFPE
Importante:
Cadastro no grupo da disciplina:
• http://groups.google.com.br/group/infracomunicao2008-1/subscribe
Nosso objetivo:
 Revisão sobre Socket
 Programação de Sockets TCP e UDP
 Desenvolver um servidor Web
3
Agenda
1.
2.
3.
4.
Comunicação entre processos
Programação de Socket TCP
Programação de Socket UDP
Desenvolver um servidor Web...
4
Comunicação entre processos
 Processos em hosts distintos comunicam-se por meio
de envio de mensagens...
 enviadas e recebidas através de seu socket
Socket é a interface entre
a camada de aplicação e a
de transporte
Analogia: Casa e porta (processo e
socket)
5
Interação dos programas cliente e
servidor (TCP) [1/2]
1.Cliente tem a tarefa de iniciar contato com o servidor.
2. Servidor deve está pronto:
 ativo, rodando antes do cliente tentar iniciar contato
 possuir alguma porta (socket) para acolher algum contato
inicial de um processo cliente.
3. O processo cliente pode iniciar uma conexão TCP, o que é feito a
partir da criação de um socket
 parâmetros do socket : Endereço IP do hospedeiro servidor e
o número de porta do processo servidor
Analogia: ‘bater à porta’ (contato inicial)
Interação dos programas cliente e
servidor (TCP) [2/2]
4. TCP cliente inicia uma apresentação de 3 vias
e estabelece uma conexão TCP com Servidor
 cliente “bate” no socket de entrada do
servidor
 servidor ‘ouve’ a batida e cria um novo
socket dedicado àquele cliente
 Ao final da apresentação, existe uma
conexão TCP entre o socket cliente e o novo
socket do servidor
Programação de Socket TCP - Client
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String argv[]) throws Exception {
String sentence;
String modifiedSentence;
BufferedReader inFromUser =
// cria Stream de entrada (teclado)
new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("hostname", 8000); // cria Socket Cliente, conecta ao servidor
DataOutputStream outToServer =
// cria Stream de saida(do cliente pro servidor)
new DataOutputStream(clientSocket.getOutputStream()); // junto ao socket cliente
BufferedReader inFromServer =new BufferedReader(new
InputStreamReader(clientSocket.getInputStream())); // cria Stream de entrada (vindo servidor)
// junto ao socket cliente
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n'); // envia a string ao servidor
modifiedSentence = inFromServer.readLine(); // ler string que veio do servidor
System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();
}
}
8
Programação de Socket TCP - Server
import java.io.*;
import java.net.*;
class TCPServer {
public static void main(String argv[]) throws Exception {
String clientSentence;
String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(8000); //cria porta de entrada de numero 8000
while(true) {
Socket connectionSocket =
welcomeSocket.accept(); // Aguardando no socket de entrada, um contato do cliente
// para criar nova porta dedicada ao cliente especifico
BufferedReader inFromClient = // cria Stream de entrada (vindo do Cliente) junto ao socket de conex
new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = //cria Stream de saida (do Servidor pro cliente) junto ao socket de conx
new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence); //envia String para o cliente
}
}
}
9
Programação de Socket UDP - Client
import java.io.*;
import java.net.*;
class UDPClient {
public static void main(String args[]) throws Exception {
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("hostname");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9000);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
}
}
10
Programação de Socket UDP - Server
import java.io.*;
import java.net.*;
class UDPServer {
public static void main(String args[]) throws Exception {
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while(true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String(receivePacket.getData());
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
}
}
}
11
Desenvolver um servidor Web...
 Trata-se de um servidor Web, que responderá a requisições HTTP,
bastante simples. Com as seguintes regras:
 Deve ser implementado utilizando-se a API de Java
 Ele deve manipular apenas uma requisição HTTP;
 Ele deve enviar uma mensagem de resposta ao cliente contendo
linhas de cabeçalho e o objeto desejado, se existente;
 A única verificação necessária é quando o objeto não for
encontrado, deve-se retornar: “HTTP/1.0 404 Not Found”
 Teste seu servidor utilizando um navegador qualquer!
 Mantenha os arquivos que serão baixados na mesma pasta do seu
projeto
Dicas: - utilize as classes ServerSocket, Socket, StringTokenizer e File
- reveja a aula sobre HTTP
- consulte o RFC[2616]
- baixar código parcial em www.cin.ufpe.br/~ejgcs/comunicacao no
link [Aulas]
12
Exemplo – O que deve ser feito
Requisição (via browser ou telnet)
Requisição (via browser ou telnet)
GET /index.html HTTP/1.0
Host: localhost
GET /img2.png HTTP/1.0
Host: localhost
Resposta (seu servidor)
Resposta (seu servidor)
HTTP/1.0 200 OK
Content-Language: pt-BR
Content-Length: 53
Content-Type: text/html
Connection: close
CRLF “enter”
dados
...
HTTP/1.0 200 OK
Content-Language: pt-BR
Content-Length: 733
Content-Type: image/png
Connection: close
CRLF “enter”
dados
...
13
Referências
1.
2.
3.
4.
5.
James F. Kurose and Keith W. Ross, "Redes de Computadores e a
Internet - Uma Nova Abordagem", 3a. edição - 2005 - Ed. Addison
Wesley BRA
http://www.rfc.net/
http://www.ietf.org/rfc.html
http://java.sun.com/j2se/1.5.0/docs/api/java/net/packagesummary.html
http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html
14
Download