Blogger templates

Comunidade java aberto - Participe da nossa comunidade no facebook (clique aqui)

Visitas

sexta-feira, 28 de dezembro de 2012

Sockets

,

Olá, vou tentar explicar um pouco de sockets em java
primeiramente vou apresentar o conceito de o que é esse
tal sockets.

Bem um socket é um canal de comunicação dentre duas míquinas
por determinadas aplicações comunicando entre si.
Em uma conexão de socket sempre existe um computador servidor
e outro computador cliente.
O computador servidor ele tem a função de abrir determinada porta
de comunicação, escutando (LISTENING), até que alguém, míquina cliente, 
tente fazer alguma conexão.

Para simplificar vou apresentar os métodos que uma míquina cliente tem que
executar.

1-Cria a conexão, cria um socket com algum servidor.
2-Cria um fluxo de comunicação no socket.
3-Utiliza o fluxo, conversa com a outra míquina.
4-Fecha o fluxo.
5-Fecha o socket.

Agora para uma míquina servidora os métodos mudam um pouco.

1-Cria um socket de escuta (LISTENING), em uma determinada porta.
2-Processa requisições de conexões, cria o socket com a míquina cliente.
3-Processa pedido de fluxo.
4-Utiliza o fluxo, conversa com a outra míquina.
5-Fecha o fluxo.
6-Fecha o socket.

Outra definição importante é referente a portas que são (ligações)
para conexões do seu computador para uma rede externa a ele (saàda) 
ou de uma rede externa para ele (entrada). 
Só existe compartilhamento, ou comunicação entre dois computadores, 
quando e houver conexões de entrada e saàda estabelecidas 
entre os dois computadores, através de uma determinada porta do computador 
de origem, à uma porta do computador de destino do compartilhamento.

Em java é possàvel executar dois tipos de conexões, modo baseado em conexão
e o sem conexão.

O modo baseado em conexão é algo parecido com uma padaria você pega o bilhete
e pega o pão, você confere para ver se é o pão que requisitou no bilhete e 
pronto. (TCP/IP)

http://www.juliobattisti.com.br/artigos ... pip_p1.asp 

O modo sem conexão é um pouco mais desorganizado, você entra na padaria e recebe
uma determinada quantidade de pão, doces, etc. Você que se vire com o que quer. (UDP)

http://www.juliobattisti.com.br/artigos ... ip_p11.asp 

Não vou entrar em detalhes sobre como fazer uma socket com conexão UDP, é algo
muito parecido com a conexão TCP/IP. Mas para quem quiser dar uma olhada, um breve
tutorial.

http://www.dca.fee.unicamp.br/cursos/Po ... k/udp.html 

Em java é extemamente simples criar um socket, vamos dar uma olhada nos construtores
das classes para uma simples conexão TCP/IP do lado do cliente.

Socket(String, int) - Nome do computador (Servidor) e a porta de comunicação.
Socket(String, int, boolean) - Nome do computador (Servidor), e a porta de comunicação,
e se o socket é com fluxo (true) TCP/IP ou não (false) UDP.

Socket(InetAddress, int) - O endereço Internet e a porta para conexão.
Socket(InetAddress, int, boolean) - O endereço da Internet (Servidor), e a porta de comunicação,
e se o socket é com fluxo (true) TCP/IP ou não (false) UDP.

Agora alguns métodos para a utilização de sockets, do lado cliente.

OutputStream getOutputStream() - Retorna a saida de fluxo do socket.
InputStream getInputStream() - Retorna o entrada de fluxo do socket.
InetAdress getInetAdress() - Retorna o InetAdress relacionado ao socket.
int getLocalPort() - Retorna a porta aberta para o socket.
close() - Fecha o socket.

Agora do lado servidor temos algumas mudanças, constutor necessírio para a conexão.

ServerSocket(porta) - Porta que ficarí em escuta (LISTENIG).

Os métodos mais bísicos.

accept() - Aguarda conexão em determinda porta coloca
em escuta (LIsTENING).
close() - Fecha o socket.

E como no lado cliente temos a classe Socket, só que do lado servidor
ele apenas pega o canal de comuniação. Ele faz isso quando aceita uma conexão 
usando o método accept(), que retorna um Socket. Esse socket jí é o canal 
de comunicação com a míquina cliente. Ou seja, também usaremos a classe 
Socket no servidor.

