要源码吗?
很多的!是个聊天室来的!
你要的话就留个Email!简单的思路是!你可以在服务中开一个线程来做!
就是只要有人登录就这个登录的客户发给所有人客户端!

解决方案 »

  1.   

    import javax.swing.*;
    import java.awt.*;
    import java.net.*;
    import java.io.*;
    import java.util.*;class Server14 extends JFrame 
                 implements Runnable{
    java.awt.List list = new java.awt.List(10);
    ServerSocket ss = null;
    Vector v = new Vector();
    Server14(){
    JPanel jpl = new JPanel();
    this.getContentPane().add(jpl);
    jpl.add(new JLabel("已经上线的客户"));
    jpl.add(list);
            this.setSize(600,300);
            this.show();
            try{
             ss = new ServerSocket(5000);
             }catch(Exception e){}
            new Thread(this).start();
    }
    public void run(){
    try{
     while(true){
      Socket s = ss.accept();
      PrintStream ps = new PrintStream(
      s.getOutputStream()
      );
      BufferedReader br = new BufferedReader(
    new InputStreamReader(s.getInputStream())
    );
      String nick = br.readLine();
      list.add(nick);
               
                //开辟一个线程,专门负责接收
                //某一客户的信息
                ClientThread ct = 
                    new ClientThread(s,ps,br,nick);
      v.addElement(ct);//存到Vector里面
    //通知所有客户端,某人上线了
        String people = "";
        for(int i=0;i<list.getItemCount();i++){
         people=people+"#"+list.getItem(i);
         }  //#用户1#用户2...
      sendMsg("PEOPLE"+people);
     
            }
    }catch(Exception e){}
    }
    class ClientThread extends Thread{
    Socket s=null;
    PrintStream ps = null;
    BufferedReader br = null;
    String nick="";
    ClientThread(Socket s,
                 PrintStream ps,
                 BufferedReader br,
                 String nick){
    this.s = s;
    this.ps = ps;
    this.br = br;
    this.nick = nick;
    this.start();
    }
    public void run(){
    while(true){
    try{
    String str = br.readLine();
    if(str.equals("LOGOUT")){
    list.remove(nick);
    String people = "";
                    for(int i=0;i<list.getItemCount();i++){
                 people=people+"#"+list.getItem(i);
                 }  //#用户1#用户2...
      sendMsg("PEOPLE"+people);

    //通知所有客户端某人下线
    /*
      code
    */
    s.close();
    ps.close();
    br.close();
    }
    else{
    //将这句话发给所有客户端
    sendMsg(str);
    }
    }catch(Exception e){}
    }
    }
    }
    public void sendMsg(String str){
    for(int i=0;i<v.size();i++){
    ClientThread ct = (ClientThread)v.elementAt(i);
    ct.ps.println(str);
    }
    }
    public static void main(String ar[]){
    new Server14();
    }
    }
      

  2.   

    import javax.swing.*;
    import java.awt.*;
    import java.net.*;
    import java.io.*;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.util.StringTokenizer;
    class Client14 extends JFrame 
             implements ActionListener,Runnable{
    List list = new List(10);
    JTextArea jta = new JTextArea(10,20);
    JScrollPane jsp = new JScrollPane(jta);
    JButton jbt = new JButton("连结服务器");
    JButton jbt1 = new JButton("发送消息");
    JButton jbt2 = new JButton("下线");
    JTextField jtf = new JTextField(10);
    Socket s = null;
    String nick="";
    PrintStream ps = null;
    BufferedReader br = null;
    Client14(){
    JPanel jpl = new JPanel();
    this.getContentPane().add(jpl);
    jpl.add(new JLabel("在线名单"));
    jpl.add(list);
    jpl.add(new JLabel("读取信息"));
    jpl.add(jsp);
    jpl.add(new JLabel("请输入发送的信息"));
    jpl.add(jtf);
    jpl.add(jbt);
    jpl.add(jbt1);
    jpl.add(jbt2);
    jbt.addActionListener(this);
    jbt1.addActionListener(this);
    jbt2.addActionListener(this);
            jta.setBackground(Color.pink);
            this.setSize(550,300);
            this.show();
            nick = JOptionPane.showInputDialog(
             this,"请输入昵称"
             );
            this.setTitle(nick);
    } public static void main(String ar[]){
    new Client14();
    }
        public void run(){
         while(true){
         try{
         String str = br.readLine();
         StringTokenizer st = 
                new  StringTokenizer(str,"#");
             String head = st.nextToken();
             if(head.equals("PEOPLE")){
              list.removeAll();
              while(st.hasMoreTokens()){
              list.add(st.nextToken());
              }
             }
             else{
         jta.append(str+"\n");
         }
         }catch(Exception e){}
         }
         } public void actionPerformed(ActionEvent parm1) {
    try{
    if(parm1.getSource()==jbt){
    s = new Socket("127.0.0.1",5000);
    ps = new PrintStream(
    s.getOutputStream()
    );
    br = new BufferedReader(
    new InputStreamReader(s.getInputStream())
    );
    ps.println(nick);
    new Thread(this).start();
    }
    if(parm1.getSource()==jbt1){
    ps.println(nick+"说:"+jtf.getText());
    }
    if(parm1.getSource()==jbt2){
    //下线
    ps.println("LOGOUT");
    s.close();
    ps.close();
    br.close();
    System.exit(0);
    }
    }catch(Exception e){}
    }
    }
      

  3.   

    SERVER端利用多线程实现,先在端口监听,当有接入请求的时候,由线程产生一个SOCKET来处理请求,然后SERVER继续监听端口,SERVER返回给CLIENT的信息都放在线程里面,另外应注意处理异常,经常有的不能运行是因为没有处理好异常。若要实现像平常那种聊天室模式的话,可以在SERVER端加一段代码,把接收到任何一个CLIENT端发的信息,再还发给全部CLIENT。
      

  4.   

    谢谢大家了改天再找个机会给大家结分哈。。
    看到回复之前,我自己也作了一个server的demo,也想过对每个client connection新建一个线程来处理,如果有几千几万个用户来连接的话,server估计也要挂了。。
    目前是这样的:监听所有的client,在一个线程里面的接受所有client的数据,然后用一个线程来发送消息,两个线程采用命名管道进行通信。。
    结果效率同样很低。
    正在考虑折中的办法,比如把需要处理的工作分得更细,对连接的client分组之类的。大家有兴趣可以继续讨论。。
      

  5.   

    to heibai520(Crazy Java)
    my email is:[email protected]