Java : Comunicação Cliente-Servidor.



Documentos relacionados
Aula 30 - Sockets em Java

Threads e Sockets em Java. Threads em Java. Programas e Processos

Sistemas Distribuídos

INF1013 MODELAGEM DE SOFTWARE

THREADS EM JAVA. George Gomes Cabral

Invocação de Métodos Remotos RMI (Remote Method Invocation)

Como foi exposto anteriormente, os processos podem ter mais de um fluxo de execução. Cada fluxo de execução é chamado de thread.

Descrição. Implementação. Departamento de Informática e Estatística Universidade Federal de Santa Catarina LAB 4 Transferência de Arquivos

Olho por olho, e o mundo acabará cego. Mohandas Gandhi

Threads e Concorrência em Java (Material de Apoio)

Analisar os sistemas operacionais apresentados na figura e responder as questões abaixo: Identificar

Multithreading. Programação Orientada por Objectos com Java. Ademar Aguiar. MRSC - Programação em Comunicações

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

Um pouco do Java. Prof. Eduardo

Capítulo II Modelos de Programação Distribuída

Persistência de Classes em Tabelas de Banco de Dados

Programação Orientada a Objetos em Java

Universidade da Beira Interior. Sistemas Distribuídos

Programação com sockets (em Java)

Exercício 1 : As classes abaixo serão utilizadas neste exercício: public class Ponto { int x; int y; public Ponto(int x, int y){ this.

Conexão Socket na MIDP

SISTEMAS DISTRIBUÍDOS

Cliente-servidor com Sockets TCP

insfcanceof new public switch transient while byte continue extends for int null

Aplicações, durante a execução, podem incorrer em muitas espécies de erros de vários graus de severidade Quando métodos são invocados sobre um objeto:

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

Sistemas Paralelos e Distribuídos /2004 Curso: Matemática /Informática Sistemas Distribuídos /2004 Curso: Ensino da Informática

Java Threads. Introdução

Implementação de Classe e Auto-Relacionamento em Java

Threads em Java. Sistemas Operacionais - Laboratório Professor Machado

Programação Orientada a Objetos em Java. Threads Threads Threads. Threads

Java. Marcio de Carvalho Victorino

Programação Paralela e Distribuída. Prof. Cidcley T. de Souza

FTP FILE F TRANSFER PROTOCOL. Tópicos

(Aula 17) Threads em Java

Exemplos práticos do uso de RMI em sistemas distribuídos

Java para Desenvolvimento Web

Num sistema de objectos distribuídos, dois conceitos são fundamentais.

Java 2 Standard Edition Como criar classes e objetos


Invocação de Métodos Remotos

Programação em Rede Baseada em Java. Luiz Affonso Guedes Tópicos em Redes de Computadores Programação Distribuída

Mecanismos de Comunicação. Sockets em java (

FBV - Linguagem de Programação II. Um pouco sobre Java

Tutorial RMI (Remote Method Invocation) por Alabê Duarte

IMPLEMENTAÇÃO DE SOCKETS E THREADS NO DESENVOLVIMENTO DE SISTEMAS CLIENTE / SERVIDOR: UM ESTUDO EM VB.NET

Sistemas Distribuídos

Implementando uma Classe e Criando Objetos a partir dela

Sockets com Java Parte I

Noções sobre Objetos e Classes

Programação Concorrente em Java. Profa Andréa Schwertner Charão DLSC/CT/UFSM

Universidade Federal da Paraíba

Sistemas Distribuídos

Tipos de Servidores. Servidores com estado

Chamadas Remotas de Procedimentos (RPC) O Conceito de Procedimentos. RPC: Programa Distribuído. RPC: Modelo de Execução

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Sistemas Distribuídos

a) Desenhe os respetivos diagramas de sequência e de colaboração associado a este caso de uso..

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento NetBeans Introdução à Linguagem de Programação JAVA

SIMULADOR DE ROTEAMENTO DE PACOTES (V. 3 20/05/2010)

Programação de sockets com TCP

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Uma aplicação distribuída

Orientação a Objetos

Introdução a Java. Hélder Nunes

Aula 04 Operadores e Entrada de Dados. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Programação Concorrente em java - Exercícios Práticos Abril 2004

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Objetos Distribuídos - Programação Distribuída Orientado a Objetos. Luiz Affonso Guedes

ECD1200 Equipamento de Consulta de Dados KIT DE DESENVOLVIMENTO

Java 2 Standard Edition Fundamentos de

Programação Gráfica em Java.

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

Sockets. Introdução. Introdução. Programando para redes em Java. mecanismo de alto nível para acessar recursos na Internet.

Acesso a Banco. Conexão em Java. Conexão em Java. Programação Orientada a Objetos Profa. Cristiane e Prof. Daniel

Orientação a Objetos

Fundamentos de Programaçã. ção Concorrente

Sistemas Distribuídos

TRBOnet MDC Console. Manual de Operação

Redes de Computadores /1

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento Eclipse Introdução à Linguagem de Programação JAVA

Exercícios de Revisão Java Básico

PROTÓTIPO TIPO DE SISTEMA DE MONITORAMENTO REMOTO UTILIZANDO TCP/IP SOBRE ETHERNET (802.3)

Programação: Sockets em Java

Programação de Redes de Computadores em Java

Sockets em Java. Leonardo R. Nunes - leonardo@sumersoft.com. 1. Introdução. 2. Sockets TCP/IP

Desenvolvimento de Aplicações Java/CORBA

Orientação a Objetos

Uma Introdução à Arquitetura CORBA. O Object Request Broker (ORB)

Programação de Computadores - I. Profª Beatriz Profº Israel

Comunicação via Sockets. Prof. Orlando Loques - IC/UFF. versão

socket Objetivo: aprender a construir aplicações cliente/servidor que se comunicam usando sockets

Exemplos práticos do uso de RMI em sistemas distribuídos

Transcrição:

Java : Comunicação Cliente-Servidor. Objetivo: Capacitar o aluno a desenvolver uma aplicação servidora para múltiplos clientes. Apresentar as classes Socket e ServerSocket, classes de fluxo de dados, a classe Thread, a interface Runnable e a classe Vector. Apresentar, também, a prática de definição de protocolos de comunicação. Sumário Introdução... 2 1. Threads... 2 A classe Thread... 2 Exemplo de Thread... 2 Inicialização da Thread:... 2 Exemplo de chamada de duas Threads:... 2 Comentários:... 3 2. As Classes Socket e ServerSocket... 4 O que é um Socket?... 4 A classe Socket:... 4 A classe ServerSocket:... 4 Exemplo de Servidor com ServerSocket e Socket:... 4 Exemplo de Cliente... 8 1

Introdução Uma aplicação servidora deve ser capaz de fornecer serviços a clientes que se conectem a ela. Através de uma rede TCP/IP, um servidor gerencia uma porta de entrada. O TCP/IP é um conjunto de protocolos desenvolvido de modo a permitir que computadores compartilhem recursos através da rede. Qualquer cliente que queira acessar os serviços de uma aplicação, o faz através dessa porta de entrada. O servidor necessita, constantemente, verificar na porta se algum cliente está solicitando um serviço. Essa ação pode ser realizada em Java, através da classe Thread ou da interface Runnable. Threads e Runnables são executadas de forma concorrente com o sistema operacional e outras aplicações. Uma Thread ou Runnable possuem a assinatura de método public void run(). Quando disparada, tanto a Thread quanto a Runnable, executam esse método de forma concorrente com os outros serviços do sistema operacional. 1. Threads A classe Thread A classe Thread permite definir um serviço no sistema operacional. A Java Virtual Machine permite que uma aplicação possua diversos serviços sendo executadas de forma concorrente. No exemplo abaixo, a classe Servidor extende essa classe Thread. Exemplo de Thread /*01*/ ///////// arquivo Servidor.java /*02*/ public class Servidor extends Thread /*03*/ { /*04*/ int i=0; Inicialização da Thread: /*05*/ public void run() /*06*/ { /*07*/ while(true) /*08*/ { /*09*/ System.out.print("\r"+(++i)); /*10*/ } /*11*/ } /*12*/ public static void main(string[] a) /*13*/ { Servidor s = new Servidor(); /*14*/ s.start(); //disparo da Thread /*15*/ } } A inicialização da Thread é feita através da chamada do método start(), conforme exemplificado na linha 14 do código anterior. Essa instrução irá executar o serviço definido no método public void run(). Exemplo de chamada de duas Threads: /*01*/ ///////// arquivo Servidor.java /*02*/ public class Servidor extends Thread { /*03*/ int i=0; /*04*/ int espera=0; /*05*/ public Servidor(String n,int tempo) /*06*/ {setname(n);espera=tempo;} /*07*/ public void run() 2

/*08*/ { /*09*/ while(true) /*10*/ { System.out.print("\r" + getname() /*11*/ +":" + (++i)); /*12*/ try {sleep(espera);} /*13*/ catch (InterruptedException erro){} /*14*/ } } Comentários: /*15*/ public static void main(string[] a) /*16*/ { Servidor s = new Servidor("contador",1000); /*17*/ s.start(); /*18*/ Servidor s2 = new Servidor("cont",100); /*19*/ s2.start(); /*20*/ } } O primeiro exemplo, o arquivo Servidor.java, foi modificado. Nessa modificação, a função sleep( milisegundos ) é inserida ao código. Essa função permite que a Thread adormeça. Esse tempo de espera é fornecido no construtor, bem como um nome para a Thread. Um destaque deve ser dado à necessidade da estrutura try... catch (InterruptedException). O método main inicializa dois serviços, s e s2, conforme exemplificam as linhas 16 a 19 do código anterior. A figura abaixo ilustra um snapshot da execução. A Thread instanciada por s, possui o nome contador e o tempo de espera de 1000 milisegundos. Cada execução dessa Thread, o nome da thread é impresso, um valor incrementado também é impresso e uma espera de 1000 milisegundos é disparada. A instância s2, por outro lado, possui o tempo de espera de 100 milisegundos e o seu nome é cont. Ela imprime o seu nome e outro valor é incrementado e impresso. Observe que o caracter \r na instrução System.out.print, faz com que essas impressões sejam sobrepostas. Logo, a thread s2 é executado mais vezes que a thread s. 3

2. As Classes Socket e ServerSocket O que é um Socket? A classe Socket: A classe ServerSocket: Exemplo de Servidor com ServerSocket e Socket: Um Socket é uma combinação de um computador com o número da porta. Essa combinação identifica uma porta de entrada para uma aplicação. Classe que implementa um cliente socket. Um socket é o ponto final da comunicação entre duas máquinas. Classe que implementa um servidor de socket. Um servidor de sockets espera pela solicitação de usuários da rede de computador.. Ele executa algumas operações baseadas na solicitação recebida e retorna valores. Dos métodos disponíveis, o principal é o construtor. Nele é definido a porta de leitura. Linhas 8 e 20 do código abaixo. /*1*/ /////////////////////// arquivo Servidor.java /*2*/ import java.io.*; /*3*/ import java.net.*; /*4*/ import java.util.*; /*5*/ public class Servidor extends Thread /*6*/ { /*7*/ private int porta; /*8*/ private ServerSocket ouvido; /*9*/ private ObjectOutputStream output; // fluxo de saida de dados. /*10*/ private ObjectInputStream instream; // fluxo de entrada de dados. /*11*/ private Vector listajogador = new Vector(); /*12*/ private Jogador visitante; /*13*/ /*14*/ public void conecta(int porta) /*15*/ { /*16*/ // armazena o numero da porta em uma // variavel denomiada por "porta" /*17*/ this.porta = porta; /*18*/ try /*19*/ { /*20*/ ouvido = new java.net.serversocket(porta); // tenta se conectar com a porta. /*21*/ } /*22*/ catch(java.io.ioexception e) {e.printstacktrace(); System.exit(1);} // se deu erro, entao encerre a aplicação. /*23*/ /*24*/ System.out.println( "Servidor no ar na porta " + porta + "!!"); // se não deu erro, informe que o servidor está no ar // na porta definida. /*25*/ } /*26*/ /*27*/ public Servidor(String n,int gate) /*28*/ {setname(n); /*29*/ conecta(gate); /*30*/ } /*31*/ /*32*/ public void run() /*33*/ { 4

/*34*/ while(true) /*35*/ { /*36*/ try /*37*/ { /*38*/ // servidor.accept() => espera por um //cliente, quando o cliente solicita //conexao, /*39*/ // uma instancia da classe Jogador eh // criada para representar essa conexao. /*40*/ /*41*/ visitante =new Jogador(ouvido.accept()); /*42*/ visitante.start(); /*43*/ addjogador(visitante); /*44*/ visitante.informe( "Bem Vindo a porta : "+porta); /*45*/ visitante.informe("[nome?]"); /*46*/ } catch (java.io.ioexception e) {} /*47*/ } /*48*/ /*49*/ } /*50*/ /*51*/ public static void main(string[] a) /*52*/ { Servidor s = new Servidor("contador",5555); /*53*/ s.start(); /*54*/ Servidor s2 = new Servidor("cont",6666); /*55*/ s2.start(); /*56*/ } /*57*/ /*58*/ private void removejogador(jogador j) /*59*/ { /*60*/ listajogador.remove(j); /*61*/ } /*62*/ /*63*/ // adiciona um jogador na lista de jogadores. /*64*/ private void addjogador (Jogador j) /*65*/ { /*66*/ listajogador.add(j); /*67*/ } /*68*/ /*69*/ //////////////definiçao interna de classe /*70*/ class Jogador extends Thread{ /*71*/ private ObjectOutputStream output; // fluxo de saida de dados. /*72*/ private ObjectInputStream instream; // fluxo de entrada de dados. /*73*/ private Socket connection; // armazena ponteiro para o servidor. /*74*/ private boolean noar=true; /*75*/ private String nome=""; /*76*/ /*77*/ // construtor da classe /*78*/ public Jogador(Socket s) /*79*/ { /*80*/ connection=s; // armazena a conexao com o servidor. /*81*/ try{ /*82*/ output = new ObjectOutputStream(s.getOutputStream()); // cria fluxo de saida de dados. 5

/*83*/ instream = new ObjectInputStream(s.getInputStream()); // cria fluxo de entrada de dados. /*84*/ output.flush(); // limpa o Buffer. /*85*/ } /*86*/ catch (IOException e) {} /*87*/ } /*88*/ /*89*/ public void run() /*90*/ { String fofoca; /*91*/ int x; /*92*/ while(noar) /*93*/ { /*94*/ fofoca=ouvir(false); /*95*/ x = fofoca.indexof("bye"); // se o cliente enviou a instrucao para desconectar-se // do servidor, x armazenarah um valor superior a // (-1). /*96*/ if ( x >= 0) /*97*/ {this.noar=false;this.interrupt(); /*98*/ Servidor.this.removeJogador(this); /*99*/ System.out.println( "Pedido de exclusão recebido!"); /*100*/ informe("[exit]"); // informa ao cliente que ele foi desconectado /*101*/ continue; /*102*/ } /*103*/ if ( fofoca.indexof("[nome?]") > -1) /*104*/ {nome = fofoca.substring(7);} /*105*/ if ( fofoca.indexof("[conte mais]") > -1) /*106*/ {System.out.println("Recebi de " + nome + ":" + fofoca.substring(12)); } /*107*/ informe("[conte mais]"); /*108*/ } /*109*/ } /*110*/ // foram definidos os seguintes protocolos de // comunicacao: [nome?], [conte mais], [exit]. /*111*/ // envia mensagens aos jogadores clientes. /*112*/ private void informe(string m) /*113*/ { /*114*/ try /*115*/ { /*116*/ output.writeobject(m); /*117*/ output.flush(); /*118*/ } /*119*/ catch (java.io.ioexception e) /*120*/ { /*121*/ System.out.println( "Erro de envio de mensagem"); /*122*/ this.closeconnection(); /*123*/ noar=false; // se um erro acontecer, entao desconectar o // jogador e desligar a Thread. A Thread eh // ligada com a instrucao interrupt(). /*124*/ } /*125*/ } /*126*/ /*127*/ // rotina de recebimento de mensagens do // servidor /*128*/ private String ouvir(boolean eco) 6

/*129*/ { /*130*/ String saida = new String(""); /*131*/ try { /*132*/ saida = String.valueOf(inStream.readObject()); /*133*/ if (eco) System.out.println("ouvi " + /*134*/ saida);} /*135*/ catch (IOException e ) /*136*/ { saida = "";} /*137*/ catch (java.lang.classnotfoundexception clerr) /*138*/ { System.out.println(clerr);} /*139*/ catch (NullPointerException err){} /*140*/ return saida; /*141*/ } /*142*/ /*143*/ // rotina que permite retirar o jogador da lista // de jogadores e desconecta-lo do servidor. /*144*/ private void closeconnection() /*145*/ { /*146*/ try /*147*/ {Servidor.this.removeJogador(this); /*148*/ if (this.isalive()) /*149*/ { this.interrupt(); // encerra a Thread. /*150*/ connection.close();} } /*151*/ catch (Exception exp) {System.out.println("Cliente ausente");} /*152*/ } /*153*/ } /*154*/ // fim da classe interna. /*155*/ //////////////////////////// /*156*/ } // fim da classe Servidor 7

Exemplo de Cliente /*1*/ /////////////////// arquivo cliente.java /*2*/ import java.io.*; /*3*/ import java.net.*; /*4*/ import java.util.*; /*5*/ import javax.swing.*; /*6*/ class ConversaServidor implements Runnable /*7*/ { /*8*/ private Socket con ; /*9*/ private ObjectOutputStream output; /*10*/ private ObjectInputStream input; /*11*/ private int p; // porta a ser conectado. /*12*/ /*13*/ // o construtor cria e abre uma conexao com o // servidor. /*14*/ public ConversaServidor(String endereco, int porta) // recebe o endereco e porta como parametros. /*15*/ { /*16*/ try /*17*/ { /*18*/ con = new Socket(InetAddress.getByName(endereco),porta ); /*19*/ output = new ObjectOutputStream(con.getOutputStream()); /*20*/ InputStream s = con.getinputstream(); /*21*/ input = new ObjectInputStream(s); /*22*/ } /*23*/ catch(java.io.ioexception er1) /*24*/ {System.out.println(er1.getMessage());} /*25*/ } /*26*/ /*27*/ // metodo que eh executado quando a Thread eh // iniciada - metodo start(). /*28*/ public void run() /*29*/ { /*30*/ String texto=""; /*31*/ String mens=""; /*32*/ while(true) /*33*/ { /*34*/ try /*35*/ { /*36*/ mens = (String)input.readObject(); // li algo do servidor. /*37*/ if (mens.length() > 1) /*38*/ { /*39*/ System.out.println("Recebi do + servidor:"+mens); /*40*/ if (mens.lastindexof("[nome?]") > -1) /*41*/ {texto = "Identifique-se, por favor..."; mens="[nome?]"; /*42*/ System.out.println("Pedido de indentificação + feito pelo servidor."); /*43*/ } /*44*/ if (mens.lastindexof("[conte mais]") > -1) /*45*/ {texto = "Mande-me alguma informação"; mens="[conte mais]"; /*46*/ System.out.println( "Pedido de mais informacao."); /*47*/ } 8

/*48*/ if (mens.lastindexof("[exit]")>-1) {System.exit(0);} /*49*/ if (texto.length() > 0) //repete o protocolo e envia um texto digitado. senddata(mens +JOptionPane.showInputDialog(texto)); /*50*/ mens="";texto=""; //limpa tudo /*51*/ } /*52*/ } /*53*/ catch (java.io.optionaldataexception e) {System.out.println( "Erro no desconectar.\n" +e.getmessage());} /*54*/ catch (java.lang.classnotfoundexception e) {System.out.println("Class not found. \n"+ e.getmessage());} /*55*/ catch (java.io.ioexception e) {System.out.println("Erro de IO. \n"+ e.getmessage());} /*56*/ } /*57*/ } /*58*/ // envia mensagens ao servidor. /*59*/ public void senddata(string m) /*60*/ { /*61*/ try{ output.writeobject(m); /*62*/ output.flush(); // limpa o bbuffer. /*63*/ } /*64*/ catch (IOException e) {System.out.println( "Nao foi possivel enviar os dados.\n" + e.getmessage());} /*65*/ } /*66*/ } /*67*/ /*68*/ public class cliente extends ConversaServidor /*69*/ { /*70*/ public cliente(int porta) /*71*/ {super("127.0.0.1",porta);} /*72*/ /*73*/ public static void main(string[] a) /*74*/ { /*75*/ cliente c1 = new cliente(5555); /*76*/ c1.run(); /*77*/ } /*78*/ } 9