Académique Documents
Professionnel Documents
Culture Documents
Objetivo:
Capacitar o aluno a desenvolver uma aplicao servidora para mltiplos
clientes.
Apresentar as classes Socket e ServerSocket, classes de fluxo de dados,
a classe Thread, a interface Runnable e a classe Vector.
Apresentar, tambm, a prtica de definio de protocolos de comunicao.
Sumrio
Introduo ............................................................................................................... 2
1. Threads ............................................................................................................... 2
A classe Thread...................................................................................................... 2
Exemplo de Thread ................................................................................................ 2
Inicializao da Thread: .......................................................................................... 2
Exemplo de chamada de duas Threads:..................................................................... 2
Comentrios: ......................................................................................................... 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
Introduo
Uma aplicao servidora deve ser capaz de fornecer servios a clientes que se
conectem a ela. Atravs 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 atravs da rede. Qualquer cliente que queira
acessar os servios de uma aplicao, o faz atravs dessa porta de entrada.
O servidor necessita, constantemente, verificar na porta se algum cliente est
solicitando um servio. Essa ao pode ser realizada em Java, atravs da classe Thread
ou da interface Runnable. Threads e Runnables so executadas de forma concorrente
com o sistema operacional e outras aplicaes.
Uma Thread ou Runnable possuem a assinatura de mtodo public void
run(). Quando disparada, tanto a Thread quanto a Runnable, executam esse mtodo
de forma concorrente com os outros servios do sistema operacional.
1. Threads
A classe Thread
Inicializao da
Thread:
/*05*/
/*06*/
/*07*/
/*08*/
/*09*/
/*10*/
/*11*/
/*12*/
/*13*/
/*14*/
/*15*/
/*07*/
/*08*/
/*09*/
/*10*/
/*11*/
/*12*/
/*13*/
/*14*/
/*15*/
/*16*/
/*17*/
/*18*/
/*19*/
/*20*/
Comentrios:
{
{
while(true)
System.out.print("\r" + getName()
+":" + (++i));
try {sleep(espera);}
catch (InterruptedException erro){}
} }
O que um porta. Essa combinao identifica uma porta de entrada para uma
Socket? aplicao.
valores.
Dos mtodos disponveis, o principal o construtor. Nele definido
a porta de leitura. Linhas 8 e 20 do cdigo abaixo.
ServerSocket e
Socket: /*5*/
/*6*/
/*7*/
/*8*/
/*9*/
/*10*/
/*11*/
/*12*/
/*13*/
/*14*/
/*15*/
/*16*/
public class
{
private
private
private
Servidor.java
int porta;
ServerSocket ouvido;
ObjectOutputStream output;
// fluxo de saida de dados.
private ObjectInputStream inStream;
// fluxo de entrada de dados.
private Vector listaJogador = new Vector();
private Jogador visitante;
/*34*/
/*35*/
/*36*/
/*37*/
/*38*/
while(true)
{
try
{
// servidor.accept() => espera por um
//cliente , quando o cliente solicita
//conexao,
// uma instancia da classe Jogador eh
// criada para representar essa conexao.
/*39*/
/*40*/
/*41*/
/*42*/
/*43*/
/*44*/
/*45*/
/*46*/
/*47*/
/*48*/
/*49*/
/*50*/
/*51*/
/*52*/
/*53*/
/*54*/
/*55*/
/*56*/
/*57*/
/*58*/
/*59*/
/*60*/
/*61*/
/*62*/
/*63*/
/*64*/
/*65*/
/*66*/
/*67*/
/*68*/
/*69*/
/*70*/
/*71*/
/*72*/
/*73*/
/*74*/
/*75*/
/*76*/
/*77*/
/*78*/
/*79*/
/*80*/
/*81*/
/*82*/
/*83*/
inStream = new
ObjectInputStream(s.getInputStream());
// cria fluxo de entrada de dados.
output.flush(); // limpa o Buffer.
}
catch (IOException e) {}
}
/*84*/
/*85*/
/*86*/
/*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 excluso 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*/
/*112*/
/*113*/
/*114*/
/*115*/
/*116*/
/*117*/
/*118*/
/*119*/
/*120*/
/*121*/
/*122*/
/*123*/
/*124*/
/*125*/
/*126*/
/*127*/
/*128*/
/*129*/
/*130*/
/*131*/
/*132*/
{
String saida = new String("");
try {
saida =
String.valueOf(inStream.readObject());
if (eco) System.out.println("ouvi " +
saida);}
catch (IOException e )
{ saida = "";}
catch (java.lang.ClassNotFoundException
clerr)
{ System.out.println(clerr);}
catch (NullPointerException err){}
/*133*/
/*134*/
/*135*/
/*136*/
/*137*/
/*138*/
/*139*/
/*140*/
/*141*/
/*142*/
/*143*/
/*144*/
/*145*/
/*146*/
/*147*/
/*148*/
/*149*/
/*150*/
/*151*/
/*152*/
/*153*/
/*154*/
/*155*/
/*156*/
return saida;
}
// rotina que permite retirar o jogador da lista
// de jogadores e desconecta-lo do servidor.
private void closeConnection()
{
try
{Servidor.this.removeJogador(this);
if (this.isAlive())
{ this.interrupt();
// encerra a Thread.
connection.close();}
}
catch (Exception exp)
{System.out.println("Cliente ausente");}
}
}
// fim da classe interna.
////////////////////////////
} // fim da classe Servidor
/*48*/
if (mens.lastIndexOf("[exit]")>-1)
{System.exit(0);}
if (texto.length() > 0)
//repete o protocolo e envia um texto digitado.
sendData(mens
+JOptionPane.showInputDialog(texto));
mens="";texto=""; //limpa tudo
}
}
catch (java.io.OptionalDataException e)
{System.out.println(
"Erro no desconectar.\n"
+e.getMessage());}
catch (java.lang.ClassNotFoundException e)
{System.out.println("Class not found. \n"+
e.getMessage());}
catch (java.io.IOException e)
{System.out.println("Erro de IO. \n"+
e.getMessage());}
}
/*49*/
/*50*/
/*51*/
/*52*/
/*53*/
/*54*/
/*55*/
/*56*/
/*57*/
/*58*/
/*59*/
/*60*/
/*61*/
/*62*/
/*63*/
/*64*/
/*65*/
/*66*/
/*67*/
/*68*/
/*69*/
/*70*/
/*71*/
/*72*/
/*73*/
/*74*/
/*75*/
/*76*/
/*77*/
/*78*/
}
// envia mensagens ao servidor.
public void sendData(String m)
{
try{ output.writeObject(m);
output.flush(); // limpa o bbuffer.
}
catch (IOException e) {System.out.println(
"Nao foi possivel enviar os dados.\n"
+ e.getMessage());}
}
}
public class cliente extends ConversaServidor
{
public cliente(int porta)
{super("127.0.0.1",porta);}
public static void main(String[] a)
{
cliente c1 = new cliente(5555);
c1.run();
}
}