没有做个相关的东西,但可以给你分析一下。
群聊的过程:服务器为S,在线用户为A、B、C,A发信息a是先发到服务器S中,然后服务器S查看群中在线用户B、C,然后把信息a发给B、C,这样就完成了群聊的过程。
具体实现可以根据单对单时的实现来实现,A->S,S->B,S->C这样来实现。这里我只能这样分析而已,下面的时间留给大牛们来吧!

解决方案 »

  1.   

    2L:首先很感谢你的回答,你所说的这个方案就是我在做的,不过没行的通,我是这样做了
    让S分别找到所有的SOCKET,然后一一把消息发送出去,但是这样做不知道为什么不成功,没刷新出去,我用了flush这个方法了,各位大虾请赐教。。
      

  2.   

    每个client从socket里读取信息的用一个线程。发消息再用一个线程。其实发消息这个,对于所有的client,在server端只需要一个线程来处理就够了,不必为每个client的发消息就创建一个线程,因为发消息是不阻塞的。对于一个聊天软件,所有的连接都用TCP连接来做,而且都是通过server来转发,如果client太多,非常耗资源的。
    一般都是使用udp做。只有必须使用tcp是才使用tcp,如传文件。
    而且server只是处理一些必须是server处理的事,例如谁连接进来了,群聊消息转发。client之间的聊天,都是client对client,这样可以减轻server的负担。
      

  3.   

    我也正在做这样的项目,我的思路是这样的,把每个人的群聊的对象的socket与其对应的服务器线程一起放在一个类中,再将这个类放在一个集合里,可以是vector或者map,(比如 a要跟b,c聊天,那么就将b,c的socket和服务器处理b,c请求的线程打包成为一个类,我取名叫serverthread,再将这个类放到vector中,并且能够让a通过某种方式找到这个集合)那么你要做的就是监听a对这个集合请求事件了,如果能够响应,那么需要的就是迭代这个集合就可以了,如果有新的加入者,创建新的serverthread,加入集合,再迭代,以此类推吧,我是这么想的
      

  4.   

    啥叫群聊?也就是几个人在一个组里!OK,那么你先建一个虚拟的组吧,然后把参加群聊的人加入进去。
    然后每个成员发言时,发送对象是组,服务器负责把消息发给组内的每个人。OVER
      

  5.   

    ,当SERVER那端收到了CLIENT的连接后,就把这个用户的SOCKET存到SERVER的LIST中,然后在服务器给CLIENT发送消息的时候先获取所有的SOCKET,然后一一把消息写进去实际就是这样做的,server接受消息,遍历socket并发送附上简单的伪代码public void run(){
    BufferedReader br=null;
    //DataInputStream in=new DataInputStream(s.getInputStream());
    PrintWriter pw=null;
    try{
    InputStream is=s.getInputStream();
    br=new BufferedReader(new InputStreamReader(is));
    String temp=br.readLine();
    while(temp!=null){
    if(temp.equals("close")){
    System.out.println("Connection close@"+s.getLocalAddress());
    ChatServer.num--;
    System.out.println("user num is: "+ChatServer.num);
    ChatServer.list.remove(s);
    return;

    }else{
    System.out.println(s.getLocalAddress()+" say: "+temp);
    for(Iterator it=ChatServer.list.iterator();
    it.hasNext();){
    Socket s1=(Socket)it.next();
    OutputStream os=s1.getOutputStream();
    pw=new PrintWriter(os,true);
    pw.println(s1.getLocalAddress()+" say: "+temp); }

    temp=br.readLine();
    }
    }
    这个是服务器的转发消息的线程,很简单
      

  6.   

    你的思路没有问题 是你程序设计的不好所以会有问题
    通过服务器遍历保存好的socket 然后获取输出流 转发 就行
      

  7.   

    思路没错的,程序也不存在资源竞争的问题,你做的程序中B、C都收不到还是有的能收到,有的收不到啊?你获取A的socket是否正确存入List,多半是List操作出了问题。这个只能你自己看代码,阿门