Abrir imagem de um ServerSocket?

4 respostas
fernandopaiva

Salve galera.

Como eu faço para abrir uma imagem que está num ServerSocket sem ter q baixa-la ? Como se fosse um mapeamento de rede, entende ?

Estou tentando fazer assim, mas estou tendo q salvar a imagem do ServerSocket no Client Socket.

vejam.

//Inicia ServerSocket
public class IguanaMarketServerSocket {    
    private static final Integer PORT = 1234;
    
    public IguanaMarketServerSocket(){
        begin();
    }
    
    public void begin(){
        //inicia servidor socket
        try {
            java.net.ServerSocket server = new java.net.ServerSocket(PORT); 
            System.out.println("Servidor iniciado, ouvindo a porta " + PORT);   
            while(true) {
                Socket client = server.accept();             
                new ThreadIguanaMarketServerSocket(client).start();
            }    
        } catch (IOException ex) {
            Logger.getLogger(IguanaMarketServerSocket.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public static void main(String[] args){
        new IguanaMarketServerSocket();
    }
}


//aqui uma thread para as conexoes
public class ThreadIguanaMarketServerSocket extends Thread{
    private Socket client;
    
    public ThreadIguanaMarketServerSocket(Socket client){
        this.client = client;
    }
    
    public void run(){
        try {
            ObjectInputStream entrada = new ObjectInputStream(client.getInputStream());
            DataOutputStream saida  = new DataOutputStream(client.getOutputStream());
            String arquivo = (String)entrada.readObject();
            byte buffer[] = new byte[512];
            FileInputStream file = new FileInputStream(arquivo);
            DataInputStream arq = new DataInputStream(file);
            saida.flush();
            int leitura = arq.read(buffer);
            while(leitura != - 1) {
                if(leitura != - 2) {
                    saida.write(buffer,0,leitura);
                }
                leitura = arq.read(buffer);
            }
            System.out.println("Cliente atendido com sucesso: " + arquivo +
            client.getRemoteSocketAddress().toString());
            entrada.close();
            saida.close();
            client.close();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ThreadIguanaMarketServerSocket.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ThreadIguanaMarketServerSocket.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    
}


//aqui o Client Socket.
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
    try{        
        Socket sk = new Socket("localhost", 1234);
        ObjectOutputStream saida = new ObjectOutputStream(sk.getOutputStream());
        saida.writeObject("\\Java.png"); //a imagem que quero
                
        DataInputStream entrada = new DataInputStream(sk.getInputStream());
        FileOutputStream sarq = new FileOutputStream("/IguanaSistemas/imagem.png"); //tenho q salvar a imagem
        byte[] br = new byte[512];
        int leitura = entrada.read(br);
        while(leitura != -1) {
            if(leitura != -2) {
                sarq.write(br,0,leitura);
            }
            leitura = entrada.read(br);
        }
        saida.close();
        entrada.close();
        sarq.close();
        sk.close();
        //ImageIcon img = new ImageIcon(saida);
        //image.setIcon(img);
     
    }catch(UnknownHostException e){
        
    }catch(IOException e){
        
    }    
}

Quero abrir essa imagem diretamente do ServerSocket sem ter q salva-la, tem como fazer isso ?

obrigado.

4 Respostas

T

Tenho algumas possibilidades
1 você pode mandar os bytes da imagem e manipular
montar em um file ou mandar para o aplicativos cliente montar a imagem

ou para essa imagem estar compartilhada na rede
seria talves em um outro servidor web (apache) ai vc tem a URL da imagem

ou sendo compartilhada seria ip/pasta/imagem.png

acredito que pode te ajudar

julianolandim

Se voce buscar essas imagens no servidor normalmente sem socket nao daria certo ?
Tipo colocando somente o caminho da pasta das imagens ipservidor/imagens/foto.png
so que ai voce teria que arrumar um jeito de compartilhar a pasta de imagens quando for instalar os sistema.

ViniGodoy

Não tem como. Mapeamentos de rede só existem porque, sobre o Socket, os sistemas operacionais executam um protocolo chamado NFS, que baixa e abre a imagem.
Da mesma forma, na web temos protocolos para resolução de endereços (DNS), exibição de hipertexto (http) e download da imagem em si, que são automaticamente acionados quando você escreve o endereço da imagem no navegador.

Para saber como o NFS funciona, você pode ler as RFCs 1094, 1813, 3010 e 5661. Existiram outros protocolos de sistemas de arquivos em rede, como os protocolos da Novell, mas não sei se ainda estão em uso.

Se você quer trabalhar em alto nível, o ideal é baixar uma API que encapsule os detalhes de como realizar essas transações socket para você, como a WebNFS:
http://docs.oracle.com/cd/E19455-01/806-1067/index.html

Mas provavelmente a sujestão do juliano funciona, pois creio que o Java seja capaz de solicitar os arquivos ao próprio sistema de arquivos, que já implementa o protocolo.

T

NFS
lembrei do samba
que compartilha arquivos
e o java tem uma api

jcifs acessa tanto linux quanto win
que é o protocolo cifs ou samba

da uma olhada

site do projeto

http://jcifs.samba.org/

mais trabalhar com arquivos eu outro servidor usando samba ou qualquer outra coisa
tem que ter um bom motivo

imagina 30 clientes (PC) rodando seu programa
cada um com o servidor samba neles ou compartilhando arquivos
fica tosco
parece o tempo que o pessoal usava .dbf

Criado 7 de janeiro de 2012
Ultima resposta 8 de jan. de 2012
Respostas 4
Participantes 4