2016-03-04 46 views
2

我想實現這個套接字程序廣播消息到所有連接的客戶端。我試圖做的是向特定客戶廣播消息。我試圖修改java一對一的消息廣播套接字

/**將給定文本廣播給所有客戶端。 */ 部分。

但是,無法擺脫它。任何人都可以提出最好的解決方案。

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

public class ChatServer { 

    private static final String USAGE = "Usage: java ChatServer"; 

    /** Default port number on which this server to be run. */ 
    private static final int PORT_NUMBER = 8008; 

    /** List of print writers associated with current clients, 
    * one for each. */ 
    private List<PrintWriter> clients; 

    /** Creates a new server. */ 
    public ChatServer() { 
     clients = new LinkedList<PrintWriter>(); 
    } 

    /** Starts the server. */ 
    public void start() { 
     System.out.println("AndyChat server started on port " 
          + PORT_NUMBER + "!"); 
     try { 
      ServerSocket s = new ServerSocket(PORT_NUMBER); 
      for (;;) { 
       Socket incoming = s.accept(); 
       new ClientHandler(incoming).start(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println("AndyChat server stopped."); 
    } 

    /** Adds a new client identified by the given print writer. */ 
    private void addClient(PrintWriter out) { 
     synchronized(clients) { 
      clients.add(out); 
     } 
    } 

    /** Adds the client with given print writer. */ 
    private void removeClient(PrintWriter out) { 
     synchronized(clients) { 
      clients.remove(out); 
     } 
    } 

    /** Broadcasts the given text to all clients. */ 
    private void broadcast(String msg) { 
     for (PrintWriter out: clients) { 
      out.println(msg); 
      out.flush(); 
     } 
    } 

    public static void main(String[] args) { 
     if (args.length > 0) { 
      System.out.println(USAGE); 
      System.exit(-1); 
     } 
     new ChatServer().start(); 
    } 

    /** A thread to serve a client. This class receive messages from a 
    * client and broadcasts them to all clients including the message 
    * sender. */ 
    private class ClientHandler extends Thread { 

     /** Socket to read client messages. */ 
     private Socket incoming; 

     /** Creates a hander to serve the client on the given socket. */ 
     public ClientHandler(Socket incoming) { 
      this.incoming = incoming; 
     } 

     /** Starts receiving and broadcasting messages. */ 
     public void run() { 
      PrintWriter out = null; 
      try { 
       out = new PrintWriter(
         new OutputStreamWriter(incoming.getOutputStream())); 

       // inform the server of this new client 
       ChatServer.this.addClient(out); 

       out.print("G G Connect! "); 
       out.flush(); 

       BufferedReader in 
        = new BufferedReader(
         new InputStreamReader(incoming.getInputStream())); 
       for (;;) { 
        String msg = in.readLine(); 
        if (msg == null) { 
         break; 
        } else { 
         if (msg.trim().equals("BYE")) 
          break; 
         System.out.println("Received: " + msg); 
         // broadcast the receive message 
         ChatServer.this.broadcast(msg); 
        } 
       } 
       incoming.close(); 
       ChatServer.this.removeClient(out); 
      } catch (Exception e) { 
       if (out != null) { 
        ChatServer.this.removeClient(out); 
       } 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

回答

0

廣播意味着將它發送給每個人。當你說「廣播給一個人」時,你的意思是你只是想發送一條消息給一個客戶?

如果是這樣的話,你需要檢索PrintWriter爲該客戶端,並通過該對象發送消息:

private void sendMessage(PrintWriter client, String msg) { 
    client.println(msg); 
    client.flush(); 
} 

順便說一句,而不是使用:

for (;;) { 
} 

你應該使用:

while (true) { 
} 

它更容易識別爲無限循環。

哦,並且不需要在ChatServer.this.broadcast(msg);中寫ChatServer.this。您只需編寫broadcast(msg):即可致電廣播消息。