[tp1]-thiago vieira tavares.pdf

12
Estrutura Básica de uma Aplicação de Rede Utilizando o Conceito de Socket Thiago Vieira Tavares-10.2.8237 João Monlevade 22/11/2014 Universidade Federal de Ouro Preto Instituto de Ciências Exatas e Aplicadas Curso de Engenharia Elétrica - Campus João Monlevade Relatório, da Matéria Redes de Computadores 1, do curso de Engenharia Elétrica da UFOP, como requisito para complementar o aprendizado na disciplina.

Upload: thiagovt2

Post on 14-Nov-2015

219 views

Category:

Documents


0 download

TRANSCRIPT

  • Estrutura Bsica de uma Aplicao de Rede Utilizando o

    Conceito de Socket

    Thiago Vieira Tavares-10.2.8237

    Joo Monlevade

    22/11/2014

    Universidade Federal de Ouro Preto

    Instituto de Cincias Exatas e Aplicadas

    Curso de Engenharia Eltrica - Campus Joo Monlevade

    Relatrio, da Matria Redes de

    Computadores 1, do curso de Engenharia

    Eltrica da UFOP, como requisito para

    complementar o aprendizado na

    disciplina.

  • 2

    ndice

    1. Introduo.................................................................................................................... 3

    2. Objetivo....................................................................................................................... 4

    3. Materiais e Mtodos.................................................................................................... .5

    4. Testes.......................................................................................................................... ..9

    4. Concluso....................................................................................................................11

    5. Referencias Bibliogrficas.......................................................................................... 12

  • 3

    1_Introduo

    Geralmente a comunicao entre mquinas e algumas vezes em processos na

    mesma mquina, feita atravs do uso de sockets. Em que, o socket o canal de

    comunicao atravs da qual as aplicaes se comunicam. Existem trs tipos de sockets,

    o datagram socket, que envia o pacote sem a confirmao de que o servidor recebeu.

    Stream Sockets, envia o pacote com cuidado de que o servidor recebe e que a conexo

    est mantida. Raw Sockets, envia o pacote sem utilizar as camadas de transporte, usada

    de forma mais rstica na camada de rede (IP) e na Internet Control Message Protocol

    (ICMP).

    Muitas aplicaes de rede consistem em um par de programas, um programa

    cliente e um programa servidor, que residem em dois sistemas finais diferentes. Quando

    esses programas so executados, criam-se um processo cliente e um processo servidor,

    que se comunica entre si lendo de seus sockets e escrevendo atravs deles [1].

    Neste trabalho uma aplicao de uma rede local implementada, em que, um

    processo cliente aciona o processo servidor enviando dois nmeros e um operador

    aritmtico, o processo servidor tem a tarefa de resolver a operao e enviar para o

    processo cliente a resposta.

  • 4

    2_Objetivo

    O objetivo deste trabalho implementar uma comunicao entre dois processos,

    um denominado cliente e o outro denominado servidor, estes processos esto situados em

    sistemas diferentes, a comunicao entre ambos ser feita por meio do mecanismo socket.

    O processo cliente deve transmitir dois valores, mais a operao, para o processo servidor

    localizado no sistema remoto. O processo servidor receber os valores e a operao e

    ento, realizar o clculo enviando a resposta para o processo cliente.

  • 5

    3_Materiais e Mtodos

    A primeira deciso tomada foi a maneira em que a aplicao rodaria, TCP ou

    UDP. Pelas caractersticas estudas para o modo de conexo TCP, em que, esse tipo de

    canal promove uma transmisso confivel de cadeia de bytes, pelo qual fluem dados entre

    dois sistemas finais. Assim, a conexo TCP garante que o processo servidor receber cada

    byte na ordem que foram enviados. Ela garante uma conexo confivel entre os processos

    cliente e servidor. Por isso a maneira escolhida para a transmisso de dados foi pela

    conexo TCP. Essa aplicao utilizara socket para a comunicao entre o processo e o

    TCP. A figura 1 mostra como essa comunicao funciona.

    Figura 1-Processos que se comunicam atravs de sockets TCP.

    O cliente inicia o contato com o servidor, por isso, o programa servidor no pode

    estar inativo, ele deve estar rodando antes de o cliente tentar iniciar o contato. O cdigo

    implementado para o processo cliente mostrado e comentado abaixo.

    package TCP; import java.io.*; import java.net.*; class TCPCliente { public static void main(String argv[]) throws Exception { // Declarao das variveis String num1,num2, op; // cadeia digitada pelo usurio String resultado; // cadeia obtida do servidor // Criando conexo Socket clientSocket = new Socket("localhost", 6789); // Cria a cadeia de sada conectada ao socket DataOutputStream outToServer = new DataOutputStream( clientSocket.getOutputStream()); // Criando cadeia de entrada conectada ao socket BufferedReader inFromServer = new BufferedReader(new InputStreamReader( clientSocket.getInputStream())); // Dados do teclado

  • 6

    System.out.println("Digite o primeiro numero: "); BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in)); num1 = inFromUser.readLine(); System.out.println("Digite o segundo numero: "); BufferedReader inFromUser2 = new BufferedReader( new InputStreamReader(System.in)); num2 = inFromUser2.readLine(); System.out.println("Digite o operador: "); BufferedReader inFromUser3 = new BufferedReader( new InputStreamReader(System.in)); op = inFromUser3.readLine(); // Envia os caracteres para a rede outToServer.writeBytes(num1 + '\n'); outToServer.writeBytes(num2 + '\n'); outToServer.writeBytes(op + '\n'); // A cadeia resultado recebe os caracteres do servidor resultado = inFromServer.readLine(); // Mostra no monitor a resposta do servidor System.out.println("FROM SERVER: " + resultado); // Fecha o Socket e a conexo TCP clientSocket.close(); } }

    O programa TCPCliente.java cria cinco cadeias e um socket. O socket

    denominado clientsocket. A cadeias inFromUser, inFromUser2, inFromUser3 so as

    cadeias padro para entrada de dados do usurio para o processo. A cadeia

    inFromServer outra cadeia de entrada, ela tambm est ligada ao socket e recebe os

    dados da rede. Por ltimo a cadeia outToServer ligada ao socket tem a funo de enviar

    os caracteres a rede.

    Em um primeiro instante os objetos num1, num2, op so instanciados, esses

    objetos so as cadeias enviadas ao servidor. O objeto resultado a cadeia obtida do

    servidor e mostrada na tela. Socket clientSocket = new Socket("198.168.0.105", 6789);

    Essa linha de comando cria o objeto clientSocket do tipo Socket. Ela tambm ativa a

    conexo TCP entre cliente e servidor. Aps aceitar a conexo, o servidor redireciona o

    cliente para outra porta dessa forma a porta 6789 fica liberada aguardando outra conexo. DataOutputStream outToServer =

    new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer =

    new BufferedReader(New InputStreamReader( clientSocket.getInputStream()));

    Essas linhas criam objetos de cadeia que so ligados ao socket. A cadeia

    outToServer fornece a sada do processo para o socket. A cadeia inFromServer fornece

    ao processo a entrada do socket BufferedReader inFromUser = new BufferedReader(new

    InputStreamReader(System.in)); num1 = inFromUser.readLine();

    Essa linha de comando permite a leitura dos nmeros e do operador do teclado. outToServer.writeBytes(num1 + '\n');

    Esse comendo responsvel por enviar a cadeia num1 para a rede, enviando,

    assim, para o servidor.

  • 7

    resultado = inFromServer.readLine(); System.out.println("FROM SERVER: " + resultado); clientSocket.close();

    Os comandos acima so responsveis por receber a cadeia enviada pelo servidor,

    mostrar o na tela essa cadeia e, por ltimo, fechar o socket e a conexo TCP.

    O cdigo do programa TCPServidor.java mostrado a seguir. package TCP; import java.io.*; import java.net.*; class TCPServidor { public static void main(String argv[]) throws Exception { // Declarao das Variveis String num1, num2, op, result; int a, b, resultado = 0; char c; // Criando o objeto welcomeSocket do tipo ServerSocket ServerSocket welcomeSocket = new ServerSocket(6789); while(true){ // Aguardando Conexes Socket connectionSocket = welcomeSocket.accept();// cria o novo socket BufferedReader inFromClient = new BufferedReader(new InputStreamReader( connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream( connectionSocket.getOutputStream()); // Recebe os dados dos clientes num1 = inFromClient.readLine(); System.out.println("Dado recebido, " + num1); num2 = inFromClient.readLine(); System.out.println("Dado recebido, " + num2); op = inFromClient.readLine(); System.out.println("Dado recebido, " + op); // Passa os dados para inteiro e para caractere a = Integer.parseInt(num1); b = Integer.parseInt(num2); c = op.charAt(0); switch(c){ case'+': resultado = a + b; break; case'-': resultado = a - b; break; case'*': resultado = a * b; break; case'/': resultado = a / b; break;

  • 8

    } result = Integer.toString(resultado); System.out.println("resultado = " + result); // Envia os dados para o cliente outToClient.writeBytes(result + '\n'); } } }

    TCPServidor possui muitas linhas de comando semelhantes com TCPCliente, por

    isso essas linhas no sero comentadas novamente. ServerSocket welcomeSocket = new ServerSocket(6789); Essa linha cria o objeto welcomeSocket, que do tipo ServerSocket. Essa porta

    fica esperando a conexo do cliente. Socket connectionSocket = welcomeSocket.accept(); Essa linha cria um novo socket para a conexo entre o processo servidor e o

    processo cliente, assim, outras conexes podem ser realizadas na porta 6789 entre o

    servidor e outros clientes. a = Integer.parseInt(num1); b = Integer.parseInt(num2); c = op.charAt(0); switch(c){ case'+': resultado = a + b; break; case'-': resultado = a - b; break; case'*': resultado = a * b; break; case'/': resultado = a / b; break; }

    Essa parte do cdigo responsvel por fazer a operao matemtica. Ela objetivo

    principal desse trabalho. result = Integer.toString(resultado);

    outToClient.writeBytes(result + '\n');

    Por fim, essa ultima parte do codigo responsvel por enviar o resultado para o

    cliente.

  • 9

    4_ Testes

    No primeiro teste uma operao de adio realizada entre os nmeros 15 e 7. O

    resultado obtido e mostrado no promp de comando deve ser igual a 22. As figuras 2 e 3

    mostram os processos cliente e servidor aps o fim do teste.

    Figura 2-Processo Cliente em execuo.

    Figura 3-Processo Servidor em execuo.

  • 10

    No segundo teste uma operao de diviso realizada entre os nmeros 45 e 15.

    O resultado obtido e mostrado no promp de comando deve ser igual a 3. As figuras 4 e 5

    mostram os processos cliente e servidor aps o fim do teste.

    Figura 4-Processo Cliente em execuo.

    Figura 5-Processo Servidor em execuo.

  • 11

    5_ Concluso

    A principal dificuldade encontrada para a realizao do cdigo foi fazer a

    operao matemtica no servidor, sendo que os dados recebidos do cliente eram do tipo

    string e para realizar a operao foi preciso transforma-los no tipo inteiro.

    Por fim, o cdigo teve o desempenho esperado mesmo sendo testado em vrios

    usurios remotos diferentes.

  • 12

    6_ Referencias Bibliogrficas

    [1]Kurose,Ross. REDES DE COMPUTADORES E A INTERNET: Uma Abordagem

    Top-Down. 5.ed. Pearson, 2010. [2]Theo Lins. Redes de Computadores. Joo Monlevade: Instituto de Cincias Exatas e Aplicadas ICEA.