2010-02-04 104 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 2010-02-04 13:50:34

+0

不好笑。我在這裏盡力去完成這個排序。 – IApp 2010-02-04 13:52:06

回答

2

這是你的問題:

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

正如其他人所說,用一個列表,以保持所有客戶的軌道。 具體而言,您需要一個ClientWorkers列表。

我使用一個簡單的Singleton類來保持列表。這樣當新客戶端連接時,它將自己添加到列表中,其他客戶端不需要做任何事情就可以看到有新客戶端。然後在ClientWorker類中添加一個像writeString(String)這樣的方法,以便更容易地向每個客戶端寫出內容。

你應該有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

完美!我唯一有點困惑的是單身課。你可以詳細解釋一下嗎?乾杯:D – IApp 2010-02-04 20:12:38

+0

我不想解釋Singleton,但維基百科有關於它的信息,它有一個Java示例。 http://en.wikipedia.org/wiki/Singleton_pattern – jonescb 2010-02-04 22:30:59

3

那麼......我應該從哪裏開始?首先你可能想看看像數組或列表這樣的動態結構。然後,您應該處理每個新的客戶端請求,以便將客戶端交給一個線程,然後添加到列表中(在listenSocket()中)。然後,每當新數據到達時,服務器應該遍歷列表並將數據分派給每個線程/客戶端(在主循環中)。

1

您需要跟蹤數據結構中的所有客戶端連接,例如List。然後,當服務器接收到輸入時,它應該遍歷所有客戶端連接並輸出它收到的消息。