trabalho sistema distribuidos
TRANSCRIPT
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
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
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
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.
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();
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
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();
}
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;
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) {
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
{
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();
}
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;
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(){
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
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();
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;
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 {
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
{
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:
20
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");
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() ;
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
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.