Pb Protocole TCP[Résolu]

Pb Protocole TCP[Résolu] - Java - Programmation

Marsh Posté le 24-12-2012 à 15:44:12    

Bonjour,  
 
 Je cherche à programmer une application de vidéo à la demande, mais je rencontre des erreurs à l'exécution...
Peut etre pouvez vous m'aider ?
 
Mon application se compose d'une class Serveur (canal de commande) et d'une classe ServeurDonnee (canal de communication)
spécialisé en deux sous-classe : TCP_PUSH et TCP_PULL.
Pour me connecter au serveur, j'utilise soit du tellnet soit des applications clients trouvé sur le net.
Je me connecte alors au serveur, qui m'envoie un catalogue des flux dont il dispose.  
Je me connecte alors au serveur qui possède le flux qui m'intéresse.
Je créer alors un autre terminal et je demande à ce nouveau serveur de m'envoyer les données sur un nouveau port par l'intermédiaire des commandes "GET id" et "START".
 
Voici le détail de mes classes :  
 
 
class Serveur :
 
 

Code :
  1. public class Serveur implements Runnable{
  2. public static void main(String[] args) throws Exception {
  3.  ServerSocket srv = new ServerSocket(port());
  4.  while(true){
  5.  Socket client=srv.accept();
  6.        Thread t = new Thread(new Serveur(client));
  7.        t.start();
  8.       System.out.println("client connecté" );
  9.  }
  10.    }
  11.    BufferedReader clientInput_1;
  12.    OutputStream clientOutput_1;
  13.    OutputStream clientOutput_2;
  14.    PrintWriter out;
  15.    File f;
  16.    Socket clientInput;
  17.    ArrayList<String> IMAGE_ID;
  18.    float ips=0;
  19.    String clientIP;
  20.   Thread serveurDonnee;
  21.   String protocole;
  22.  
  23.   public Serveur(Socket client) throws Exception {
  24.      clientInput_1 = new BufferedReader(
  25.        new InputStreamReader(client.getInputStream()));
  26.      clientOutput_1 = client.getOutputStream();
  27.       out=new PrintWriter(clientOutput_1, true);
  28.       clientIP=client.getInetAddress().getHostAddress();
  29.       IMAGE_ID=new ArrayList<String>();
  30.      
  31.       protocole="TCP_PUSH";
  32.      
  33.    }
  34.  
  35.   public int copyStream(InputStream in, OutputStream out, boolean close)
  36.   throws IOException
  37.   {
  38.     int nbytes = 0, total = 0;
  39.     byte[] buf = new byte[1024];
  40.     while ((nbytes = in.read(buf)) > 0)
  41.     {
  42.     out.write(buf, 0, nbytes);
  43.     total += nbytes;
  44.    }
  45.    if(close) in.close();
  46.    return total;
  47.  }
  48.  
  49.   public String entete(int number)
  50.   {
  51.    String s="";
  52.    s+="HTTP/1.1 200 OK\n\r";
  53.    s+="Server: TP_4IF_MediaServer\n\r";
  54.    s+="Connection: Keep-Alive\n\r";
  55.    s+="Content-Type: text/txt\n\r";
  56.    s+="Content-Length: "+number+"\n\r";
  57.    return s;
  58.   }
  59.  
  60.   public static int port() throws IOException
  61.   {
  62.    int res=0;
  63.    File startup =new File("startup.txt" );
  64.    InputStream ips=new FileInputStream(startup);
  65.    InputStreamReader ipsr=new InputStreamReader(ips);
  66.    BufferedReader br=new BufferedReader(ipsr);
  67.    br.readLine();
  68.    res=Integer.parseInt(br.readLine().split(": " )[1]);
  69.    br.close();
  70.    return res;
  71.   
  72.   }
  73.  
  74.   public File creerFichier() throws Exception
  75.   {
  76.    File f=new File("Catalogue.txt" );
  77.    File startup =new File("startup.txt" );
  78.    InputStream ips=new FileInputStream(startup);
  79.    InputStreamReader ipsr=new InputStreamReader(ips);
  80.    BufferedReader br=new BufferedReader(ipsr);
  81.    OutputStream ops=new FileOutputStream(f);
  82.    OutputStreamWriter opsr=new OutputStreamWriter(ops);
  83.    BufferedWriter bw=new BufferedWriter(opsr);
  84.    String ligne;
  85.    ligne=br.readLine();
  86.    bw.write(ligne);
  87.    bw.newLine();
  88.    ligne=br.readLine();
  89.    bw.write(ligne);
  90.    bw.newLine();
  91.    while ((ligne=br.readLine())!=null)
  92.    {
  93.     File g=new File(ligne);
  94.     InputStream ips2=new FileInputStream(g);
  95.     InputStreamReader ipsr2=new InputStreamReader(ips2);
  96.     BufferedReader br2=new BufferedReader(ipsr2);
  97.     String contenu = "Object ";
  98.     String ligne2;
  99.     int c=0;
  100.     while (c++<7)
  101.     {
  102.      ligne2=br2.readLine();
  103.      contenu+=ligne2.split(": " )[0].toLowerCase()+"="+ligne2.split(": " )[1]+" ";
  104.     }
  105.     bw.write(contenu);
  106.     bw.newLine();
  107.     br2.close();
  108.    }
  109.    bw.newLine();
  110.    br.close();
  111.    bw.close();
  112.    return f;
  113.   }
  114.  
  115.   public void run() {
  116.   
  117.    boolean pause=false;
  118.    boolean first_Get_Occ_TCP_PULL=true;
  119.    TCP_PULL tcp_pull=null;
  120.    TCP_PUSH tcp_push=null;
  121.    int ID=0;
  122.    int port_client=0;
  123.   
  124.    while(true){
  125.       try {
  126.         String line = clientInput_1.readLine();
  127.       
  128.         if(line.equals("GET /catalog.txt HTTP/1.0" ))
  129.         {
  130.          File f = creerFichier();
  131.         if(f.exists()) {
  132.          out.println(entete((int)f.length()));
  133.              copyStream(new FileInputStream(f), clientOutput_1, true);
  134.              System.out.println(" transfer done." );
  135.            }
  136.            else {
  137.              System.out.println(" file is not here..." );
  138.            }
  139.         }
  140.       
  141.         if(line!=null)
  142.         {
  143.          System.out.println("line="+line);
  144.         }
  145.       
  146.         if(line.substring(0, 3).equals("END" ))
  147.         {
  148.          System.out.println("Commande End envoyée" );
  149.         if(protocole.equals("TCP_PULL" ))
  150.          {
  151.           tcp_pull.end();
  152.          }
  153.         if(protocole.equals("TCP_PUSH" ))
  154.         {
  155.          tcp_push.end();
  156.         }
  157.         }
  158.       
  159.         if(line.equals("test" )){
  160.          out.println("bien reçu" );
  161.         }
  162.       
  163.         if(line.substring(0, 3).equals("GET" ))
  164.         { 
  165.          if(first_Get_Occ_TCP_PULL)
  166.          {
  167.           first_Get_Occ_TCP_PULL=false;
  168.           ID=Integer.parseInt(line.split(" " )[1]);
  169.           port_client=Integer.parseInt(clientInput_1.readLine().split(" " )[1]);
  170.           System.out.println("client écoute sur port "+port_client+" et demande "+ID);
  171.         
  172.           if(protocole.equals("TCP_PULL" ))
  173.           {
  174.            tcp_pull=new TCP_PULL(clientIP,port_client,ID);
  175.           }
  176.           if(protocole.equals("TCP_PUSH" ))
  177.           {
  178.            tcp_push=new TCP_PUSH(clientIP,port_client,ID);
  179.           }
  180.         
  181.          }else
  182.          {
  183.           if(protocole.equals("TCP_PULL" ))
  184.           {
  185.            int im_id=Integer.parseInt(line.split(" " )[1]);
  186.            tcp_pull.setId(im_id);
  187.           }
  188.          }
  189.         }
  190.       
  191.         if(line.substring(0, 5).equals("START" ))
  192.         {
  193.          if(pause)
  194.          {
  195.           tcp_push.reprend();
  196.           pause=false;
  197.          }else
  198.          {
  199.           tcp_push.start();
  200.          }
  201.         }
  202.       
  203.         if(line.substring(0, 5).equals("PAUSE" ))
  204.         {
  205.          tcp_push.pause();
  206.          pause=true;
  207.        
  208.         }
  209.       
  210.         System.out.println("juste avant end" );
  211.       
  212.      } catch(Exception e) { }
  213.     }
  214.   }
  215.  
  216.  
  217. }


 

