Serveur web java multithread

Serveur web java multithread - Java - Programmation

Marsh Posté le 04-03-2013 à 17:49:40    

Bonjour, voilà je dois mettre en place un client qui va faire une requête http, un proxy qui va rediriger la requête du client sur le port 8000 et le serveur web qui doit lui répondre. J'ai réussi à faire un client autonome (il faire la requête http et récupère le résultat dans un fichier .html). J'attaque donc maintenant le serveur web mais j'ai des problèmes au niveau de l'objet Thread donc voici l'erreur : no suitable thread for Application.
Je m'explique le serveur web se divise en 2 script :  
 
- Le 1er Socket_Serveur.java : créer une socket d'ecoute sur un port donné (8000 est un exemple :)) une fois la requête reçu, le serveur va créer un Thread après avoir accepter la connexion et faire appel à la classe Application.
 
- Application.java : cette classe va permettre au serveur de trier la requête http et envoyer bloc par bloc la réponse à la requête http.
 
Pour faire simple :  
 
- le client on va lui créer une requête http static : www.google.fr:80
- le proxy va rediriger la requête sur le port 8000 (port d'ecoute du serveur web)
- le serveur répond au proxy, ce dernier va stocker la réponse dans un fichier html et l'envoyer au client
 
Mon problème : Le Thread
 
voilà les 2 scripts :
 
Socket_Serveur.java :

Code :
  1. package socket_serveur;
  2. //~--- JDK imports ------------------------------------------------------------
  3. import java.io.*;
  4. import java.net.*;
  5. /**
  6. *
  7. * @author Furil
  8. */
  9. public class Socket_Serveur {
  10.     /**
  11.      * @param args the command line arguments
  12.      */
  13.     public static void main(String[] args) {
  14.         // TODO code application logic here
  15.         ServerSocket ecoute = null;
  16.         try {
  17.             ecoute = new ServerSocket(Integer.parseInt(args[0]));
  18.         } catch (IOException e) {
  19.             System.err.println("Impossible d'ecouter sur le port indiqué" );
  20.             System.exit(1);
  21.         }
  22.         Socket client = null;
  23.         while (true) {
  24.             try {
  25.                 client = ecoute.accept();
  26.                
  27.                 Thread fils = new Thread(new Application(client));   //  l'erreur se trouve ici no suitable thread for application //
  28.                 System.out.println("Thread " + fils.getName() + "cree" );
  29.                 fils.start();
  30.             } catch (IOException e) {
  31.                 System.err.append("Erreur d'accept()'." );
  32.                 System.exit(1);
  33.             }
  34.         }
  35.     }
  36. }


 
 
et la classe Application :
 

Code :
  1. package socket_serveur;
  2. import java.io.*;
  3. import java.net.*;
  4. import java.util.regex.*;
  5. /**
  6. *
  7. * @author Furil
  8. */
  9. public class Application {
  10.    
  11.     Socket client;
  12.     Application(Socket client) throws SocketException{
  13.         this.client = client;
  14.     }
  15.    
  16.     //Corps de l'appli
  17.    
  18.     public void run(){
  19.         try {
  20.             BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream(), "8859_1" ));
  21.             OutputStream out = client.getOutputStream();
  22.             PrintWriter pout = new PrintWriter(new OutputStreamWriter(out,"8859_1" ),true);
  23.            
  24.             //lire la requete HTTP dnas la socket
  25.            
  26.             String requete = in.readLine();
  27.             System.out.println("Requete:"+requete);
  28.            
  29.             //Filtrage de la requete grace a l'expression reguliere
  30.            
  31.             Matcher get = Pattern.compile("GET (/?\\S*).*" ).matcher(requete);
  32.            
  33.             //traitement de la requete aprés filtrage
  34.            
  35.             if(get.matches()){
  36.                 requete = get.group(1);
  37.                 if(requete.endsWith("/" ) || requete.equals("" ))
  38.                     requete = requete + "index.html";
  39.                
  40.                 //envoie du fichier par bloc
  41.                
  42.                 try{
  43.                     FileInputStream fis = new FileInputStream(requete);
  44.                     byte [] data = new byte [64*1024];
  45.                    
  46.                     for(int read = 0;(fis.read(data))> -1;){
  47.                         out.write(data,0,read);
  48.                         out.flush();
  49.                     }
  50.                        
  51.                 } catch(FileNotFoundException e){
  52.                     pout.println("Objet non trouve" );
  53.                 }
  54.             }else
  55.                 pout.println("requete erronee" );
  56.             client.close();
  57.            
  58.                
  59.                
  60.             } catch(IOException e){
  61.                
  62.                 System.out.print("Erreur E/S"+e);
  63.            
  64.         }
  65.     }
  66.    
  67.    
  68. }


 
 
Bon après si j'ai fais trop compliqué n'hésitez pas à me conseiller, j'ai commencé java socket depuis peu ^^ donc je suis ouvert à toute solution :)
 
Merci et bonne soirée :)

Reply

Marsh Posté le 04-03-2013 à 17:49:40   

Reply

Marsh Posté le 04-03-2013 à 19:05:46    

  • Tu tentes d'instancier un Thread en lui passant une Application. Ce constructeur n'existe pas. Par contre, un Runnable conviendrait
  • Thread, c'est vraiment bas niveau et old school
  • Je passe sur la gestion des exceptions et les différents buffers mal fermés, je suppose que tu débutes


---------------
http://devicenotready.com/ - Informatique et autres bizarreries
Reply

Marsh Posté le 04-03-2013 à 19:26:50    

Bonsoir devicenotready,
 
Tous d'abord merci de ta réponse. Ensuite oui je débute :) .
Concernant Application, dans Application.java, je précise qu'il aura en paramètre le socket client donc il est bien existant.
Après pour les exceptions et buffer mal fermés je vais regarder ça de plus près . :)
Ensuite Thread, je dois l'utiliser, ça m'est imposé ^^
En tout cas merci d'avoir pris le temps de répondre et bonne soirée :)

Reply

Marsh Posté le 25-03-2013 à 21:32:29    

Voilà après quelques modifications il me reste toujours une erreur(Au niveau de la classe Application) :
 

Code :
  1. byte[] data = new byte[64*1024]


 
Cette erreur disparaît lors de l'insertion d'un try/catch. Mais j'ai du mal le placé car il me dit d'utiliser finally au lieu du catch. voilà la partie du code :
 

Code :
  1. try{
  2.     FileInputStream fis = new FileInputStream(requete);
  3.     ByteArrayOutputStream bos = new ByteArrayOutputStream();
  4.     byte[] data = new byte[64*1024];
  5.    
  6.     for(int read; (read=fis.read(data)) > -1;)
  7.         out.write(data);
  8.         out.flush();
  9.    
  10.     }
  11.     catch{
  12.         (Exception e)
  13.         }
  14.         client.close();
  15.    
  16.    
  17.    
  18.        
  19. }
  20. }

Reply

Sujets relatifs:

Leave a Replay

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