JAVA聊天器(1)

  • 课程设计要求与目的

目的:编写一个小型Java聊天室系统,掌握Java网络通信、多线程、IO文件操作等高级应用编程技能。

要求:以课本第15章 Java网络通信例15.3、15.4的源代码为基础,编写一个小型Java聊天室系统。

完成如下功能:

1、多客户端模式下,实现客户与客户的单独通信,要求信息通过服务器中转

2、端到端的通信,实现并行通信模式(不再是你说一句,我说一句,一端的信息发送不受另一端的影响)

3、实现端到端的文件传输

4、添加图形界面(选做)

(1)在刚起步时候遇到的问题:

在刚开始着手敲代码的时候自己就陷入了细节之中,没有以全局的角度去看待。刚起步的时候自己主要是创建了四个类,如下所示:

主要的想法是MultiTalkServe类实现监听的功能,当监听到用户请求的时候就启动ServerThread这个线程用来处理和客户的收发消息等情况,TalkClient为客户端用来发送请求还有发送消息,因为是基于C-S-C的聊天器模式,所以要想实现客户1与客户2之间互发消息,那么只要将服务器端生成的与客户一一对应的套接字存储起来,再在这些服务器的套接字内部实现消息转发即可实现客户1与客户2的通信,所以自己就再建了一个Store类,用来存储服务器端生成的套接字。

在Store类中声明的是一个Vector动态数组,存放服务器的套接字。

因为之前学过关于类的组合,所以就想在聊天器中实践一下,MultiTalkServer类将Store对象引用st作为自己的数据成员,之后要就可以调用Store类的方法,在刚开始的时候就报了空指针异常,后来才发现是自己没有将对象和引用关联起来的原因,进一步加深了自己对于对象和引用之间类似于电视机和遥控器关系的理解。

在存储好了套接字之后,就希望进一步实现聊天功能,所以就在Store类中新建了一个exchange方法,用来实现消息的转发,具体注释如下所示,

该方法在客户端来被调用,在TalkClient类中也拥有Store对象的引用st,

当时的想法是每新生成一个客户的时候就会输出当前的上线人数,然后再输入想要和对方聊天的编号,最后通过exchange方法来实现消息互传。

 

可是最后在自己真正运行的时候,结果并不和自己当初想象的一样美好,每次新生成一个客户,虽然服务器端能动态更新当前的上线人数,但是客户端的人数总是为0。也就是不能实现动态更新。

后来通过思考,才发现原因为服务器端得到当前人数是通过调用当前引用st的getsize方法得到的,客户端也同样是通过Store类的引用st,每当我新生成一个客户的时候,内存空间就会新开辟一块存放Store对象的内存空间,里面存放它的数据成员Vector动态数组的引用vector,vector关联的是新生成的对象Vector,里面存放的是服务器的套接字,而在客户端并没有加入元素,所以size为0,过程图如下所示:

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java聊天室程序 需求分析 2.1 业务需求 1. 与聊天室成员一起聊天。 2. 可以与聊天室成员私聊。 3. 可以改变聊天内容风格。 4. 用户注册(含头像)、登录。 5. 服务监控聊天内容。 6. 服务过滤非法内容。 7. 服务发送通知。 8. 服务踢人。 9. 保存服务日志。 10.保存用户聊天信息。 2.2 系统功能模块 2.2.1 服务端 1.处理用户注册 2.处理用户登录 3.处理用户发送信息 4.处理用户得到信息 5.处理用户退出 2.2.2 客户端 1.用户注册界面及结果 2.用户登录界面及结果 3.用户发送信息界面及结果 4.用户得到信息界面及结果 5.用户退出界面及结果 2.3 性能需求 运行环境:Windows 9x、2000、xp、2003,Linux 必要环境:JDK 1.5 以上 硬件环境:CPU 400MHz以上,内存64MB以上 3.1.2 客户端结构 ChatClient.java客户端程序启动类,负责客户端的启动和退出。 Login.java客户端程序登录界面,负责用户帐号信息的验证与反馈。 Register.java客户端程序注册界面,负责用户帐号信息的注册验证与反馈。 ChatRoom.java客户端程序聊天室主界面,负责接收、发送聊天内容与服务端的Connection.java 亲密合作。 Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务信息。 Clock.java客户端程序的一个小程序,实现的一个石英钟功能。 3. 2 系统实现原理 当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务端 当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。 接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务上是否有最新消息,在本程序中设定的是3秒刷新服务一次,如果间隔时间太短将会增加客户端与服务端的通信负担,而间隔时间长就会让人感觉没有时效性,所以经过权衡后认为3秒最佳,因为每个用户都不可能在3秒内连续发送信息。 当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。 4.1.1 问题陈述 1.接受用户注册信息并保存在一个基于文件的对象型数据库。 2.能够允许注册过的用户登陆聊天界面并可以聊天。 3.能够接受私聊信息并发送给特定的用户。 4.服务运行在自定义的端口上#1001。 5.服务监控用户列表和用户聊天信息(私聊除外)。 6.服务踢人,发送通知。 7.服务保存日志。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值