我们编两个程序,一个是Server(即服务器),一个是Client(即客户端)。可以执行多个Client,使多个Client个进行通讯(即形成一个聊天室的功能)。我们可以在Client输入信息给Server。但是,怎么将信息发送到每个Client(包括将信息发送到Server的Client)?

解决方案 »

  1.   

    Server中要保存所有Client的Socket,可以放在一个集合中,循环这个集合,取出每个client的Socket,然后发送信息。
      

  2.   

    我的代码给你参考:
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;import javax.swing.JLabel;
    import javax.swing.JTextArea;
    public class GetMessage extends Thread{
    private int i;
    String v;JLabel label=null;
    private JTextArea text;
    Date d=new Date();
    SimpleDateFormat matter=new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
    public GetMessage(int i,JTextArea text) {this.i=i;
    this.text=text;
    }public void run(){
    try {
    ServerSocket so = new ServerSocket(i);
    Socket s = so.accept();
    while(true){
    InputStreamReader i = new InputStreamReader(s.getInputStream());
    BufferedReader b = new BufferedReader(i);
    v= b.readLine();
    text.append(String.valueOf(matter.format(d))+"\n");
    text.append("对方说"+v+"\n");
    }
    } catch (IOException e) {
    System.out.println(e.getMessage());
    //label.setText("对方已经下线");
    text.append("对方下线了");
    }
    }
    }
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    import java.net.UnknownHostException;import javax.swing.JLabel;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    public class SendMessage extends Thread {
    private String ip;
    private int i;
    Socket s = null;
    JLabel label=null;
    JTextField text;
    JTextArea text1;public SendMessage(String ip,int i,JTextArea text1) {
    // TODO Auto-generated constructor stub
    this.ip=ip;
    this.i=i;
    this.text1=text1;
      
    }
      public void run(){
      
      while(true){
    try {
    s = new Socket(ip,i);
    text1.setText("连接成功"+"\n");
    break;
    } catch (Exception e) {
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e1) {
    System.out.println("出错了。");
    }
    }  
      }
      
      }   
      
      public void send(String message)
      {
    try {PrintStream p = new PrintStream(s.getOutputStream());p.println(message);  
    } catch (Exception e1) {
    System.out.println("异常"+e1.getMessage());
    }
    }
        
        
    }
      

  3.   

    已经使用bs架构写过类似程序,使用的是javascript每隔一段时间向服务器发送一次请求
      

  4.   

    使用socket通信,以流的方式将要传送的信息写进socket就可以了,接收方accept就行了
      

  5.   

    http://download.csdn.net/detail/lxybelieve/3764363
      

  6.   

    该进版:
    GetMessage.java服务端:import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;import javax.swing.JLabel;
    import javax.swing.JTextArea;
    public class GetMessage extends Thread{
    private int i;
    String v;

    JLabel label=null;
    private JTextArea text;
    public GetMessage(int i,JTextArea text) { this.i=i;
    this.text=text;
    }

    public void run(){
    try {
    ServerSocket so = new ServerSocket(i);
    Socket s = so.accept();
    while(true){
    InputStreamReader i = new InputStreamReader(s.getInputStream());
    BufferedReader b = new BufferedReader(i);
     v= b.readLine();
     text.append("对方说"+v+"\n");
     }
    } catch (IOException e) {
    //label.setText("对方已经下线");
    text.append("对方下线了");
    }
    }
    }SendMessage.java客户端:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    import java.net.UnknownHostException;import javax.swing.JLabel;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    public class SendMessage extends Thread {
    private String ip;
    private int i;
    Socket s = null;
    JLabel label=null;
    JTextField text;
    JTextArea text1;
    public SendMessage(String ip,int i,JTextArea text1) {
    // TODO Auto-generated constructor stub
    this.ip=ip;
    this.i=i;
    this.text1=text1;

    }


        public void run(){
        
         while(true){
    try {
     s = new Socket(ip,i);
         text1.setText("连接成功"+"\n");
     break;
    } catch (Exception e) {
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e1) {
    System.out.println("出错了。");
    }

         }
        
        }                        
        
         public  void send(String message)
         {
    try {

    PrintStream p = new PrintStream(s.getOutputStream()); p.println(message);


    } catch (Exception e1) {
    System.out.println("异常"+e1.getMessage());
    }
    }
          
          
    }Test.java 简单的界面和测试类
    import java.awt.*;import java.awt.event.*;
    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
    import java.util.*;import javax.swing.*;
    import javax.swing.event.*;
    class WindowTextArea extends JFrame implements ActionListener
    {       

    String s;
    JTextArea text1;
        JTextArea text2;
        JButton button1,button2,button3;
        SendMessage t2;
        GetMessage t1;
        JLabel lable1,lable2;
        JTextField text;    WindowTextArea() 
        {  this.s=s;
           
           lable1=new JLabel("对方ip");
           text=new JTextField(20);
          
           
          text1=new JTextArea(6,18);
          text2=new JTextArea(6,18);
          text2.setEditable(false);
          button1=new JButton("发送");
          button2=new JButton("关闭");
          button3=new JButton("确定ip");
          
          setBounds(100,100,450,300);
          setVisible(true);
          Container con=getContentPane(); 
          con.setLayout(new FlowLayout());
          con.add(lable1);
          con.add(text);
          con.add(button3);
          
          con.add(new JScrollPane(text1));
          con.add(new JScrollPane(text2));
          con.add(button1);
          con.add(button2);
          
          button1.addActionListener(this);
          button2.addActionListener(this);
          button3.addActionListener(this);
          con.validate();
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          
         
          
       }
          
       public void runthread(String ip)
       {
       t1 = new GetMessage(4066,text2);
          t1.start();
           t2=new SendMessage(ip,4066,text2);
        t2.start();
       }    
      
        
     
        
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if(e.getSource()==button2)
    {
    System.exit(0);
    }
    if(e.getSource()==button1)
    {   
     
         
     
    text2.append(text1.getText()+"\n");

      


    t2.send(text1.getText());
     
    text1.setText("");
    }
    if(e.getSource()==button3)
    {   
        s=text.getText(); runthread(s);
         

    }
    }
    }
    public class Test { /**
     * @param args
     */
    public static void main(String[] args) {

    new WindowTextArea();

    }
    }
    new WindowTextArea();

    }
    }向对方发送信息之前必须输入对方ip和点击确定ip按钮,文本区显示“连接成功”
    然后可以发送信息
      

  7.   

    这位  chabale
    (菜鸟达哥)来做广告的吧