You are on page 1of 12
Universidade Federal de Ouro Preto Instituto de Ciências Exatas e Aplicadas Curso de Engenharia Elétrica -

Universidade Federal de Ouro Preto Instituto de Ciências Exatas e Aplicadas Curso de Engenharia Elétrica - Campus João Monlevade

Universidade Federal de Ouro Preto Instituto de Ciências Exatas e Aplicadas Curso de Engenharia Elétrica -

Estrutura Básica de uma Aplicação de Rede Utilizando o Conceito de Socket

Thiago Vieira Tavares-10.2.8237

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.

João Monlevade

22/11/2014

Índice

1. Introdução

....................................................................................................................

3

2. Objetivo

.......................................................................................................................

4

  • 3. Métodos....................................................................................................

Materiais e

.5

  • 4. ..........................................................................................................................

Testes

..9

  • 4. Conclusão ....................................................................................................................11

5.

Referencias

Bibliográficas..........................................................................................

12

1_Introdução

Geralmente a comunicação entre máquinas e algumas vezes em processos na mesma máquina, é feita através do uso de sockets. Em que, o socket é o canal de comunicação através da qual as aplicações se comunicam. Existem três tipos de sockets, o datagram socket, que envia o pacote sem a confirmação de que o servidor recebeu. Stream Sockets, envia o pacote com cuidado de que o servidor recebe e que a conexão está mantida. Raw Sockets, envia o pacote sem utilizar as camadas de transporte, é usada de forma mais rústica na camada de rede (IP) e na Internet Control Message Protocol (ICMP). Muitas aplicações 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 são executados, criam-se um processo cliente e um processo servidor, que se comunica entre si lendo de seus sockets e escrevendo através deles [1]. Neste trabalho uma aplicação de uma rede local é implementada, em que, um processo cliente aciona o processo servidor enviando dois números e um operador aritmético, o processo servidor tem a tarefa de resolver a operação e enviar para o processo cliente a resposta.

2_Objetivo

O objetivo deste trabalho é implementar uma comunicação entre dois processos, um denominado cliente e o outro denominado servidor, estes processos estão situados em sistemas diferentes, a comunicação entre ambos será feita por meio do mecanismo socket. O processo cliente deve transmitir dois valores, mais a operação, para o processo servidor localizado no sistema remoto. O processo servidor receberá os valores e a operação e então, realizar o cálculo enviando a resposta para o processo cliente.

3_Materiais e Métodos

A primeira decisão tomada foi a maneira em que a aplicação rodaria, TCP ou UDP. Pelas características estudas para o modo de conexão TCP, em que, esse tipo de canal promove uma transmissão confiável de cadeia de bytes, pelo qual fluem dados entre dois sistemas finais. Assim, a conexão TCP garante que o processo servidor receberá cada byte na ordem que foram enviados. Ela garante uma conexão confiável entre os processos cliente e servidor. Por isso a maneira escolhida para a transmissão de dados foi pela conexão TCP. Essa aplicação utilizara socket para a comunicação entre o processo e o TCP. A figura 1 mostra como essa comunicação funciona.

3_Materiais e Métodos A primeira decisão tomada foi a maneira em que a aplicação rodaria, TCP

Figura 1-Processos que se comunicam através de sockets TCP.

O cliente inicia o contato com o servidor, por isso, o programa servidor não pode estar inativo, ele deve estar rodando antes de o cliente tentar iniciar o contato. O código 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 {

// Declaração das variáveis String num1,num2, op; // cadeia digitada pelo usuário String resultado; // cadeia obtida do servidor // Criando conexão Socket clientSocket = new Socket("localhost", 6789); // Cria a cadeia de saída 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

System.out.println("Digite o primeiro numero: "); BufferedReader inFromUser = new BufferedReader(

new InputStreamReader(System.

  • ));

num1 = inFromUser.readLine(); System.out.println("Digite o segundo numero: ");

BufferedReader inFromUser2 = new BufferedReader(

new InputStreamReader(System. num2 = inFromUser2.readLine(); System.out.println("Digite o operador: ");

  • ));

BufferedReader inFromUser3 = new BufferedReader(

new InputStreamReader(System.

  • ));

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 conexão TCP clientSocket.close();

}

}

