trabalho sistema distribuidos

24
TRABALHO SEMESTRAL DISCIPLINA: SISTEMAS DISTRIBUIDOS TEMA: Aplicação Distribuída Utilizando Socket Professor: Oberdan Rocha Alunos: Alan Moreno Elizângela Gonçalves Jomar Catugy Risoleta Santos Silvia Araújo Wellington Magno Turma: 2009.2 sl-16 Salvador-Bahia 2009

Upload: wellington-magno

Post on 26-Jul-2015

23 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Trabalho Sistema Distribuidos

TRABALHO SEMESTRAL

DISCIPLINA: SISTEMAS DISTRIBUIDOS

TEMA: Aplicação Distribuída Utilizando

Socket

Professor: Oberdan Rocha

Alunos: Alan Moreno

Elizângela Gonçalves

Jomar Catugy

Risoleta Santos

Silvia Araújo

Wellington Magno

Turma: 2009.2 sl-16

Salvador-Bahia

2009

Page 2: Trabalho Sistema Distribuidos

2

Componentes:

Alan Moreno

Elizângela Gonçalves

Jomar Catugy

Risoleta Santos

Silvia Araújo

Wellington Magno

TRABALHO SEMESTRAL

TEMA: Aplicação Distribuída Utilizando Socket

Salvador-Bahia

2009

Page 3: Trabalho Sistema Distribuidos

3

Sumário

Descrição Sockets..............................................................................................04

1.0 Descrição Detalhada da Implementação (Sistema de Mensagens)...............05

2.0 Descrição da Aplicação Distribuída e Códigos Fontes..................................12

3.0 Execução e Resultados.....................................................................................19

Referências Bibliográficas......................................................................................20

Page 4: Trabalho Sistema Distribuidos

4

Descrição Sockets

Especificamente em computação, um soquete pode ser usado em ligações de

redes de computadores para um fim de um elo bidirecional de comunicação entre

dois processos. A interface padronizada de soquetes surgiu originalmente no

sistema operacional Unix BSD (Berkeley Software Distribution); portanto, eles são

muitas vezes chamados de Berkeley Sockets. É também uma abstração

computacional que mapeia diretamente a uma porta de transporte (TCP ou UDP) e

mais um endereço de rede. O elo entre os processos do servidor e do cliente é o

socket (a “porta” na qual os processos enviam e recebem mensagens). De acordo

com JAMES F KUROSE: “socket é a interface entre a camada de aplicação e a de

transporte dentro de uma máquina”.

Então foram desenvolvidas diversas aplicações cliente/servidor onde cliente(s) e

servidor poderiam estar em máquinas diferentes, distantes umas das outras.

Quando um aplicativo interage com o software de protocolo, ele deve especificar

detalhes como, por exemplo:

1. Servidor, que fica esperando por conexões de entrada e que fornece

certos tipos de serviços à outra parte;

2. Cliente vem a ser quem solicita a conexão ao servidor para fazer alguma

requisição, algum pedido.

Além disso, os aplicativos que se comunicam devem especificar detalhes

adicionais (por exemplo, o remetente deve especificar os dados a serem enviados, e

o receptor deve especificar onde os dados recebidos devem ser colocados).

É importante dizer que não é o computador que distingue quem é servidor e

quem é cliente, mas sim a forma como certo programa usa os sockets. Às vezes

também se faz confusão no fato de se pensar que um servidor precisa ser um

mainframe. Desktops como os que usamos em casa funcionam tanto como cliente

quanto como servidor, e é o que ocorre freqüentemente.

Analisando o esquema acima percebemos que tudo acima da interface do

socket, na camada de aplicação, é controlado pelo criador da aplicação. O controle

da camada de transporte é feito pelo Sistema Operacional.

Temos dois tipos de serviços de transporte via socket: o confiável orientado a

cadeia de bytes (byte steam) e os datagramas, não confiáveis. O protocolo na qual é

programado o primeiro é o TCP, já o segundo é no protocolo UDP.

Page 5: Trabalho Sistema Distribuidos

5

Em documentos de RFC (Request for Comments) relacionado a TCP ou UDP,

um soquete em um computador é definido como a combinação (DNS traduz para um

endereço real) de um endereço IP, um protocolo, e o número da porta do protocolo.

