2013-04-11 4 views
0

Je travaille actuellement sur un programme Java basé sur un socket multithread qui devrait permettre à plusieurs threads d'envoyer une requête à ce programme. Cela devrait être géré avec l'activation de l'événement, mais j'ai du mal à comprendre les événements et leur mise en œuvre. Ci-dessous, le code qui devrait permettre à plus d'un thread de communiquer avec le programme, mais je n'ai qu'un thread ici. Quelqu'un peut-il s'il vous plaît apporter plus de lumière à ce sujet? Très appréciée.Comment créer un événement en Java

//this is a a threads class 
import java.io.BufferedOutputStream; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.util.logging.Level; 
import java.util.logging.Logger; 


public class Niti implements Runnable { 

    public String line; 
    public Socket soc; 
    public boolean active=true; 

    public Niti(Socket soc) 
    { 
     this.soc=soc; 
     this.line=line; 
     this.active=active; 
    } 


    public synchronized void run() { 
     try { 
      BufferedReader br = new BufferedReader(new InputStreamReader(soc.getInputStream())); 
      line=br.readLine(); 
      while(line!=null && !line.equals("")){ 

       if(!this.active) 
        break; 

       System.out.println(line); 
       line=br.readLine(); 
      } 

      BufferedOutputStream bos = new BufferedOutputStream(soc.getOutputStream()); 
      bos.write("Poruka iz Programa".getBytes()); 

     } 
     catch (IOException ex) { 
      Logger.getLogger(Niti.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     try {   
      soc.close(); 

     } catch (IOException ex) { 
      Logger.getLogger(Niti.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 



import java.io.BufferedOutputStream; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 


//and this is the main class 
public class Server{ 


    public static synchronized void main(String[] args) throws IOException, InterruptedException{ 

     ServerSocket ss = new ServerSocket(1000); 

     while(true){ 
      Socket sokit = ss.accept(); 
      Niti n = new Niti(sokit); 
      while(true){ 

       Thread t = new Thread(n); 
       t.start(); 

       //Thread.sleep(4000); 
       //n.active=false; 
       System.out.println("nit broj:" + Thread.currentThread().getId()); 
      } 
     } 
    } 
} 
+0

Désolé mais j'ai du mal à comprendre ce que vous demandez. Voulez-vous transmettre certains paramètres au nouveau thread? – m0skit0

+1

Salut Ivan, j'ai remarqué que vous attrapez la même 'IOException' deux fois dans la même méthode. Bien que cela ne fasse aucune différence, il serait préférable d'utiliser seulement 1 bloc catch pour la même 'IOException'. Cela rendra votre code un peu plus ordonné. – blackpanther

+0

Ce que j'essaie de faire est d'activer plusieurs threads pour accéder à ce serveur au lieu d'un seul. Si vous mettez ce code dans votre Net Beans, il passera à travers un seul thread. Dernièrement, on m'a dit que pour que plusieurs threads puissent accéder au serveur, je devais créer des événements et des auditeurs qui pourraient aider à résoudre ce problème. Je ne sais pas comment faire cela, avez-vous une idée d'où je devrais commencer? TY –

Répondre

0

Eh bien, sans regard à la classe Niti (qui est la classe de gestionnaire de client comme je le suppose) que vous avez une erreur de logique ici:

while(true){ 
     Socket sokit = ss.accept(); 
     Niti n = new Niti(sokit); 
     while(true){ // LOGIC ERROR!!! 

      Thread t = new Thread(n); 
      t.start(); 

      //Thread.sleep(4000); 
      //n.active=false; 
      System.out.println("nit broj:" + Thread.currentThread().getId()); 
     } 
    } 

Avec le code ci-dessus vous créez Threads InfinIT après passage la première fois par la méthode d'acceptation. Ce que vous devez faire est d'enlever la seconde while (true), comme ceci:

while(true){ 
     Socket sokit = ss.accept(); 
     Niti n = new Niti(sokit); 

     Thread t = new Thread(n); 
     t.start(); 

     //Thread.sleep(4000); 
     //n.active=false; 
     System.out.println("nit broj:" + Thread.currentThread().getId());    
    } 
+0

C'est exact, merci de l'avoir signalé. J'ai coupé la boucle while (true) en question et cela fonctionne bien maintenant. Maintenant, quand je tape dans mon navigateur http: // localhost: 1000/le programme imprime la demande de mon navigateur qu'il est censé faire et chaque fois que je clique sur la page du bouton d'actualisation, il imprime le même message. Le problème est que j'ai besoin de plus d'un thread. Comment créer une logique qui va permettre plusieurs threads, ce que je voulais initialement construire? S'il vous plaît donnez votre avis. Tx –

+0

Je ne sais toujours pas où vous voulez plus de Threads. Si vous voulez que plus d'un thread traite le code de classe 'Niti', par exemple pour faire le' System.out.println (line); ', créez simplement un nouveau thread pour le traiter, mais, pour la logique actuelle, le code: 'Socket sokit = ss.accept();' de la classe 'Server' et le code:' line = br.readLine(); 'de' Niti' ** doit ** s'exécuter dans un seul Thread (vraiment un thread pour la classe 'Server' et un thread par client pour la classe' Niti'). Si ce n'est pas ce que vous voulez traiter dans un autre thread, alors, essayez de faire un exemple plus complet et plus proche du but. –