O programa TCPCliente.java cria cinco cadeias e um socket. O socket é denominado clientsocket. A cadeias inFromUser, inFromUser2, inFromUser3 são as cadeias padrão para entrada de dados do usuário para o processo. A cadeia inFromServer é outra cadeia de entrada, ela também está ligada ao socket e recebe os dados da rede. Por último a cadeia outToServer ligada ao socket tem a função de enviar os caracteres a rede. Em um primeiro instante os objetos num1, num2, op são instanciados, esses objetos são as cadeias enviadas ao servidor. O objeto resultado é a cadeia obtida do servidor e mostrada na tela.

Socket
Socket

clientSocket = new

Socket
Socket

("198.168.0.105", 6789);

Essa linha de comando cria o objeto clientSocket do tipo Socket. Ela também ativa a conexão TCP entre cliente e servidor. Após aceitar a conexão, o servidor redireciona o cliente para outra porta dessa forma a porta 6789 fica liberada aguardando outra conexão.

DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader(New InputStreamReader( clientSocket.getInputStream()));

Essas linhas criam objetos de cadeia que são ligados ao socket. A cadeia outToServer fornece a saída 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 números e do operador do teclado.

outToServer.writeBytes(num1 + '\n');

Esse comendo é responsável por enviar a cadeia num1 para a rede, enviando, assim, para o servidor.

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

Os comandos acima são responsáveis por receber a cadeia enviada pelo servidor, mostrar o na tela essa cadeia e, por último, fechar o socket e a conexão TCP.

O código 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 {

// Declaração das Variáveis 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 Conexões 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;

}

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 não serão comentadas novamente.

ServerSocket welcomeSocket = new ServerSocket(6789);

Essa linha cria o objeto welcomeSocket, que é do tipo ServerSocket. Essa porta fica esperando a conexão do cliente.

Socket connectionSocket = welcomeSocket.accept();

Essa linha cria um novo socket para a conexão entre o processo servidor e o processo cliente, assim, outras conexões 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 código é responsável por fazer a operação matemática. Ela é objetivo principal desse trabalho.

result = Integer.toString(resultado); outToClient.writeBytes(result + '\n');

Por fim, essa ultima parte do codigo é responsável por enviar o resultado para o

cliente.

4_ Testes

No primeiro teste uma operação de adição é realizada entre os números 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 após o fim do teste.

4_ Testes No primeiro teste uma operação de adição é realizada entre os números 15 e

Figura 2-Processo Cliente em execução.

4_ Testes No primeiro teste uma operação de adição é realizada entre os números 15 e

Figura 3-Processo Servidor em execução.

No segundo teste uma operação de divisão é realizada entre os números 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 após o fim do teste.

No segundo teste uma operação de divisão é realizada entre os números 45 e 15. O

Figura 4-Processo Cliente em execução.

No segundo teste uma operação de divisão é realizada entre os números 45 e 15. O

Figura 5-Processo Servidor em execução.

5_ Conclusão

A principal dificuldade encontrada para a realização do código foi fazer a operação matemática no servidor, sendo que os dados recebidos do cliente eram do tipo string e para realizar a operação foi preciso transforma-los no tipo inteiro. Por fim, o código teve o desempenho esperado mesmo sendo testado em vários usuários remotos diferentes.

6_ Referencias Bibliográficas

[1]Kurose,Ross. REDES DE COMPUTADORES E A INTERNET: Uma Abordagem Top-Down. 5.ed. Pearson, 2010. [2]Theo Lins. Redes de Computadores. João Monlevade: Instituto de Ciências Exatas e Aplicadas ICEA.