Partage
  • Partager sur Facebook
  • Partager sur Twitter

Transfère d'une image (socket)

Sujet résolu
    13 janvier 2009 à 9:07:20

    Bonjour,

    J'essaie de transférer une image jpg. Je la transfère en l'ouvrir et en envoyant les données "txt"(si je puis dire) byte par byte.
    Mais le résultat de départ et d'arrivé ne sont pas du tout les mêmes.

    Citation : Code Serveur

    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    package testserveurudp;
    
    import java.io.*;
    import java.net.*;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    /**
     *
     * @author Emmanuel
     */
    public class Server {
        
        public Server() throws IOException{
    
            Thread t = new DaemonThread();
            
      }
    
        class DaemonThread extends Thread{
            public DaemonThread(){
            start();
            }
    
            @Override
            public void run(){
    
            Socket skt = null;
            ServerSocket srvr = null;
                try {
                    srvr = new ServerSocket(1234);
                } catch (IOException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                }
    
            while(true){
                 try{
                     skt = srvr.accept();
                     System.out.print("Server has connected! \n");
                }catch(IOException ioe){
                     System.out.print("Whoops! It didn't work! - "+ioe.getMessage()+"\n");
                     Thread.currentThread().interrupt();
                     System.out.println("thread interrupted");
                }
                 Thread t = new Thread(new ServerData(skt));
                 t.start();
            }
    
            }
        }
    
    
      class ServerData implements Runnable{
          private Socket skt;
          private String str;
          public ServerData(Socket skt){
              this.skt = skt;
              str = null;
          }
    
          public void run(){
              
          try{
             PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
             BufferedInputStream in = new BufferedInputStream(skt.getInputStream());
             System.out.print("Receiving : ");
             saveFile(in);
             System.out.print("IN \n");
             in.close();
             skt.close();
             }catch(IOException ioe){
    
             }
          }
      
      }
      
         protected void saveFile(BufferedInputStream in) {
             
            FileWriter fw;
            String str = null;
            
            try {
                    fw = new FileWriter(new File(System.getProperty("user.dir")+System.getProperty("file.separator")+"test.jpg"));
                    byte[] b = new byte[1024];
                    int i = 0;
                    String temp = null;
                    System.out.println("-------------------------------------------------------------------------");
                    while(true){
                        temp = null;
                        while((i=in.read(b, 0, 1024)) != -1){
                            temp = null;
                           temp = new String(b);
                           //System.out.println(": "+temp+"\n------"+i+"\n\n");
                        }
                        if(temp==null){
                            fw.write(str);
                            break;
                        }else{
                            str += temp;
                            System.out.print(str);
                        }
                    }
                    fw.close();
                    System.out.println("Done");
                    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }     	
    
                
       }
    
    
    }
    


    Citation : Code client :

    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    package testclientudp;
    
    import java.io.*;
    import java.net.*;
    
    public class Main {
    
    
    
      public static void main(String argv2[]) throws Exception {
         try {
             Socket skt = new Socket("192.168.1.206", 1234);
             BufferedReader in = new BufferedReader(new
                InputStreamReader(skt.getInputStream()));
             BufferedOutputStream out = new BufferedOutputStream(skt.getOutputStream());
    
             System.out.print("Sending string\n");
             out = load(out);
             System.out.print("string sended\n");
             out.flush();
             out.close();
          }
          catch(Exception e) {
             System.out.print("Whoops! It didn't work! : +"+e.getMessage()+"\n");
          }
    
      }
    
        private static BufferedOutputStream load(BufferedOutputStream out) throws FileNotFoundException, IOException {
            String str = null;
            FileInputStream fr = new FileInputStream(new File(System.getProperty("user.dir") +System.getProperty("file.separator")+"image.jpg"));
            System.out.print("File created\n");
            int i = 0;
            byte []b = new byte[1024];
            while((i = fr.read(b)) != -1){
    				out.write(b, 0, i);
                    System.out.print("Sending :"+i+" :: "+b[0]+"\n");
            }
    
            out.write("end\n".getBytes());
            
            return out;
        }
    }
    


    Savez-vous pourquoi le résultat n'est pas juste ?
    • Partager sur Facebook
    • Partager sur Twitter
      13 janvier 2009 à 10:32:39

      je n'ai pas lu tout le comme mais en tout cas il ne faut pas utiliser des chaines pour transmettre un fichier binaire.

      Pourquoi n'utilise tu pas simplement un fileInputStream et puis écrire et lire directement avec le outputStream et inputStream octet par octet.

      Sinon un autre moyen est d'utiliser imageIO, qui peut lire/écrire une image, si tu lui fournit un inputStream
      • Partager sur Facebook
      • Partager sur Twitter
        13 janvier 2009 à 10:39:03

        Mais si après je veux crypter le flux, que dois-je employer des 2 ?
        • Partager sur Facebook
        • Partager sur Twitter
          13 janvier 2009 à 11:18:32

          les deux peuvent convenir, il suffit de faire deux classes intermédiaires, l'une prenant un inputStream, et l'autre un outputStream, et possèdant respectivement les méthodes read() et write(int byte)
          • Partager sur Facebook
          • Partager sur Twitter
            13 janvier 2009 à 11:29:13

            Le FileInputStream, c'est pour charger l'image avant de l'envoyer non ? Car je le faisait déjà.
            FileInputStream fr = new FileInputStream(new File(System.getProperty("user.dir") +System.getProperty("file.separator")+"image.jpg"));
            


            Et je le lisais comme cela :
            (i = fr.read(b))
            


            EDIT : J'ai suivis tes conseils, avec InputStream et OutputStream, tout marchent merci beaucoup :D
            Et aurait tu un lien pour ce qui est du cryptage de flux ? Merci d'avance :D
            • Partager sur Facebook
            • Partager sur Twitter
              13 janvier 2009 à 12:48:34

              premièrement tu fais deux classes

              import java.io.IOException;
              import java.io.InputStream;
              
              public abstract class CryptedInputStream extends InputStream {
              
                  private InputStream in;
              
                  public CryptedInputStream(InputStream in) {
              	this.in = in;
                  }
                 
                  public int read() throws IOException {
              	return crypt(in.read());
                  }
                  
                  protected abstract int crypt(int read);
              }
              


              et
              import java.io.IOException;
              import java.io.OutputStream;
              
              public abstract class CryptedOutputStream extends OutputStream {
              
                  private OutputStream out;
              
                  public CryptedOutputStream(OutputStream out) {
              	this.out = out;
                  }
                 
                  public void write(int b) throws IOException {
              	out.write(uncrypt(b));
                  }
                  
                  protected abstract int uncrypt(int b);
              
              }
              

              et il ne te reste qu'à faire les fonctions crypt et uncrypt. Pour le cryptage, il y a un tuto ici : http://www.siteduzero.com/tutoriel-3-2 [...] thme-rsa.html
              • Partager sur Facebook
              • Partager sur Twitter
                13 janvier 2009 à 13:13:36

                Merci beaucoup, je vais voire cela.
                • Partager sur Facebook
                • Partager sur Twitter

                Transfère d'une image (socket)

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown