我做了个聊天程序,一个服务器类(用线程处理客户对象),一个客户类,可以正常通信.现在的问题是:
如何做到启动多个客户程序时,他们的话能够发给所有的人服务器应该如何转发?

解决方案 »

  1.   

    呵呵,记录用户这个我能做到,不过就是不知道如何转发,因为发送代码我是写在线程式中的:
    我的代码如下(请帮我修改一下或给一个model,谢谢):Server类:import java.net.*;
    import java.io.*;
    import java.util.Date;class server
    {
    public static void main(String str[])
    {
    try 
    {
         ServerSocket server = new ServerSocket(3333);
         System.out.println("server ok");
         while(true)
         {
    process p = new process(server.accept());
    Thread t = new Thread(p);
    t.start();
        }
    }
    catch (Exception ex) 
    {
    System.out.println("err"+ex.toString());
    }
    }
    } class process implements Runnable
    {
    Socket s;
    PrintStream out;
    BufferedReader br;

    public process(Socket s)
    {
    this.s = s;
    }
    public void run()
    {
    try 
    {
         out = new PrintStream(s.getOutputStream());
         br  = new BufferedReader(new InputStreamReader(s.getInputStream()));
    while(true)
    {
    out.println(br.readLine());
    }
        }
        catch (SocketException sex) 
        {
         try 
         {
         out.close();
         br.close();
         s.close();
        }
        catch (Exception ex) 
        {
         System.out.println (ex.toString());
        }
        }
        catch (Exception ex) 
        {
         System.out.println("err"+ex.toString());
        }
    }
    }Client类:import java.io.*;
    import java.net.*;class client
    {
    public static void main(String strp[])
    {
    Socket s=null;
    PrintStream out=null;
    BufferedReader br=null;
    try 
    {
         s   = new Socket("127.0.0.1",3333);
         out = new PrintStream(s.getOutputStream());
         br  = new BufferedReader(new InputStreamReader(s.getInputStream()));
    while(true)
    {
    out.println(new BufferedReader(new InputStreamReader(System.in)).readLine());
    System.out.println (br.readLine());
    }
        }
        catch (Exception ex)
        {
         System.out.println(ex.toString());
        }
        finally
        {
         try 
         {
         out.close();
         br.close();
         s.close();
        }
        catch (Exception ex) {
        }
        }
    }
    }
      

  2.   

    我们的作业到是做出来了,不过功能还不全,转发到是可以,但是记录不了用户,功能还不全,我还在修改中Server端
    import java.net.*;
    import java.io.*;
    import java.util.*;public class ServerSocketDemo 
    {
    public static void main(String[] args) throws Exception
    {
    ArrayList list=new ArrayList();
    ServerSocket ss=new ServerSocket(8088);

    while(true)
    {
    Socket s=ss.accept();
    list.add(s);
    new ReverseDemo(s,list);
    }
    // ss.close();
    }
    }
    class ReverseDemo extends Thread
    {
    BufferedReader in=null;
    PrintWriter out=null;
    String str="abc";
    ArrayList list;
    Socket s;

    public ReverseDemo(Socket s,ArrayList list)
    {
    this.list=list;
    this.s=s;
    this.start();
    }
    public void run()
    {
    System.out.println(s.getInetAddress().getHostAddress()+" connected-------");
    try {
    in=new BufferedReader(new InputStreamReader(
    s.getInputStream()));
    out=new PrintWriter(new BufferedWriter(
    new OutputStreamWriter(s.getOutputStream())));
    out.flush();
    while(true)
    {
    str=in.readLine();
    // StringBuffer sb=new StringBuffer(str);
    // str=sb.reverse().toString();
    System.out.println(str);
    Iterator iterator=list.iterator();
    while(iterator.hasNext())
    {
    PrintWriter o=new PrintWriter(
    new BufferedWriter(
    new OutputStreamWriter(
    ((Socket)(iterator.next())).getOutputStream())),true);
    o.println(str);
    }

    }
    // in.close();
    // out.close();
    // s.close();
        }
        catch (Exception ex)
        {
         ex.printStackTrace();
        } }
    }Client端
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.net.*;public class ChatDemo2 extends Frame
    {
    TextArea ta=new TextArea();
    Panel p=new Panel();
    TextField tf=new TextField(20);
    TextField tfIp=new TextField(15);
    Button btn=new Button("Send");
    Socket s;
    BufferedReader in;
    PrintWriter out;
    String str;

    public ChatDemo2(String title) //throws Exception
    {
    super(title);
    try
    {
    s=new Socket("localhost",8088);
    in=new BufferedReader(new InputStreamReader(
    s.getInputStream()));
    out=new PrintWriter(new BufferedWriter(
    new OutputStreamWriter(s.getOutputStream())),true);
    }
    catch(IOException ex)
    {
    ex.printStackTrace();
    }
    }

    public void init()
    {
    p.setLayout(new BorderLayout());
    p.add(tf,BorderLayout.CENTER);
    p.add(btn,BorderLayout.EAST);
    p.add(tfIp,"West");
    add(p,BorderLayout.SOUTH);
    add(ta);
    setSize(300,300);
    setVisible(true);

    btn.addActionListener(new Message_send());
    tf.addActionListener(new Message_send()); this.addWindowListener(new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    System.exit(1);
    }
    });

    while(true)
    {
    try
    {
    str=in.readLine();
    ta.append(str+"\r\n");
        }
        catch (Exception ex)
        {
        }
    }
    }

    class Message_send implements ActionListener
    {
    public void actionPerformed(ActionEvent e)
    {
    if(e.getSource()==btn||e.getSource()==tf)
    {
    String s=tf.getText();
    if(s.equals("")==false)
    {
    out.println(tf.getText());
    tf.setText("");
    }
    }
    }
    }

        public static void main(String[] args) //throws Exception
        {
    ChatDemo2 chat=new ChatDemo2("ChatDemo");
    chat.init();
        }
    }
      

  3.   

    看起来乱一点,关闭流的地方全注释掉了,还没有做中断死循环,这个我还在继续修改中我手上还有一个功能比较全的,客户端是用Applet做的,不过在不同的机器上连接的测试没有成功,单机上是好用的,多个客户端同时启动也是好用的,问题应该出在Applet上吧,这个东东安全性比较高,对网络支持不好。不过这个是四个类,代码相对比较长,这里帖不下,你要是想要给我发个短信留个E-mail给我
      

  4.   

    转发就是把所有客户端的Socket放在一个ArrayList里,把接收到的消息分别发个每个Socket,个人感觉用Map似乎更好