Soquetes e RPCs têm a função de programar numa aplicação as funções de rede,

mas fazem isto de maneiras diferentes.

É ainda um tipo de dispositivo mecânico instalado em uma placa-mãe, destinado

a receber a CPU - o processador, sua nomenclatura refere-se ao número de pinos

que o mesmo poderá receber. Ex.: PGA 370 - só admite processadores com 370

pinos.

1.0 – Descrição Detalhada da Implemantação (Sistema de

Mensagens)

Começando com a aplicação que será hospedada no Servidor. No início do

programa, deverá ser inserida essas linhas que importam a biblioteca que contém as

classes que são utilizadas em uma aplicação com Socket (java.net.*) e as classes

de recepção de informação do teclado ou Socket do cliente ou servidor (java.io.*).

package mensagem.com.br;--“Aqui vc coloca a do seu trabalho”!

import java.awt.*;

import java.awt.event.*;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.EOFException;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.Socket;

import javax.swing.*;

import javax.swing.*;

public class Servidor extends JFrame {

private JTextField inserir_mensagem ;

private JTextArea exibir_janela ;

private ObjectOutputStream saida_arquivo ;

private ObjectInputStream entrada_arquivo ;

private ServerSocket servidor ;

private Socket conexao ;

private int contador = 1 ;

//private Container c = getContentPane();

Page 6: Trabalho Sistema Distribuidos

6

public Servidor(){

super( "Servidor" );

inserir_mensagem = new JTextField();

inserir_mensagem.setEditable(false);

inserir_mensagem.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {

envia_Dados(e.getActionCommand());

inserir_mensagem.setText( "" );

}});

add(inserir_mensagem,BorderLayout.NORTH);

exibir_janela = new JTextArea();

add( new JScrollPane( exibir_janela ), BorderLayout.CENTER );

setSize(300,150);

setVisible(true);

}//fim do construtor

Aqui criamos um objeto executa_servidor é o socket do lado do servidor,

numero_da_porta deverá ser substituido pelo número da porta pela qual a aplicação

cliente usará para conectar com o servidor. Este socket esperará a requisição de

conexão de um cliente.

public void executa_Servidor(){

try

{

servidor = new ServerSocket(12345 ,100);

Como o programa servidor normalmente fica funcionando por tempo indefinido,

coloca-se o restante das instruções dentro de um loop infinito, como segue:

while(true){

try

{

aguardando_Conexao();

getStreams();

processa_Conexao();

}

catch(EOFException eofException)

{

displayMessage("\nTerminou a conexao so Sevidor");

} finally

{

fechar_Conexao();

contador++;

}

}

}

catch(IOException ioException )

{

ioException.printStackTrace();

}

}//fim do metodo

A próxima instrução cria um objeto aguardando_Conexao do tipo Socket quando

um cliente conectar ao servidor. O TCP encarregará de criar uma conexão virtual

Page 7: Trabalho Sistema Distribuidos

7

direta entre esse socket e o socket do cliente de forma que todos os bytes serão

enviados ao servidor na ordem certa.

private void aguardando_Conexao() throws IOException {

displayMessage("Esperando Conexao\n");

conexao = servidor.accept();

displayMessage("Conexao " + contador + " recebido por : " +

conexao.getInetAddress().getHostName());

}//fim do metodo

private void getStreams() throws IOException {

saida_arquivo = new ObjectOutputStream(conexao.getOutputStream());

saida_arquivo.flush();

entrada_arquivo = new ObjectInputStream(conexao.getInputStream());

displayMessage("\n I/O Strems\n");

}//fim do metodo

Depois de processar a informação enviada pelo cliente, queremos enviar um

outro objeto(processa_conexao) do tipo String de volta para o cliente, como um

mensagem de dado recebido ou algo do tipo.

private void processa_Conexao() throws IOException {

String mensagem = "Conexao com sucesso";

envia_Dados( mensagem );

setTextFieldEditable( true );

do

{

try{

mensagem = (String) entrada_arquivo.readObject();

displayMessage("\n" + mensagem);

}

catch(ClassNotFoundException classNotFoundException)

{

displayMessage("\nNenhuma mensagem recebida\n");

}

}while(!mensagem.equals("CLIENTE >>> FINALIZAR"));

}//fim do metodo

/* (non-Javadoc)

* @see deitel.igson#fechar_Conexao()

*/

