2010-02-04 3 views
1

J'ai suivi un tutoriel pour créer le serveur de socket ci-dessous qui permet à plusieurs utilisateurs de se connecter et s'ils leur envoient des données, il les renvoie à leur tour.Aide de Java Server!

import java.awt.Color; 
    import java.awt.BorderLayout; 
    import java.awt.event.*; 
    import javax.swing.*; 

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

    class ClientWorker implements Runnable { 
     private Socket client; 
     private JTextArea textArea; 

     ClientWorker(Socket client, JTextArea textArea) { 
     this.client = client; 
     this.textArea = textArea; 
     } 

     public void run(){ 
     String line; 
     BufferedReader in = null; 
     PrintWriter out = null; 
     try{ 
      in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      out = new PrintWriter(client.getOutputStream(), true); 
     } catch (IOException e) { 
      System.out.println("in or out failed"); 
      System.exit(-1); 
     } 

     while(true){ 
      try{ 
      line = in.readLine(); 
    //Send data back to client 
      out.println(line); 
      textArea.append(line); 
      } catch (IOException e) { 
      System.out.println("Read failed"); 
      System.exit(-1); 
      } 
     } 
     } 
    } 



---------- 


    class SocketThrdServer extends JFrame{ 

     JLabel label = new JLabel("Text received over socket:"); 
     JPanel panel; 
     JTextArea textArea = new JTextArea(); 
     ServerSocket server = null; 

     SocketThrdServer(){ //Begin Constructor 
     panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     panel.setBackground(Color.white); 
     getContentPane().add(panel); 
     panel.add("North", label); 
     panel.add("Center", textArea); 
     } //End Constructor 

     public void listenSocket(){ 
     try{ 
      server = new ServerSocket(4444); 
     } catch (IOException e) { 
      System.out.println("Could not listen on port 4444"); 
      System.exit(-1); 
     } 
     while(true){ 
      ClientWorker w; 
      try{ 
      w = new ClientWorker(server.accept(), textArea); 
      Thread t = new Thread(w); 
      t.start(); 
      } catch (IOException e) { 
      System.out.println("Accept failed: 4444"); 
      System.exit(-1); 
      } 
     } 
     } 

     protected void finalize(){ 
    //Objects created in run method are finalized when 
    //program terminates and thread exits 
     try{ 
      server.close(); 
     } catch (IOException e) { 
      System.out.println("Could not close socket"); 
      System.exit(-1); 
     } 
     } 

     public static void main(String[] args){ 
      SocketThrdServer frame = new SocketThrdServer(); 
     frame.setTitle("Server Program"); 
      WindowListener l = new WindowAdapter() { 
        public void windowClosing(WindowEvent e) { 
          System.exit(0); 
        } 
      }; 
      frame.addWindowListener(l); 
      frame.pack(); 
      frame.setVisible(true); 
      frame.listenSocket(); 
     } 
    } 

Cependant je en ai besoin si les données sont envoyées au serveur plutôt que de simplement le retourner, il envoie à tout le monde qui est connecté au serveur. Si quelqu'un m'aide à résoudre ce problème, je serai toujours reconnaissant! Cela signifie que je ne pourrai pas finir mon projet d'école!

Merci d'avance :)

+3

Hé, nous ne faisons pas cela gratuitement, vous savez – skaffman

+0

pas drôle . Je fais de mon mieux pour que ça soit réglé. – IApp

Répondre

2

Ceci est votre problème:

//Send data back to client 
out.println(line); 

Comme les autres l'ont dit, utiliser une liste pour garder une trace de tous vos clients. Plus précisément, vous souhaitez une liste des clients. J'utilise une simple classe Singleton qui conserve la liste. C'est ainsi que lorsqu'un nouveau client se connecte, il s'ajoute à la liste et les autres clients n'ont pas besoin de faire quoi que ce soit pour voir qu'il y a un nouveau client. Et ajoutez une méthode comme writeString (String) à la classe ClientWorker pour faciliter l'écriture de quelque chose sur chaque client.

Vous devriez avoir une boucle vraiment basique comme celui-ci dans ClientWorker:

String line = in.readLine(); 
LinkedList<ClientWorkers> clients = SingletonClients.getClients(); 
for(int = 0; i < clients.size(); i++) { 
    ClientWorker c = clients.get(i); 
    //The client doesn't need to get it's own data back. 
    if(c == this) 
     continue; 

    c.writeString(line); 
} 

writeString sera juste:

public void writeString(String s) { 
    try { 
     out.println(s); 
    } catch(IOException ex) { 
    } 
} 
+0

Parfait! La seule chose que je suis un peu confus est la classe singleton. Pourriez-vous élaborer sur ce point? Bravo: D – IApp

+0

Je n'ai pas envie d'expliquer le Singleton, mais Wikipedia a des informations à ce sujet, et il a un exemple pour Java. http://en.wikipedia.org/wiki/Singleton_pattern – jonescb

3

Eh bien ... par où commencer? Tout d'abord, vous voudrez peut-être jeter un coup d'œil aux structures dynamiques comme les tableaux ou les listes. Ensuite, vous devez gérer chaque nouvelle demande client de sorte que le client est remis à un thread, puis ajouté à une liste (dans listenSocket()). Ensuite, chaque fois que de nouvelles données arrivent, le serveur doit parcourir la liste et envoyer les données à chaque thread/client (dans votre boucle principale).

1

Vous devez garder une trace de toutes vos connexions client dans une structure de données telle qu'un List. Ensuite, lorsque le serveur reçoit une entrée, il doit parcourir toutes les connexions client et sortir le message qu'il a reçu.