class ServeurDonnee :

 

Code :
  1. public class ServeurDonnee extends Socket implements Runnable{
  2. OutputStream clientOutput;
  3. PrintWriter out;
  4. ArrayList<String> IMAGE_ID;
  5. float ips;
  6. public ServeurDonnee(String adresse_client, int port_client,int id) throws Exception
  7. {
  8.  super(adresse_client,port_client);
  9.  System.out.println(adresse_client+" "+port_client);
  10.     IMAGE_ID=new ArrayList<String>();
  11.     parcourir(id);
  12.     clientOutput =this.getOutputStream();
  13.     out=new PrintWriter(clientOutput, true);
  14. }
  15.   public void parcourir(int id) throws Exception {
  16.    File flux=new File("flux"+id+".txt" );
  17.    InputStream ifs=new FileInputStream(flux);
  18.    InputStreamReader ifsr=new InputStreamReader(ifs);
  19.    BufferedReader brf=new BufferedReader(ifsr);
  20.    String line;
  21.    line=brf.readLine();
  22.    line=brf.readLine();
  23.    line=brf.readLine();
  24.    line=brf.readLine();
  25.    line=brf.readLine();
  26.    line=brf.readLine();
  27.    line=brf.readLine();
  28.    ips=Float.parseFloat(line.split(": " )[1]);
  29.    while(line!=null){
  30.     line=brf.readLine();
  31.    if(line!=null) IMAGE_ID.add(line);
  32.    }
  33.    brf.close();
  34.   }
  35.  
  36.   public void send(int id) throws IOException, InterruptedException
  37.   {
  38.    Thread.sleep((long)(1000/ips));
  39.    System.out.println("Procédure commencée" );
  40.        File g=new File(IMAGE_ID.get(id));
  41.        out.flush();
  42.     out.write((id+1)+"\r\n"+g.length()+"\r\n" ); 
  43.      copyStream(new FileInputStream(g),clientOutput,true);
  44.      System.out.println("Transfert done" );
  45.   }
  46.  
  47.   public int copyStream(InputStream in, OutputStream out, boolean close)
  48.   throws IOException
  49.   {
  50.     int nbytes = 0, total = 0;
  51.     byte[] buf = new byte[1024];
  52.     while ((nbytes = in.read(buf)) > 0)
  53.     {
  54.     out.write(buf, 0, nbytes);
  55.     total += nbytes;
  56.    }
  57.    if(close) in.close();
  58.    return total;
  59.  }
  60.  
  61. public void run()
  62. {
  63. }
  64. }[/spoiler]
  65. class TCP_PUSH :
  66. [spoiler]public class TCP_PUSH extends ServeurDonnee{
  67. Thread t;
  68. public TCP_PUSH(String adresse_client, int port_client,int id) throws Exception
  69. {
  70.  super(adresse_client,port_client,id);
  71.  t=new Thread(this);
  72. }
  73. public void start()
  74. {
  75.  t.start();
  76. }
  77. public void reprend()
  78. {
  79.  t.notify();
  80. }
  81. public void pause() throws InterruptedException
  82. {
  83.  t.wait();
  84. }
  85. public void end()
  86. {
  87.  System.exit(0);
  88. }
  89. public void run()
  90. {
  91.  try{
  92.       for(int i=0;i<IMAGE_ID.size()-1;i++)
  93.       {
  94.      send(i);
  95.       }
  96.     
  97.  } catch(Exception e) {e.printStackTrace();}
  98. }
  99. }


 
 
 
 
