2009-12-25 6 views
2

Je suis débutant en Java et j'ai pour mission de construire une application Java de partage de fichiers P2p. J'ai commencé par créer un serveur et un client. Le client peut envoyer des messages au serveur et le serveur répond. Je crois que la prochaine étape devrait être l'insertion du Thread dans la classe du serveur. J'ai lu tout à son sujet et essayé le bourgeon je ne peux tout simplement pas le retirer. J'espère que quelqu'un peut m'aider. est classe serveur ici:Comment ajouter du fil à mon serveur?

import java.net.*; 
import java.io.*; 
import java.util.*; 

public class Server { 

    private static ServerSocket serverskiSoket; 
    private final static int PORT = 3334; 

    public static void main(String[] args) { 
    System.out.println("Server se povezuje na port: "+PORT); 

    try { 
     serverskiSoket = new ServerSocket(PORT); 
     System.out.println("Server aktivan: " + serverskiSoket); 
     System.out.println("Ceka se klijent ..."); 
    } catch (IOException ex) { 
     String dodatnaPoruka = ex.getMessage().toString(); 

     if (dodatnaPoruka.equals("Address already in use: JVM_Bind")) 
      System.out.println("Nemoguce je povezati se na port "+ PORT +" jer je zauzet od strane drugog servera."); 
      System.exit(1); 
    } 

    do { 
     handleClient(); 
    } while(true); 
    } 

    private static void handleClient() { 
    Socket link = null; 

    try { 
     link = serverskiSoket.accept(); 
     System.out.println("Klijent povezan: " + link); 

     Scanner ulazniTok = new Scanner(link.getInputStream()); 
     PrintWriter izlazniTok = new PrintWriter(link.getOutputStream(), true); 

     int brojPoruka = 0; 
     String poruka = ulazniTok.nextLine(); 

     while(!poruka.equals("zatvori")) { 
      System.out.println("Klijent kaze: " + poruka); 
      brojPoruka++; 
      izlazniTok.println("Poruka: " + brojPoruka + ": " + poruka); 
      poruka = ulazniTok.nextLine(); 
     } 

     izlazniTok.println(brojPoruka + " poruka poslato."); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } finally { 
     try { 
      System.out.println("Konekcija se zatvara..."); 
      link.close(); 
     } catch(IOException ioEx) { 
      System.out.println("Diskonekcija nije moguca! \nRazlog: " + ioEx.getMessage()); 
      System.exit(1); 
     }  
    } 
    } 
} 

et voici classe Client:

import java.net.*; 
import java.io.*; 
import java.util.*; 

public class Klijent { 

    private static InetAddress host; 
    private static final int PORT = 3334; 

    public static void main(String[] args) { 
    System.out.println("Povezivanje klijenta u toku. Molim sacekajte..."); 

    try { 
     host = InetAddress.getLocalHost(); 
    } catch (UnknownHostException ex) { 
     System.out.println("ID hosta nije pronadjen"); 
     System.exit(1); 
    } 

    pristupiServeru(); 
    } 

    private static void pristupiServeru() { 
    Socket link = null; 

    try { 
     link = new Socket(host, PORT); 
     String IPAdresa = StringCutter.RaseciString(host.toString()); 
     System.out.println("Povezan na host cija je IP adresa: "+IPAdresa+", a port: "+PORT); 


     Scanner ulazniTok = new Scanner(link.getInputStream()); 
     PrintWriter izlazniTok = new PrintWriter(link.getOutputStream(), true); 

     Scanner unosKorisnika = new Scanner(System.in); 

     String poruka, odgovor; 

     do { 
     System.out.println("Unesite poruku: "); 
     poruka = unosKorisnika.nextLine(); 
     izlazniTok.println(poruka); 
     odgovor = ulazniTok.nextLine(); 
     if (!odgovor.contains("primljeno")) 
      System.out.println("Rekli ste serveru: " + odgovor); 
     else System.out.println(odgovor); 
    } while (!poruka.equals("zatvori")); 
    } catch (IOException ex) { 
    ex.printStackTrace(); 
    } finally { 
    try { 
     System.out.println("\n*Zatvara se konekcija sa serverom...*"); 
     link.close(); 
    } catch (IOException ex){ 
     System.out.println("Diskonekcija je nemoguca"); 
     System.exit(1); 
    } 
    } 
} 
} 
+0

Par curiosité, vous commencez à partir de zéro pour le P2P ou vous allez utiliser un cadre existant? De toute façon, je voudrais entrer en contact (e-mail est dans le profil). –

Répondre

1

Voici un moyen très simple de le faire - je ne l'ai pas lu tout ce code afin tester pour vous assurer ça ne casse rien. Fondamentalement, vous exécutez le gestionnaire dans un nouveau thread à chaque fois. Il semble que le gestionnaire n'a jamais besoin de renvoyer des données à la boucle principale, ce qui devrait suffire. Sauf que vous pourriez avoir trop de threads, alors vous devriez vraiment regarder Executors.newFixedThreadPool() (http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool%28int%29) pour la mise en commun. Edit: écrémage du code, un problème que je peux voir est que vos sorties peuvent être entrelacées entre les threads. Je ne sais pas si vous vous en souciez - je ne peux pas lire la langue dans laquelle la sortie est.

+0

Fixé. Merci encore :) Oui, je suis nouveau ici et j'espère que je vais me débrouiller très bien. –

2

Avez-vous regardé les tutoriels de socket Java? Ils donnent un exemple de serveur multi-thread sur l'une des pages. Essayez d'imiter ce qu'ils font dans leur code (vous devrez faire une autre classe). Vous pouvez trouver l'exemple de code au bas de cette page: http://java.sun.com/docs/books/tutorial/networking/sockets/clientServer.html

Rechercher la rubrique « Soutenir plusieurs clients »

+0

Merci danben, j'ai planté ton code dans le serveur et ça marche très bien. Il y avait une autre exception que je devais prendre en charge, mais sinon c'est génial. Je suis désolé de ne pas avoir traduit le serbe en anglais, j'ai réalisé que j'avais fait cette erreur. @Roman Stolper Oui, j'ai vu cette page. C'est l'un des nombreux, alors je ne pensais pas que c'était important et utile. Maintenant que vous m'avez dit que je vais sûrement aller le lire. Merci encore –

+0

De rien. Heureusement que ça a marché - ce serait génial si vous pouviez marquer ma réponse comme acceptée. – danben

+0

Aussi, puisque vous êtes nouveau ici - généralement si vous vouliez me répondre vous laisseriez le commentaire sur ma réponse. Pas grand chose, je l'ai trouvé. – danben

Questions connexes