2016-03-04 47 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):即可致电广播消息。