Agora alguns métodos para a utilização de sockets, do lado cliente.

OutputStream getOutputStream() - Retorna a saida de fluxo do socket.
InputStream getInputStream() - Retorna o entrada de fluxo do socket.
InetAdress getInetAdress() - Retorna o InetAdress relacionado ao socket.
int getLocalPort() - Retorna a porta aberta para o socket.
close() - Fecha o socket.

Agora que sabemos como conectar duas míquinas, vamos enviar e receber dados.

Para facilitar o envio e o recebimento de dados temos as classes BufferedReader e
PrintWriter.

O constutor padrão das classes recebem InputStream e OutputStrem com parâmetro, 
respectivamente. 

O construtor padrão para a classe BufferedReader.

BufferedReader(InputStreamReader(InputStream)) - Fluxo de comunicação.

Alguns métodos importantes da classe BufferedReader.

readLine() - Retorna uma String.
read() - Retorna um único caractere.
close() - Fecha o fluxo.

O construtor padrão para a classe PrintStream.

PrintStream(OutputStream) - Fluxo de comunicação.

Alguns métodos importantes da classe PrintStream.

println() - Envia uma String.
write() - Envia um byte.
close() - Fecha o fluxo.

Bem a seguir os códigos das aplicações.

Código da aplicação cliente:

Código:
/*
 * Main.java
 *
 * Created on 11 de Julho de 2007, 00:47
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package cliente;

//Importa pacotes para a criação de fluxos.
import java.io.*;
//Importa pacotes para a criação de sockets.
import java.net.*;


public class Main {
    
    /** Cria uma nova instância de Main */
    public Main() {
    }
    
    /**
     * @param args argumentos da linha de comando
     */
    public static void main(String[] args) {
        try {
            //Crio um socket
            Socket socket = new Socket("127.0.0.1", 606);
        
            //Crio o fluxo para o envio de dados
            OutputStream saida = socket.getOutputStream();            
            PrintStream escrita = new PrintStream(saida);
            
            if(args.length > 0) {
                //Envio a string passada
                escrita.println(args[0]);
                
            } else {
                escrita.println("Alucard");
            } 
            
        //Caso não encontre o host    
        } catch (UnknownHostException ex) {
            ex.printStackTrace();
        //Caso ocorra alguma exceção na criação do fluxo
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        
    }
}
Código da aplicação servidor:

Código:
/*
 * Main.java
 *
 * Created on 11 de Julho de 2007, 01:45
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package servidor;

//Importa pacotes para a criação de fluxos.
import java.io.*;
//Importa pacotes para a criação de sockets.
import java.net.*;

public class Main {
    
    private ServerSocket server;
    private Socket socket;
    private InputStream entrada;
    private BufferedReader read;
    
    /** Cria uma nova instânica de Main */
    public Main() {
        try {
            //Abre uma prota para escuta (LISTENING)
            server = new ServerSocket(606);            
            
            //Imprime a Mensagem "Servidor aguardando conexao."
            System.out.println("Servidor aguardando conexao.");
            
            //Aguarda e cria a uma conexão
            socket = server.accept();
            
            //Cria um fluxo de entrada
            entrada = socket.getInputStream();
            read = new BufferedReader(new InputStreamReader(entrada));
            
            //Imprime o que veio na entrada
            System.out.println(read.readLine());
            
            //Fecha o fluxo o socket e o serverSocket
            read.close();
            socket.close();
            server.close();            
            
        //Caso ocorra alguma exeção na criação do fluxo.
        } catch (IOException ex) {
            //Imprimi o que aconteceu de erro
            ex.printStackTrace();
        }        
    }
    
    /**
     * @param args argumentos da linha de comando
     */
    public static void main(String[] args) {
        //Chama o método construtor na classe
        new Main();
    }
    
}
Bom a aplicação apenas cria um socket na escuta, enquanto outra 
aplicação tenta fazer uma conexão, enviando uma frase caso informe 
na linha de comando a frase serí mostrada no lado servidor.

1 comentários:

  • 16 de janeiro de 2013 às 00:41
    Anônimo says:

    Agora como cria a interface juntamente com o programa?????

    delete

Postar um comentário

Insira seu comentário

 

Java Aberto Copyright © 2011 -- Template created by O Pregador -- Powered by Blogger