public void fechar_Conexao(){

displayMessage("\n Terminando Conexao\n");

setTextFieldEditable( false );

try

{

saida_arquivo.close() ;

entrada_arquivo.close() ;

conexao.close();

}catch(IOException ioException)

{

ioException.printStackTrace();

}

Page 8: Trabalho Sistema Distribuidos

8

}//fim do metodo

/* (non-Javadoc)

* @see deitel.igson#envia_Dados(java.lang.String)

*/

public void envia_Dados(String mensagem){

try

{

saida_arquivo.writeObject("SERVIDOR>>> " + mensagem) ;

saida_arquivo.flush();

displayMessage("\nSERVIDOR>>> \n" + mensagem);

}

catch(IOException ioException)

{

exibir_janela.append("\n Erro ao ler mensagem");

}

}//fim do metodo

/* (non-Javadoc)

* @see deitel.igson#displayMessage(java.lang.String)

*/

public void displayMessage(final String mensagem1){

SwingUtilities.invokeLater(new Runnable()

{

public void run(){

exibir_janela.append(mensagem1);

}

});

}//fim do metodo

/* (non-Javadoc)

* @see deitel.igson#setTextFieldEditable(boolean)

*/

public void setTextFieldEditable(final boolean editable){

SwingUtilities.invokeLater(new Runnable(){

public void run(){

inserir_mensagem.setEditable(editable);

}

});

}

public static void main(String[] args) {

Servidor j = new Servidor();

j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

j.executa_Servidor();

}//fim do metodo main

}//fim da classe

Analisando o programa cliente, como no caso do programa servidor, o código

inicia com a importação das bibliotecas que contém as classes de sockets e de

envio de informações.

package mensagem.com.br;

Page 9: Trabalho Sistema Distribuidos

9

import java.awt.*;

import java.awt.event.*;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.EOFException;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.Socket;

import javax.swing.*;

Primeiramente, criamos o socket que conectará com o servidor. O primeiro

parâmetro passado ao construtor é o nome do servidor, por exemplo, 127.0.0.1 se a

aplicação servidor estiver rodando no mesmo computador que a aplicação cliente. O

segundo parâmetro é o número da porta que é informado ao socket servidor.

public class Cliente extends JFrame {

private JLabel lnome = new JLabel("Informe o Nome :");

private JLabel lservidor = new JLabel("Informe a Porta :");

private JLabel l_ip = new JLabel("Informe o IP :");

private JTextField txtNome = new JTextField();

private JTextField txtPorta = new JTextField();

private JTextField txt_IP = new JTextField();

private JButton btConexao = new JButton("Conectar");

private JButton bt_Line = new JButton("OFF - LINE");

private JButton btArq = new JButton("Arquivo");

private JTextArea area_texto = new JTextArea();

private JScrollPane rolagem = new JScrollPane(area_texto);

private JTextArea area_enviar = new JTextArea();

private JButton btEnviar = new JButton("Enviar");

private Container c = getContentPane();

private Socket conexao;

private ObjectInputStream recebe;

private ObjectOutputStream envia;

private String mensagem = "" ;

Após a criação do socket cliente, temos que criar os objetos de cadeia que serão

ligados ao socket.

public void actionPerformed(ActionEvent e) {

try {

iniciar_Conexao();

fluxo_mensagem();

// recebe_Mensagem();

} catch (EOFException e1) {

Page 10: Trabalho Sistema Distribuidos

10

//e1.printStackTrace();

} catch (IOException e2) {

}

txt_IP.setEditable(false);

}

});

btConexao.setBounds(359, 28, 165, 24);

c.add(btConexao);

bt_Line.setForeground(Color.green);

bt_Line.setEnabled(false);

bt_Line.setFont(new Font(null,Font.BOLD,13));

bt_Line.setBackground(Color.white);

bt_Line.setBounds(359, 69, 165, 24);

c.add(bt_Line);

btArq.setBounds(359, 112, 165, 24);

c.add(btArq);

rolagem.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAY

S);

rolagem.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

rolagem.setBounds(17, 153, 511, 263);

c.add(rolagem);

area_enviar.setBounds(19, 431, 509, 62);

c.add(area_enviar);

