CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

用java写聊天室

楼主lx999501(ll)2002-12-27 13:02:53 在 Java / J2SE / 基础类 提问

如何把每个客户端写入的信息在服务端接收并写回给每个客户端,每个客户端显示的都是所有客户端的信息 问题点数:40、回复次数:13Top

1 楼xiaolie()回复于 2002-12-27 13:49:59 得分 0

Socket   Server   +   mulit   thread   tec   is   allTop

2 楼qljsd(我本善良)回复于 2002-12-27 18:04:04 得分 20

Socket连接:Applet--Server  
  多线程(每一个Socket连接用一个线程来管理)  
  要注意同步Top

3 楼lx999501(ll)回复于 2002-12-28 19:04:14 得分 0

有例子吗?Top

4 楼skytree(天空树)回复于 2002-12-28 19:34:54 得分 0

从session或者cook里确认用户信息,再用bean保存聊天信息,在页面里用javascript实现定时刷新就可以了。Top

5 楼jinhuaxing()回复于 2002-12-29 18:46:23 得分 20

用RMI  
  //这是我曾经做过的一个分析,不完整,仅供参考  
   
  1.   注册用户RegisteredUser:在系统中注册的用户  
  2.   登录用户LoginedUser:登录到系统中的用户  
  3.   聊天室Chatroom:聊天室  
  4.   聊天Talk:登录用户在某个聊天室和某个用户聊天  
  5.   聊天内容Message:聊天的内容(聊天内容可以分为  
  一对一的聊天,某个人对所有人说的话,系统发出  
  的通告等)  
   
  LoginedUser和RegisteredUser是0。。1对1关系(单向关联)。  
   
  Chatroom和Message是1..n关系(聚合,单向)。  
   
  LoginedUser和Chatroom之间的关系比较复杂,如果不包含一个LoginedUser  
  和另一LoginedUser在一个Chatroom聊天的事实,那么LoginedUser和Chatroom是  
  0。。n对0。。n的关系(双向关联)。加上聊天这个关系后,就成了三元关系,  
  可以用关联类Talk来表示。  
   
   
  class   RegisteredUser   extends   Persistent   {  
   
  private   String   id;  
  private   String   password;  
  private   String   email;  
   
  public   RegisteredUser()   {}   //for   Serialization  
   
  public   RegisteredUser(String   id)   {}   //for   register  
   
          public   static   RegisteredUser   getUser(String   id,String   password){   //工厂方法  
          //从文件中去取  
          //取了之后new出对象。  
          如果找不到id的注册对象,则返回null。  
          }  
          public   static   boolean   isRegistered(String   id)   {}  
           
          public   static   Iterator   iterator()   {}  
           
           
          public   void   delete()   {}  
          public   void   store()   {}  
          public   void   update()   {}  
           
          public   String   getID()   {}  
          public   String   getPassword(){}  
          public   String   getEmail()   {}  
           
          public   changePassword(String   newPassword)   {}  
          public   changeEmail(String   newEmail)   {}  
           
          public   void   read(RamdomAccessFile   file)   {}  
          public   void   write()   {RamdomAccessFile   file{}  
  }  
   
  class   LoginedUser   {    
        static   Vector   users   =   new   Vector(100);  
           
  private   RegisteredUser   ru;  
   
  Vector   rooms   =   new   Vector(10);     //Object   is   Talk   ,关联名当参数  
   
  LoginedUser(RegisterdUser   ru)   {  
  this.ru   =   ru;  
  }  
  public   static   LoginedUser   addUser(String   name,String   password)   {  
  如果失败,返回null。只有注册过的用户采用add。  
  }  
   
  public   static   void   removeUser(LoginedUser   user)   {  
   
  }  
   
  public   RegisteredUser   getRegiseredUser()   {   return   ru;   }  
  public   String   getID()   {   return   ru.getID();   }  
   
  public   Talk   enterRoom(Chatroom   room)   {   //核心方法,处理和Chatroom之间的关联,并new出Talk对象  
  //是Talk对象的工厂方法  
  Talk   er   =   new   Talk(room,this);  
   
  users.add(er);  
  room.enter(er);  
   
  return   Talk;  
   
  }  
   
  public   leaveRoom(Chatroom   room)   {   //核心方法  
   
          Talk   er   =   getRoom();  
          rooms.remove(er);  
           
  room.leave(er)  
  }  
   
  public   Chatroom[]   getRooms()   {  
        返回数组,只读  
  }  
   
  private   Talk   getTalk(Chatroom   room)   {  
  //search   talk   with   chatroom  
  }  
  }  
  //  
  class   Chatroom   {   //消息容器,注意不是消息Manager,因为Chatroom不负责消息的创建  
  private   static   Vector   rooms   =   new   Vector(10);   //all   room   in   system  
   
  private   String   name;  
   
  private   Vector   users   =   new   Vector(10);//用关联名当域名  
   
  private   Vector   messages   =   new   Vectors(100);  
   
  public   static   ChatRoom   createRoom(String   name)   {}   //Room的工厂方法  
  public   static   ChatRoom[]   getAllRoom()   {}  
   
  public   enter(EnterRoom   u)   {  
  users.add(u);  
  }  
  public   void   leave(EnterRoom   u)   {  
  user.remove(u);  
  }  
   
  public   LoginedUsers[]   getAllUsers()   {  
  //返回数组,用于只读  
  }  
   
  public   void   send(Message   message)   {  
   
  }  
  }  
   
  class   Talk   {   //双向关联类或者应该是三向关联类  
  Chatroom   room;  
  LoginedUser   source;   //说话者  
  LoginedUser   dest;   //听话者  
  long   time;   //create   time   of   talk,it   is   time   when   enter   the   chat   room  
  public   EnterRoom(ChatRoom   room,LoginedUser,LoginedUser   user)   {  
  assert(room!=null);  
  assert(user!=null);  
  }  
   
  public   Chatroom   getRoom()   {}  
  public   LoginedUser   getUser()   {}  
   
  public   void   getTime()   {}  
   
  public   void   speak(String   message)   {  
  Message   msg   =   new   Message();  
  Message.setSource(source);  
  Message.setDest(dest);  
  Message.setTime(currentTime);  
  room.send(Message   msg);  
  }  
  }  
   
  class   Message   {  
          LoginedUser   source;  
          LoginedUser   dest;  
          long   time;  
           
          public   Message()   {}  
           
          public   void   setSource(LoginedUser   )  
          public   void   setDest(LoginedUser   )  
          public   void   setTime(long);  
           
          public   boolean   isFromSystem()   {  
          }  
          public   boolean   isBroadcast(){  
          }  
           
          public   LoginedUser   getSource();  
          public   LoginedUser   getDest();  
  }  
   
  {  
  注册过程  
  read   id   from   GUI;  
  if   RegisteredUser.isRegisted(id)     {  
  messagebox();  
  reuturn;  
  }  
   
  RegisteredUser   r   =   new   RegisteredUser(id);  
  r.changePassword();  
  r.changeEmail();  
  r.store();  
  }  
   
   
  {  
  登录过程  
  read   in   id   and   password   from   GUI;  
   
  if   ((user   =   LoginedUser.addUser(id,password))   ==   null)   {  
  messagebox();  
  return;  
  }  
  LoginedUser   user   =   LoginedUser.get(id);  
   
  RegisteredUser   ru   =   user.getRegistedUser();  
  }  
   
  {  
  修改资料过程  
  LoginedUser   user   =   LoginedUser.get(id);  
  RegisteredUser   ru   =   user.getRegistedUser();  
  ru.setEmail();  
   
  ru.store();  
  }  
   
  {  
  聊天过程  
  LoginedUser   user   =   loginedUser.get(id);  
  Talk   talk   =   user.enterRoom(aroom);  
  talk.selectPeer();  
  talk.speak();  
  talk.speak();  
  talk.speak();  
  }  
   
  Top

6 楼pqds(一个女农民)回复于 2002-12-30 10:03:53 得分 0

gzTop

7 楼gwbasic(笑笑)回复于 2002-12-30 10:52:41 得分 0

okTop

8 楼luoxxx(罗叉叉)回复于 2002-12-30 11:25:44 得分 0

用servlet可以实现一个不需要刷新页面的聊天室,在sourceforge上可以看到  
  一个正在开发的源码,   项目名称叫:   GujChat  
  个人认为不错,借鉴其思想后很好改写  
  技术的核心是保存servlet的ServletOutputStream,   以及一个聊天等待的循环  
  Top

9 楼banq(板桥里人)回复于 2002-12-30 14:50:42 得分 0

NIO   sokcet   +   JMX   +   thread   Pool  
  才能架构出优异性能的聊天室Top

10 楼beyondii(十万个为什么)回复于 2002-12-30 14:58:33 得分 0

signTop

11 楼zxroseada(张雄)回复于 2002-12-30 15:59:08 得分 0

我写个一个聊天室,你可以看看http://cs.cyspc.net  
  Top

12 楼bistar(I'm Marvin.)回复于 2003-01-01 10:38:26 得分 0

gzTop

13 楼junyh(阿俊)回复于 2003-01-01 10:47:17 得分 0

学习Top

相关问题

  • java编写聊天室?
  • 简单的JAVA 聊天室
  • 请教java聊天室的问题?
  • java写的b/s的网络聊天室 客户端编译时出错
  • 用java写聊天室服务程序碰到的一些问题
  • 各路JAVA高手们,能否给我一个用JAVA写的简单聊天室代码?
  • 如何用asp写聊天室?
  • 请问编写聊天室的问题
  • PHP聊天室
  • 聊天室

关键词

  • 聊天
  • talk
  • 用户
  • 客户
  • 注册
  • 消息
  • 内容
  • 信息
  • loginedusers
  • chatroom

得分解答快速导航

  • 帖主:lx999501
  • qljsd
  • jinhuaxing

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo