当前位置:  技术问答>java相关

用java写聊天室

    来源: 互联网  发布时间:2017-04-15

    本文导语:  如何把每个客户端写入的信息在服务端接收并写回给每个客户端,每个客户端显示的都是所有客户端的信息 | Socket连接:Applet--Server 多线程(每一个Socket连接用一个线程来管理) 要注意同步 ...

如何把每个客户端写入的信息在服务端接收并写回给每个客户端,每个客户端显示的都是所有客户端的信息

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

|
用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();
}


    
 
 

您可能感兴趣的文章:

  • 各路JAVA高手们,能否给我一个用JAVA写的简单聊天室代码?
  • 有没有java聊天室的源程序下载?分数全部给上只有这么多了
  • java编写聊天室?
  • 有人能发我一份 java 做的 聊天室 原码 么? 高分相送
  • 问一个163.com的聊天室和我本地JAVA出现矛盾的问题。。
  • 谁告诉我什么地方有基于java或jsp的聊天室代码下。
  • 高分求一个聊天室的java程序代码。
  • 500分求一好的jsp或java聊天室!非常感谢!
  • 400分求一好的jsp或java聊天室!非常感谢!
  • 求助java聊天室、公告栏、记数器、email的源代码
  • !求java聊天室源码,jsp,serlet均可。
  • ###用JAVA做聊天室的一个效率问题,请帮忙!###
  • 用JAVA实现语音交互的功能(即语音聊天室的功能)
  • 发现一个Java做得非常棒的聊天室(比chinaren的还棒),大家去看看http://www.kele8.com/game/login.htm,然后请发表评论!
  • 想在开发一个Linux下的聊天工具,用Java好不好?
  • JAVA聊天程序最好用什么IO流???
  • 有没有用微软的MSN聊天的JAVA高手。。。。。大家用这个交流好吗??
  • java网络编程学习java聊天程序代码分享
  • 协作开发:NetCaller(基于java技术的点对点聊天程序)
  • java中UDP简单聊天程序实例代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍
  • 我想学Java,但不知道Java的实用的开发工具有那些,Java主要用在哪些方面,EJB到底是什么东西??
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javaserializedobjectmimetype定义及介绍
  • redhat7.3下,java程序打印中文直接用java命令执行正常,用crontab执行java命令为乱码
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javafilelistflavor定义及介绍
  • 各位学java的朋友,学java的未来是什么,你们学java都用来开发什么项目啊!来者给分!!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getvmname定义及介绍
  • 请问java程序中的import为什么有的用java.….*,而有的又用java.….…,有什么区别吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3