btEnviar.addActionListener(new ActionListener(){

Utilizaremos o mesmo caso do servidor, e enviaremos(mensagem_do_cliente) e

receberemos(mensagem_para_cliente) dois objetos do tipo String para exemplificar.

public void actionPerformed(ActionEvent e) {

envia_Mensagem();

area_enviar.setText("");

}

});

btEnviar.setBounds(550, 443, 100, 42);

c.add(btEnviar);

}//fim do construtor

private void iniciar_Conexao(){

String host = txt_IP.getText();

try

{

Page 11: Trabalho Sistema Distribuidos

11

displayMessage("Esperando Conexao\n");

conexao = new Socket ( host ,12345);

displayMessage(" Conectado : " +

conexao.getInetAddress().getHostName());

}

catch ( IOException e )

{

JOptionPane.showMessageDialog(null,"Nao consegui fazer conexao

com a Porta de destino ","Janela de Informação",JOptionPane.ERROR_MESSAGE);

}

}

private void fluxo_mensagem() throws IOException {

try {

envia = new ObjectOutputStream (conexao.getOutputStream());

envia.flush();

recebe = new ObjectInputStream (

conexao.getInputStream());

} catch (IOException e) {

JOptionPane.showMessageDialog(null,"Erro ao enviar Mensagem

","Janela de Mensagem",JOptionPane.ERROR_MESSAGE);

}

}//fim do metodo

private void envia_Mensagem(){

try {

envia.writeObject(txtNome.getText() + " >>> " +

area_enviar.getText());

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

private void recebe_Mensagem() throws IOException{

do

{

try {

mensagem = (String) recebe.readObject();

displayMessage("\n Servidor>>>> " + mensagem );

} catch (ClassNotFoundException ex) {

//classeE.printStackTrace();

}

Page 12: Trabalho Sistema Distribuidos

12

}while(!mensagem.equals("ppppp"));

}

private void displayMessage(final String mensagem1){

SwingUtilities.invokeLater(new Runnable()

{

public void run(){

area_texto.append(mensagem1);

}

});

}//fim do metodo

Agora já podemos fechar o socket, e também a conexão entre cliente e servidor.

private void fechar_Conexao() throws IOException{

displayMessage("Fim da conexao");

envia.close();

recebe.close();

conexao.close();

}

public static void main(String[] args) {

Cliente j = new Cliente();

j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

2.0 – Descrição da Aplicação Distribuída e Código Fontes (Sistema

de Mensagens)

1. A camada do Cliente – Nessa camada o cliente ao se conectar irá solicitar ao

servidor a sua lista de mensagens, caso exista. Essa camada poderá ou não

estar na mesma máquina em que o servidor esteja executando.

package mensagem.com.br;

import java.awt.*;

import java.awt.event.*;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.EOFException;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.Socket;

Page 13: Trabalho Sistema Distribuidos

13

import javax.swing.*;

public class Cliente extends JFrame {

private JLabel lnome = new JLabel("Informe o Nome :");

private JLabel lservidor = new JLabel("Informe a Porta :");

private JLabel l_ip = new JLabel("Informe o IP :");

private JTextField txtNome = new JTextField();

private JTextField txtPorta = new JTextField();

private JTextField txt_IP = new JTextField();

private JButton btConexao = new JButton("Conectar");

private JButton bt_Line = new JButton("OFF - LINE");

private JButton btArq = new JButton("Arquivo");

private JTextArea area_texto = new JTextArea();

private JScrollPane rolagem = new JScrollPane(area_texto);

private JTextArea area_enviar = new JTextArea();

private JButton btEnviar = new JButton("Enviar");

private Container c = getContentPane();

private Socket conexao;

private ObjectInputStream recebe;

private ObjectOutputStream envia;

private String mensagem = "" ;

public Cliente() {

c.setLayout(null);

c.setBackground(new Color(238, 238, 238));

this.setSize(680, 545);

this.setLocation(196, 102);

this.setTitle("Janela do Cliente");

this.setResizable(true);

this.setVisible(true);

lnome.setFont(new Font(null,Font.BOLD,14));

lnome.setForeground(Color.blue);

lnome.setBounds(8, 26, 120, 27);

c.add(lnome);

lservidor.setFont(new Font(null,Font.BOLD,14));

lservidor.setForeground(Color.blue);

lservidor.setBounds(8, 81, 120, 14);

c.add(lservidor);

l_ip.setFont(new Font(null,Font.BOLD,14));

l_ip.setForeground(Color.blue);

l_ip.setBounds(24 ,112, 120, 33);

c.add(l_ip);

txtNome.setBounds(132, 30, 193, 21);

c.add(txtNome);

txtPorta.setBounds(132, 77, 100, 21);

c.add(txtPorta);

txt_IP.setBounds(132, 118, 193, 21);

c.add(txt_IP);

btConexao.addActionListener(new ActionListener(){

Page 14: Trabalho Sistema Distribuidos

14

public void actionPerformed(ActionEvent e) {

try {

iniciar_Conexao();

fluxo_mensagem();

// recebe_Mensagem();

} catch (EOFException e1) {

//e1.printStackTrace();

} catch (IOException e2) {

}

txt_IP.setEditable(false);

}

});

btConexao.setBounds(359, 28, 165, 24);

c.add(btConexao);

bt_Line.setForeground(Color.green);

bt_Line.setEnabled(false);

bt_Line.setFont(new Font(null,Font.BOLD,13));

bt_Line.setBackground(Color.white);

bt_Line.setBounds(359, 69, 165, 24);

c.add(bt_Line);

btArq.setBounds(359, 112, 165, 24);

c.add(btArq);

rolagem.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAY

S);

rolagem.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

rolagem.setBounds(17, 153, 511, 263);

c.add(rolagem);

area_enviar.setBounds(19, 431, 509, 62);

c.add(area_enviar);

btEnviar.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {

envia_Mensagem();

area_enviar.setText("");

}

});

btEnviar.setBounds(550, 443, 100, 42);

c.add(btEnviar);

}//fim do construtor

Page 15: Trabalho Sistema Distribuidos

15

private void iniciar_Conexao(){

String host = txt_IP.getText();

try

{

displayMessage("Esperando Conexao\n");

conexao = new Socket ( host ,12345);

displayMessage(" Conectado : " +

conexao.getInetAddress().getHostName());

}

catch ( IOException e )

{

JOptionPane.showMessageDialog(null,"Nao consegui fazer conexao

com a Porta de destino ","Janela de Informação",JOptionPane.ERROR_MESSAGE);

}

}

private void fluxo_mensagem() throws IOException {

try {

envia = new ObjectOutputStream (conexao.getOutputStream());

envia.flush();

recebe = new ObjectInputStream (

conexao.getInputStream());

} catch (IOException e) {

JOptionPane.showMessageDialog(null,"Erro ao enviar Mensagem

","Janela de Mensagem",JOptionPane.ERROR_MESSAGE);

}

}//fim do metodo

private void envia_Mensagem(){

try {

envia.writeObject(txtNome.getText() + " >>> " +

area_enviar.getText());

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

private void recebe_Mensagem() throws IOException{

do

{

try {

mensagem = (String) recebe.readObject();

Page 16: Trabalho Sistema Distribuidos

16

displayMessage("\n Servidor>>>> " + mensagem );

} catch (ClassNotFoundException ex) {

//classeE.printStackTrace();

}

}while(!mensagem.equals("ppppp"));

}

private void displayMessage(final String mensagem1){

SwingUtilities.invokeLater(new Runnable()

{

public void run(){

area_texto.append(mensagem1);

}

});

}//fim do metodo

private void fechar_Conexao() throws IOException{

displayMessage("Fim da conexao");

envia.close();

recebe.close();

conexao.close();

}

public static void main(String[] args) {

Cliente j = new Cliente();

j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

2. A camada do Servidor – Essa camada vai dar suporte à camada do cliente,

todo inteligência da aplicação vai ficar nessa camada. Sempre que solicitado

o servidor deverá retornar as mensagens registradas para os seus clientes, o

cliente deverá informar um ID para ter acesso a suas mensagens.

package mensagem.com.br;

import java.awt.BorderLayout;

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.EOFException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.ServerSocket;

import java.net.Socket;

Page 17: Trabalho Sistema Distribuidos

17

import javax.swing.*;

public class Servidor extends JFrame {

private JTextField inserir_mensagem ;

private JTextArea exibir_janela ;

private ObjectOutputStream saida_arquivo ;

private ObjectInputStream entrada_arquivo ;

private ServerSocket servidor ;

private Socket conexao ;

private int contador = 1 ;

//private Container c = getContentPane();

public Servidor(){

super( "Servidor" );

inserir_mensagem = new JTextField();

inserir_mensagem.setEditable(false);

inserir_mensagem.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {

envia_Dados(e.getActionCommand());

inserir_mensagem.setText( "" );

}});

add(inserir_mensagem,BorderLayout.NORTH);

exibir_janela = new JTextArea();

add( new JScrollPane( exibir_janela ), BorderLayout.CENTER );

setSize(300,150);

setVisible(true);

}//fim do construtor

public void executa_Servidor(){

try

{

servidor = new ServerSocket(12345 ,100);

while(true){

try

{

aguardando_Conexao();

getStreams();

processa_Conexao();

}

catch(EOFException eofException)

{

displayMessage("\nTerminou a conexao so Sevidor");

} finally

{

fechar_Conexao();

contador++;

}

}

}

catch(IOException ioException )

{

ioException.printStackTrace();

}

}//fim do metodo

private void aguardando_Conexao() throws IOException {

Page 18: Trabalho Sistema Distribuidos

18

displayMessage("Esperando Conexao\n");

conexao = servidor.accept();

displayMessage("Conexao " + contador + " recebido por : " +

conexao.getInetAddress().getHostName());

}//fim do metodo

private void getStreams() throws IOException {

saida_arquivo = new ObjectOutputStream(conexao.getOutputStream());

saida_arquivo.flush();

entrada_arquivo = new ObjectInputStream(conexao.getInputStream());

displayMessage("\n I/O Strems\n");

}//fim do metodo

private void processa_Conexao() throws IOException {

String mensagem = "Conexao com sucesso";

envia_Dados( mensagem );

setTextFieldEditable( true );

do

{

try{

mensagem = (String) entrada_arquivo.readObject();

displayMessage("\n" + mensagem);

}

catch(ClassNotFoundException classNotFoundException)

{

displayMessage("\nNenhuma mensagem recebida\n");

}

}while(!mensagem.equals("CLIENTE >>> FINALIZAR"));

}//fim do metodo

/* (non-Javadoc)

* @see deitel.igson#fechar_Conexao()

*/

public void fechar_Conexao(){

displayMessage("\n Terminando Conexao\n");

setTextFieldEditable( false );

try

{

saida_arquivo.close() ;

entrada_arquivo.close() ;

conexao.close();

}catch(IOException ioException)

{

ioException.printStackTrace();

}

}//fim do metodo

/* (non-Javadoc)

* @see deitel.igson#envia_Dados(java.lang.String)

*/

public void envia_Dados(String mensagem){

try

{

Page 19: Trabalho Sistema Distribuidos

19

saida_arquivo.writeObject("SERVIDOR>>> " + mensagem) ;

saida_arquivo.flush();

displayMessage("\nSERVIDOR>>> \n" + mensagem);

}

catch(IOException ioException)

{

exibir_janela.append("\n Erro ao ler mensagem");

}

}//fim do metodo

/* (non-Javadoc)

* @see deitel.igson#displayMessage(java.lang.String)

*/

public void displayMessage(final String mensagem1){

SwingUtilities.invokeLater(new Runnable()

{

public void run(){

exibir_janela.append(mensagem1);

}

});

}//fim do metodo

/* (non-Javadoc)

* @see deitel.igson#setTextFieldEditable(boolean)

*/

public void setTextFieldEditable(final boolean editable){

SwingUtilities.invokeLater(new Runnable(){

public void run(){

inserir_mensagem.setEditable(editable);

}

});

}

public static void main(String[] args) {

Servidor j = new Servidor();

j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

j.executa_Servidor();

}//fim do metodo main

}//fim da classe

3.0– Execução e Resultados (Sistema de Mensagens)

O usuário pede interação ao sistema que fornece os campos para que seja

preenchido login e senha. O sistema libera a pagina das mensagens com

possibilidade de verificação e envio de novas mensagens, segue imagens e códigos

fontes:

Page 20: Trabalho Sistema Distribuidos

20

Page 21: Trabalho Sistema Distribuidos

21

package mensagem.com.br;

import java.awt.BorderLayout;

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.EOFException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.ServerSocket;

import java.net.Socket;

import javax.swing.*;

public class Servidor extends JFrame {

private JTextField inserir_mensagem ;

private JTextArea exibir_janela ;

private ObjectOutputStream saida_arquivo ;

private ObjectInputStream entrada_arquivo ;

private ServerSocket servidor ;

private Socket conexao ;

private int contador = 1 ;

//private Container c = getContentPane();

public Servidor(){

super( "Servidor" );

inserir_mensagem = new JTextField();

inserir_mensagem.setEditable(false);

inserir_mensagem.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {

envia_Dados(e.getActionCommand());

inserir_mensagem.setText( "" );

}});

add(inserir_mensagem,BorderLayout.NORTH);

exibir_janela = new JTextArea();

add( new JScrollPane( exibir_janela ), BorderLayout.CENTER );

setSize(300,150);

setVisible(true);

}//fim do construtor

public void executa_Servidor(){

try

{

servidor = new ServerSocket(12345 ,100);

while(true){

try

{

aguardando_Conexao();

getStreams();

processa_Conexao();

}

catch(EOFException eofException)

{

displayMessage("\nTerminou a conexao so Sevidor");

Page 22: Trabalho Sistema Distribuidos

22

} finally

{

fechar_Conexao();

contador++;

}

}

}

catch(IOException ioException )

{

ioException.printStackTrace();

}

}//fim do metodo

private void aguardando_Conexao() throws IOException {

displayMessage("Esperando Conexao\n");

conexao = servidor.accept();

displayMessage("Conexao " + contador + " recebido por : " +

conexao.getInetAddress().getHostName());

}//fim do metodo

private void getStreams() throws IOException {

saida_arquivo = new ObjectOutputStream(conexao.getOutputStream());

saida_arquivo.flush();

entrada_arquivo = new ObjectInputStream(conexao.getInputStream());

displayMessage("\n I/O Strems\n");

}//fim do metodo

private void processa_Conexao() throws IOException {

String mensagem = "Conexao com sucesso";

envia_Dados( mensagem );

setTextFieldEditable( true );

do

{

try{

mensagem = (String) entrada_arquivo.readObject();

displayMessage("\n" + mensagem);

}

catch(ClassNotFoundException classNotFoundException)

{

displayMessage("\nNenhuma mensagem recebida\n");

}

}while(!mensagem.equals("CLIENTE >>> FINALIZAR"));

}//fim do metodo

/* (non-Javadoc)

* @see deitel.igson#fechar_Conexao()

*/

public void fechar_Conexao(){

displayMessage("\n Terminando Conexao\n");

setTextFieldEditable( false );

try

{

saida_arquivo.close() ;

Page 23: Trabalho Sistema Distribuidos

23

entrada_arquivo.close() ;

conexao.close();

}catch(IOException ioException)

{

ioException.printStackTrace();

}

}//fim do metodo

/* (non-Javadoc)

* @see deitel.igson#envia_Dados(java.lang.String)

*/

public void envia_Dados(String mensagem){

try

{

saida_arquivo.writeObject("SERVIDOR>>> " + mensagem) ;

saida_arquivo.flush();

displayMessage("\nSERVIDOR>>> \n" + mensagem);

}

catch(IOException ioException)

{

exibir_janela.append("\n Erro ao ler mensagem");

}

}//fim do metodo

/* (non-Javadoc)

* @see deitel.igson#displayMessage(java.lang.String)

*/

public void displayMessage(final String mensagem1){

SwingUtilities.invokeLater(new Runnable()

{

public void run(){

exibir_janela.append(mensagem1);

}

});

}//fim do metodo

/* (non-Javadoc)

* @see deitel.igson#setTextFieldEditable(boolean)

*/

public void setTextFieldEditable(final boolean editable){

SwingUtilities.invokeLater(new Runnable(){

public void run(){

inserir_mensagem.setEditable(editable);

}

});

}

public static void main(String[] args) {

Servidor j = new Servidor();

j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

j.executa_Servidor();

}//fim do metodo main

}//fim da classe

Page 24: Trabalho Sistema Distribuidos

24

Referências Bibliográficas

• http:// pt.wikipedia.org/wiki/Socket – visitado: 01/11/2009 às 18:52 h;

• http://wikiversity.org/Introdução Sockets - visitado: 01/11/2009 às 19:14 h.