2010-02-04 4 views
1

Я следил за учебником по созданию сервера сокетов, который позволяет нескольким пользователям подключаться, и если они отправляют некоторые данные, то он возвращает их обратно.Справка по серверу Java!

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(); 
     } 
    } 

Однако мне это нужно так, если данные передаются на сервер, а не просто вернуть его, он посылает его всем, кто подключен к серверу. Если кто-то поможет мне разобраться в этом, тогда больно быть вечно благодарным! Это означает, что я не смогу закончить свой школьный проект!

Заранее благодарен

+3

Эй, мы не делаем это бесплатно, вы знаете – skaffman

+0

Не смешно , Я стараюсь изо всех сил, чтобы это отсортировано. – IApp

ответ

2

Это ваша проблема:

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

Как уже говорили другие, использовать список для отслеживания всех ваших клиентов. В частности, вам нужен Список клиентов.

Я использую простой класс Singleton, который хранит список. Это значит, что когда новый клиент подключится, он добавит себя в список, а другим клиентам не нужно ничего делать, чтобы увидеть, что есть новый клиент. И добавьте метод типа writeString (String) в класс ClientWorker, чтобы было проще написать что-нибудь каждому клиенту.

Вы должны иметь действительно основной цикл, как это в 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 будет просто:

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

Отлично! Единственное, о чем я немного смущен, это класс singleton. Не могли бы вы подумать об этом? Cheers: D – IApp

+0

Мне не нравится объяснять Синглтон, но Wikipedia имеет информацию об этом, и в нем есть пример для Java. http://en.wikipedia.org/wiki/Singleton_pattern – jonescb

3

Ну, с чего мне начать? Прежде всего, вы можете взглянуть на динамические структуры, такие как массивы или списки. Затем вы должны обрабатывать каждый новый клиентский запрос, чтобы клиент был передан потоку, а затем добавлен в список (в listenSocket()). Затем, когда новые данные поступают, сервер должен перебирать список и отправлять данные каждому потоку/клиенту (в вашем основном цикле).

1

Вам необходимо отслеживать все ваши клиентские соединения в структуре данных, например List. Затем, когда сервер получает вход, он должен пересекать все клиентские соединения и выводить полученное сообщение.