Você está na página 1de 24

TRABALHO SEMESTRAL DISCIPLINA: SISTEMAS DISTRIBUIDOS

TEMA: Aplicao Distribuda Utilizando Socket


Professor: Oberdan Rocha Alunos: Alan Moreno Elizngela Gonalves Jomar Catugy Risoleta Santos Silvia Arajo Wellington Magno

Turma: 2009.2 sl-16

Salvador-Bahia 2009

Componentes: Alan Moreno Elizngela Gonalves Jomar Catugy Risoleta Santos Silvia Arajo Wellington Magno

TRABALHO SEMESTRAL TEMA: Aplicao Distribuda Utilizando Socket

Salvador-Bahia 2009
2

Sumrio
Descrio Sockets..............................................................................................04 1.0 Descrio Detalhada da Implementao (Sistema de Mensagens)...............05 2.0 Descrio da Aplicao Distribuda e Cdigos Fontes..................................12 3.0 Execuo e Resultados.....................................................................................19 Referncias Bibliogrficas......................................................................................20

Descrio Sockets
Especificamente em computao, um soquete pode ser usado em ligaes de redes de computadores para um fim de um elo bidirecional de comunicao entre dois processos. A interface padronizada de soquetes surgiu originalmente no sistema operacional Unix BSD (Berkeley Software Distribution); portanto, eles so muitas vezes chamados de Berkeley Sockets. tambm uma abstrao computacional que mapeia diretamente a uma porta de transporte (TCP ou UDP) e mais um endereo 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 aplicao e a de
transporte dentro de uma mquina.

Ento foram desenvolvidas diversas aplicaes cliente/servidor onde cliente(s) e servidor poderiam estar em mquinas 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 conexes de entrada e que fornece certos tipos de servios outra parte; 2. Cliente vem a ser quem solicita a conexo ao servidor para fazer alguma requisio, algum pedido. Alm 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 no o computador que distingue quem servidor e quem cliente, mas sim a forma como certo programa usa os sockets. s vezes tambm se faz confuso 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 freqentemente. Analisando o esquema acima percebemos que tudo acima da interface do socket, na camada de aplicao, controlado pelo criador da aplicao. O controle da camada de transporte feito pelo Sistema Operacional. Temos dois tipos de servios de transporte via socket: o confivel orientado a cadeia de bytes (byte steam) e os datagramas, no confiveis. O protocolo na qual programado o primeiro o TCP, j o segundo no protocolo UDP.

Em documentos de RFC (Request for Comments) relacionado a TCP ou UDP, um soquete em um computador definido como a combinao (DNS traduz para um endereo real) de um endereo IP, um protocolo, e o nmero da porta do protocolo. Soquetes e RPCs tm a funo de programar numa aplicao as funes de rede, mas fazem isto de maneiras diferentes. ainda um tipo de dispositivo mecnico instalado em uma placa-me, destinado a receber a CPU - o processador, sua nomenclatura refere-se ao nmero de pinos que o mesmo poder receber. Ex.: PGA 370 - s admite processadores com 370 pinos.

1.0 Descrio Detalhada da Implemantao (Sistema de Mensagens)


Comeando com a aplicao que ser hospedada no Servidor. No incio do programa, dever ser inserida essas linhas que importam a biblioteca que contm as classes que so utilizadas em uma aplicao com Socket (java.net.*) e as classes de recepo de informao do teclado ou Socket do cliente ou servidor (java.io.*).
package mensagem.com.br;--Aqui vc coloca a do seu trabalho! import import import import import import import import import import import import import import import import java.awt.*; java.awt.event.*; java.io.BufferedInputStream; java.io.BufferedOutputStream; java.io.DataInputStream; java.io.DataOutputStream; java.io.EOFException; java.io.File; java.io.FileInputStream; java.io.FileNotFoundException; java.io.FileOutputStream; java.io.IOException; java.io.ObjectInputStream; java.io.ObjectOutputStream; java.net.Socket; 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();

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 nmero da porta pela qual a aplicao cliente usar para conectar com o servidor. Este socket esperar a requisio de conexo 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 instrues 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 prxima instruo cria um objeto aguardando_Conexao do tipo Socket quando um cliente conectar ao servidor. O TCP encarregar de criar uma conexo virtual 6

direta entre esse socket e o socket do cliente de forma que todos os bytes sero 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 informao 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(); }

}//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 cdigo inicia com a importao das bibliotecas que contm as classes de sockets e de envio de informaes.
package mensagem.com.br;

import import import import import import import import import import import import import import import import

java.awt.*; java.awt.event.*; java.io.BufferedInputStream; java.io.BufferedOutputStream; java.io.DataInputStream; java.io.DataOutputStream; java.io.EOFException; java.io.File; java.io.FileInputStream; java.io.FileNotFoundException; java.io.FileOutputStream; java.io.IOException; java.io.ObjectInputStream; java.io.ObjectOutputStream; java.net.Socket; javax.swing.*;

Primeiramente, criamos o socket que conectar com o servidor. O primeiro parmetro passado ao construtor o nome do servidor, por exemplo, 127.0.0.1 se a aplicao servidor estiver rodando no mesmo computador que a aplicao cliente. O segundo parmetro o nmero 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 = "" ;

Aps a criao do socket cliente, temos que criar os objetos de cadeia que sero ligados ao socket.
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(){

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 {

10

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 Informao",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(); }

11

}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 tambm a conexo 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 Descrio da Aplicao Distribuda e Cdigo 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 no estar na mesma mquina em que o servidor esteja executando.
package mensagem.com.br; import import import import import import import import import import import import import import import java.awt.*; java.awt.event.*; java.io.BufferedInputStream; java.io.BufferedOutputStream; java.io.DataInputStream; java.io.DataOutputStream; java.io.EOFException; java.io.File; java.io.FileInputStream; java.io.FileNotFoundException; java.io.FileOutputStream; java.io.IOException; java.io.ObjectInputStream; java.io.ObjectOutputStream; java.net.Socket;

12

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(){

13

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

14

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 Informao",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();

15

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 inteligncia da aplicao 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 import import import import import import import import import import

java.awt.BorderLayout; java.awt.Container; java.awt.event.ActionEvent; java.awt.event.ActionListener; java.io.EOFException; java.io.FileOutputStream; java.io.IOException; java.io.ObjectInputStream; java.io.ObjectOutputStream; java.net.ServerSocket; java.net.Socket;

16

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 {

17

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 {

18

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 Execuo e Resultados (Sistema de Mensagens)


O usurio pede interao ao sistema que fornece os campos para que seja preenchido login e senha. O sistema libera a pagina das mensagens com possibilidade de verificao e envio de novas mensagens, segue imagens e cdigos fontes:

19

20

package mensagem.com.br;

import import import import import import import import import import import

java.awt.BorderLayout; java.awt.Container; java.awt.event.ActionEvent; java.awt.event.ActionListener; java.io.EOFException; java.io.FileOutputStream; java.io.IOException; java.io.ObjectInputStream; java.io.ObjectOutputStream; java.net.ServerSocket; 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");

21

} 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() ;

22

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

23

Referncias Bibliogrficas
http:// pt.wikipedia.org/wiki/Socket visitado: 01/11/2009 s 18:52 h; http://wikiversity.org/Introduo Sockets - visitado: 01/11/2009 s 19:14 h.

24

Você também pode gostar