比如a客户端登陆服务器 显示a在线 b登陆显示 a b在线 同时a客户端应刷新列表 为 a b在线 依此类推
如果是c/s的,有人上线,服务端向所有用户广播,同时客户端开启一个线程去监听服务端发来的消息,然后你在刷新列表显示,或者让他的图标改成上线即可,如果是web的,写一个监听器监听session,页面ajax循即可,如果是第三方类库,比如smack,直接使用它提供的监听器即可,如果你想知道怎么实现的,看它的源码即可服务端向所有用户广播 怎样实现啊

解决方案 »

  1.   

    迭代服务端的用户列表,拿到socket,发消息
      

  2.   

    package com.server;import java.io.*;
    import java.net.*;
    import com.thread.*;
    import com.tools.AddThread;
    import com.tools.ThreadScoket;
    import com.model.*;
    public class TestServerSocket {

    public static void main(String args[]){
    try {
    ServerSocket ss= new ServerSocket(9999);

    while(true){
    Socket s = ss.accept();
    System.out.println("连接成功");
    ObjectInputStream buf = new ObjectInputStream(s.getInputStream());
    //ObjectOutputStream  buw = new  ObjectOutputStream(s.getOutputStream());

    //BufferedWriter buw = new  BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    User user=(User)buf.readObject();
    //读取客户端信息

    System.out.println("用户登录"+user.getName());


    ThreadScoket thread = new ThreadScoket(s);
    System.out.println("test");
    thread.run();

    System.out.println("test2");
    //AddThread.addSocket(user.getName(), thread);
    //启动线程
    //thread.notify();

    }

    } catch (Exception e) {
    e.printStackTrace();
    // TODO: handle exception
    }
    }
    }
      

  3.   

    package com.tools;
    import java.io.*;
    import java.net.*;
    import java.util.*;
    import com.tools.*;
    public class ThreadScoket extends Thread{
     Socket s;

    public ThreadScoket(Socket s){
    this.s=s;
    }

    //通知其他线程 告知 s已被添加 并更新他们的客户端
    public void notity(String s){
    HashMap hm=AddThread.hashMap;

    Iterator it=hm.keySet().iterator();


    while(it.hasNext())
    {
    String id= it.next().toString();
    try {
    //取得与客户端的线程
    //ObjectOutputStream oos=new ObjectOutputStream(AddThread.getSocket(id).getOutputStream());
    //oos.writeObject(s);
    } catch (Exception e) {
    e.printStackTrace();
    // TODO: handle exception
    }

    }
    }



    public void run() {

    while(true){
    try {
    //ObjectInputStream buf = new ObjectInputStream(s.getInputStream());
    // ObjectOutputStream  buw = new  ObjectOutputStream(s.getOutputStream());
    Thread.sleep(10000);
    } catch (Exception e) {
    // TODO: handle exception
    }

    }



    }

    }
      

  4.   

    package com.client;import java.io.*;
    import java.net.*;
    import com.tools.*;
    import com.model.*;
    public class Client { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    try { Socket s = new Socket("127.0.0.1",9999);
    // BufferedReader buf = new BufferedReader(new InputStreamReader(s.getInputStream())); ObjectOutputStream  buw = new  ObjectOutputStream(s.getOutputStream());
    User user=new User();
    user.setName("b");
    buw.writeObject(user);
    System.out.println("客户端发生成功2");
    //ThreadScoket th = new ThreadScoket(s);
    //th.run();
    //AddThread.addSocket(user.getName(), th);

    } catch (Exception e) {
    // TODO: handle exception
    }
    }}怎么客户端只能连一次 啊   那个服务器端的thread.run();关掉 就可以连多个 怎么回事