[tp1]-thiago vieira tavares.pdf
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.