Socket + ImageIO

5 respostas
C

Galera eh o seguinte estou desenvolvendo um aplicaçao, um pequeno servidor com funçoes limitadas, e meu codigo nao tah funfando.O trem e mais ou menos assim:

Testes da Aplicaçao

Client

// client.java
import java.net.*;
import java.io.*;
import java.awt.image.BufferedImage;
import javax.imageio.*;
import javax.swing.*;
import java.awt.Image;    
public class Client
{
     public static void main(String args[] )
     {
        String sumString = "";
        try
        {  
            System.out.println("Abrindo o socket e criando o stream.");
            String host = args[0];
            Socket socket = new Socket (host, 5000);
            
            DataOutputStream ostream = new DataOutputStream(socket.getOutputStream());
            
            //DataInputStream istream = new DataInputStream(socket.getInputStream());
            InputStream input = socket.getInputStream();
            
            ostream.writeUTF("testando ...");
           
            
            System.out.println("Nao passei no read ...");
            BufferedImage imgcapturada = ImageIO.read(input);
            System.out.println("Passei no read ...");
            
            
            JFrame frm = new JFrame("Teste Imagem");
            JPanel pan = new JPanel();
            JLabel lbl = new JLabel(new ImageIcon(imgcapturada));
            pan.add( lbl );
            frm.getContentPane().add(pan);
            frm.repaint();
            frm.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            frm.pack();
            frm.setVisible(true);
            socket.close();
        }
        catch(Exception e)
        { 
            System.err.println(e);
        }
    }
}

Server

import java.net.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.awt.Container;
import java.awt.Color;
import java.awt.Graphics2D;
import javax.imageio.*;
        
public class Server 
{ 
    public static int portNr =5000;
    public static boolean conection = true;
    public Server(){}
    public static synchronized BufferedImage criaPaint(Socket client)
    {
      
         while(!conection)
         {
            try 
            {
                client.wait();
            } 
            catch (Exception e) {}
         }
         Toolkit toolkit = Toolkit.getDefaultToolkit();
         Dimension screenSize = toolkit.getScreenSize();
         Point pt = new Point(0,0);
         Rectangle screenRect = new Rectangle(pt, screenSize);
         Robot robot = null;
         try
         {
              robot = new Robot();
         } 
         catch(Exception e) 
         {
              System.out.println("ERRO _ ROBOT");
         }
         BufferedImage imgcapturada = (BufferedImage)robot.createScreenCapture(screenRect);
         return imgcapturada;
        
    }
    public static void main( String argv[] ) throws IOException 
    {
       ServerSocket ss=null;
       try 
       {
          ss = new ServerSocket(Server.portNr);
          System.out.println("starting...");
       }
       catch (IOException e) 
       {
          System.out.println( "I/O error " + e.toString() ); 
       }
       while ( true ) 
       { 
          ServerConnection serverConect = new ServerConnection(ss.accept());
          serverConect.start();
          System.out.println("new connection");
        
       }
    }  
}
class ServerConnection extends Thread 
{
    private Socket client;
    ServerConnection ( Socket client ) throws SocketException 
    {
        this.client = client;
        setPriority( NORM_PRIORITY - 1 );
    }
    public void run() 
    {
        //ImageIO.write(RenderedImage im, String formatName, OutputStream output); 
        boolean connection = true; // connection tester for current client
        try 
        {
            DataInputStream istream = new DataInputStream(client.getInputStream());
            String sumString = istream.readUTF();
            OutputStream out = this.client.getOutputStream(); 
            BufferedImage imgcapturada = Server.criaPaint(this.client);
            ImageIO.write(imgcapturada,"jpg",out);
            Server.conection = false;
            client.close();
        }
        catch ( IOException e ) 
        {
           System.out.println( "I/O error " + e ); 
        }
    }
}

A minha ideia a criar uma thread para executar os ascept() do servidor da forma que a regiao critica seja sincronizada e protegida de acessos
multiplos. A regiao critica eh o metoda criaPaint() e a variavel conection.O programa pára a execuçao qdo chega no trecho de codigo:
BufferedImage imgcapturada = ImageIO.read(input);
e nao mostra a janela com a foto tirada no servidor.

Desde jah agradeço
Carlos Martins

5 Respostas

biozit

tipo…ele mostra algum erro ???

qual é formato da imagem que ta sendo lida ?

C

biozit

Nao dah erro, apenas o cliente nao conclui a operaçao. Pára no trecho

BufferedImage imgcapturada = ImageIO.read(input);
Nao sei d qual tipo eh a imgem pois capturo ela do Tolkit, em pixel’s.

BufferedImage imgcapturada = (BufferedImage)robot.createScreenCapture(screenRect)

Acho q vou precisar de mais tempo para debugar esse pequeno codigo …

Carlos Martins

KWill

Dê flush() no OutputStream do Socket, antes de fechar o Socket, no lado que escreve a imagem que os dados devem chegar no lado que lê a imagem.

Inté.

C

KWill

eh isso msm cara valew d+.

Carlos Martins

lilialnas

veh soh na tua aplicacao o cliente le atraves do BufferedImage a imagem capturada…
mas como vc esta capturando a imagem no servidor?
Tu poderia me ajudar?

Criado 16 de abril de 2007
Ultima resposta 2 de jun. de 2008
Respostas 5
Participantes 4