class TCP_PULL :
 
 

Code :
  1. public class TCP_PULL extends ServeurDonnee {
  2. int cursor_on_IMAGE_ID=-1;
  3. boolean isActualised=false;
  4. boolean fellow=false;
  5. Thread t;
  6. public TCP_PULL(String adresse_client, int port_client,int id) throws Exception
  7. {
  8.  super(adresse_client,port_client,id);
  9.  t=(new Thread(this));
  10.  t.start();
  11. }
  12. public void end()
  13. {
  14.  System.exit(0);
  15. }
  16. public void pause()
  17. {
  18.  try {
  19.   t.wait();
  20.  } catch (InterruptedException e) {
  21.   e.printStackTrace();
  22.  }
  23. }
  24.  
  25.   public void setId(int i) throws IOException, InterruptedException
  26.   {
  27.   
  28.    if(i<IMAGE_ID.size()-1)
  29.    {
  30.     if(i==-1 && cursor_on_IMAGE_ID< IMAGE_ID.size()-1)
  31.     {
  32.      cursor_on_IMAGE_ID++;
  33.      isActualised=true;
  34.      System.out.println("isActualised" );
  35.      t.notify();
  36.     }else
  37.     {
  38.      if(i!=-1)
  39.      {
  40.       cursor_on_IMAGE_ID++;
  41.       isActualised=true;
  42.       t.notify();
  43.      }
  44.     }
  45.    }
  46.   }
  47.  
  48. public void run()
  49. {
  50.  try{
  51.   for(;;)
  52.   {
  53.    pause();
  54.    if(isActualised)
  55.    {
  56.     send(cursor_on_IMAGE_ID);
  57.     isActualised=false;
  58.    }
  59.   }
  60.   } catch(Exception e) {e.printStackTrace();}
  61. }
  62. }


 
Et voici la trace de ma dernière exécution :
 

Citation :

client connecté
line=GET 1
client écoute sur port 60204 et demande 1
127.0.0.1 60204
juste avant end
line=
line=START
juste avant end
line=
Procédure commencée
line=END
Commande End envoyée


 
 
Merci d'avance pour toute aide, car je suis vraiment à cours d'idée.


Message édité par NotUsedPseudo le 03-01-2013 à 20:13:38
Reply

Marsh Posté le 24-12-2012 à 15:44:12   

Reply

Marsh Posté le 03-01-2013 à 20:13:58    

Pb résolu.
Pour ceux qui rencontrerait des difficultés similaires, les lignes à l'origine du problème sont celle ci :  
 

Code :
  1. out.write((id+1)+"\r\n"+g.length()+"\r\n" ); //entête
  2. copyStream(new FileInputStream(g),clientOutput,true); //image


 
La bonne façon de faire était de créer une entête à part, puis de l'envoyer aussi sous forme de byte.


Message édité par NotUsedPseudo le 04-01-2013 à 18:54:55
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed