Curso Superior em Redes de Computadores Camada de Aplicação Prof. Sales Filho <[email protected]> Objetivo Apresentar uma implementação clienteservidor Socket UDP Socket TCP Realizar captura de pacotes das implementações apresentadas 2 Interface Socket Clientes e servidores UDP Modelo de implementação Servidor UDP socket bind recvfrom sendto close Comunicação socket sendto recvfrom close Cliente UDP 3 Implementação :: Servidor UDP import java.io.*; import java.net.*; class UDPServer { public static void main(String args[]) throws Exception { // cria socket do servidor com a porta 9876 DatagramSocket serverSocket = new DatagramSocket(9876); byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while(true) { // declara o pacote a ser recebido DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); // recebe o pacote do cliente serverSocket.receive(receivePacket); // pega os dados, o endereço IP e a porta do cliente para poder mandar a msg de volta String sentence = new String( receivePacket.getData()); InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); // transforma em maiúsculas String capitalizedSentence = sentence.toUpperCase(); sendData = capitalizedSentence.getBytes(); // monta o pacote com enderço IP e porta DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); // envia ao cliente serverSocket.send(sendPacket); } } } 4 Implementação :: Cliente UDP import java.io.*; // classes para input e output streams e import java.net.*;// DatagramaSocket,InetAddress,DatagramaPacket class UDPClient { public static void main(String args[]) throws Exception { // cria o stream do teclado BufferedReader inFromUser = new BufferedReader(new InputStreamReader (System.in)); DatagramSocket clientSocket = new DatagramSocket(); // declara socket cliente // obtem endereço IP do servidor com o DNS InetAddress IPAddress = InetAddress.getByName("hostname"); byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence = inFromUser.readLine(); // lê uma linha do teclado sendData = sentence.getBytes(); // cria pacote com o dado, o endereço do server e porta do servidor DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); clientSocket.send(sendPacket); //envia o pacote // declara o pacote a ser recebido DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); // recebe pacote do servidor // separa somente o dado recebido String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedSentence); // mostra no vídeo clientSocket.close(); // fecha o cliente } } 5 Interface Socket Clientes e servidores TCP Modelo de implementação Servidor TCP socket bind Listen Sincronização socket connect accept read write close Comunicação write read close Cleinte TCP 6 Projeto de servidores Tratamento de requisições Servidor Iterativo Adequado para serviços com reduzida taxa de requisição Requisições com baixa carga de processamento Servidor TCP socket bind Listen accept read write close Socket original Novo socket 7 Implementação :: Servidor import java.io.*; import java.net.*; class TCPServer { public static void main(String argv[]) throws Exception { String clientSentence; String capitalizedSentence; // cria socket de comunicação com os clientes na porta 6789 (bind) ServerSocket welcomeSocket = new ServerSocket(6789); // espera msg de algum cliente e trata while(true) { // espera conexão de algum cliente Socket connectionSocket = welcomeSocket.accept(); // cria streams de entrada e saida com o cliente que chegou BufferedReader inFromClient = new BufferedReader(new InputStreamReader( connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream( connectionSocket.getOutputStream()); // lê uma linha do cliente clientSentence = inFromClient.readLine(); // transforma a linha em maiúsculas capitalizedSentence = clientSentence.toUpperCase() + '\n'; // envia a linha maiúscula para o cliente outToClient.writeBytes(capitalizedSentence); } } 8 Implementação :: Cliente import java.io.*; // classes para input e output streams import java.net.*; // classes para socket, serversocket e clientsocket class TCPClient { public static void main(String argv[]) throws Exception { String sentence; String modifiedSentence; // cria o stream do teclado BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in)); // cria o socket de acesso ao server hostname na porta 6789 Socket clientSocket = new Socket("hostname", 6789); // cria os streams (encadeamentos) de entrada e saida com o servidor DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader(new inputStreamReader( clientSocket.getInputStream())); // le uma linha do teclado e coloca em sentence sentence = inFromUser.readLine(); // envia a linha para o server outToServer.writeBytes(sentence + '\n'); // lê uma linha do server modifiedSentence = inFromServer.readLine(); // apresenta a linha do server no vídeo System.out.println("FROM SERVER " + modifiedSentence); // fecha o cliente clientSocket.close(); } } 9 Atividade Compile e execute Analise com o WireShark Cliente e Servidor UDP Cliente e Servidor TCP Clientes e servidores UDP/TCP Realize teste de bind em portas reservadas com processos de usuário 10 Referências Comer, Douglas E., Interligação de Redes Com Tcp/ip James F. Kurose, Redes de Computadores e a Internet Escola Superior de Redes, Arquitetura e Protocolos de Redes TCP/IP 11