JAVA聊天室实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java聊天室实验报告
班级: ****** 学号: ******** 姓名: ***
目录:
一、实验目的 (3)
二、所需技术 (3)
三、需求分析 (3)
四、系统设计 (4)
1、服务器结构 (4)
2、客户端结构 (4)
五、实现细节 (5)
1、客户端细节 (5)
2、服务器细节 (6)
六、系统展示 .......................................... . (7)
七、实验小结 .......................................... . (9)
Rain153 WeChat 聊天室系统
一、实验目的:
1、使用Java技术完成聊天室系统,深入学习使用Java语言。
2、使用Java 的多线程机制,深入理解Java多线程技术的应用。
3、使用GUI,对JFrame的深入学习。
4、使用网络编程,掌握基于TCP协议的Socket编程,了解Socket编程的
协议约定,掌握简单应用协议的开发。
5、使用C/S架构,对网络编程有一定的了解。
二、所需技术
本系统要求使用java技术开发。所需知识包括java程序设计语言、swing 基本GUI组件、多线程编程、socket编程、集成开发环境使用eclipse。系统采用两层C/S体系结构,C端负责通过GUI与客户交互,实现注册、登陆、收发信息、退出等功能; S端是聊天系统的服务器。
三、需求分析
开发一个类似QQ 的聊天室系统,即WeChat聊天系统。该系统应具有如下功能:
1、用户注册、登录
2、群聊;
3、私聊;
4、服务器发送系统消息;
5、服务器踢人;
6、保存日志;
7、保存聊天信息;
四、系统设计
1、服务器结构
服务器端结构图示
2、客户端结构
客户端结构图示
1、AppServer.java 为服务器端监听类,负责服务器的启动,包括启动监听
端口、服务器监控界面。
2、ServerFrame.java 为服务器监控窗体,负责监控服务器运行状态。
3、Connection.java 为服务器连接处理的具体实现。
4、ChatClient.java 为客户端程序启动类,负责客户端的启动和退出。
5、Login.java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。
6、Register.java 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。
7、ChatRoom.java 为客户端程序聊天室主界面,负责接收、发送聊天内容与服
务器的Connection合作。
8、Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当
用户退出时返回给服务器信息。
9、Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。(可选)
五、实现细节
概述:聊天室主要功能的实现:从界面输入登录信息,然后与服务器建立Socket连接(连接时应指定服务器的IP地址和端口号,而客户端socket的端口由本方操作系统从空闲端口中确定),服务器端的“倾听Socket”收到连接请求后,一般会接受连接请求,并生成一个服务端socket,专门负责与此客户端socket的通信。一旦连接请求成功,客户端将信息及请求通过本方socket的输出流发送给服务器端相应的socket,服务端则通过服务器端Socket的输入流接受客户端传输过来的信息及请求,分析是何请求,然后根据请求类型,进行相应的处理(如登录、转发信息等)。服务方也可以根据需要,通过socket的输出流发信息和请求给客户端(公告)。客户方和服务方都可以通过关闭本方的socket 而结束一次通讯过程。为了实现多客户在线的请求,使用多线程机制来处理,对每一个客户端连接通讯,服务器端都有一个线程专门负责处理。
一)客户端细节
1、注册:
当选择注册时,Register界面等待用户输入注册信息,并将信息封装成Register_Customer类,然后通过建立在Socket的连接之上的对象输出流将用户注册信息发送给服务器端,服务器端将请求转发给Connection处理,Connection 在收到信息后将验证数据的完整性并在数据库中查找该用户名是否已经注册,然后将注册信息加入数据库,最后将注册结果返回给客户端。
客户端显示注册结果。
2、登录:
当选择登录时,客户端由Login 界面等待用户输入登录信息后,封装成Customer对象类然后通过建立在Socket的连接之上的对象输出流将用户登录信息发送给服务器端,服务器端将请求转发给Connection处理,Connection 在收到信息后将验证数据的完整性并在对象型数据库中查找该用户名是否已经注册,然后将注册用户的信息与登录请求信息进行密码验证,在登录成功后将该用户添加到在线用户列表,最后将登录结果返回给客户端。若登录成功,客户端将启动聊天室主界面。
3、聊天
a、发送聊天信息:私聊功能需在在线列表中选中私聊聊天对象,并勾选
私聊选项。群聊功能取消对私聊功能的勾选即可。当用户点击完发送按钮后,程序开始将当前用户名、聊天对象、聊天内容、表情和是否私聊进行封装,然后获取Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。
b、接收聊天信息:用一个单独的接收线程实现,客户端必须随时接收
服务器发来的消息,而读取消息的方法采用的是阻塞式方法,若在事件处理程序中读(占用的是事件处理线程)则会使程序在此后无法响应用户操作,所以需要生成一个单独的线程专门用于读取处理消息。而发送消息的方法则是将消息放入操作系统的发送缓冲区后就返回的,所以发送执行的相当快,可以在事件处理线程中直接调用。发送和接收可以同时进行。二)服务器端细节
1、注册:创建一个File文件类,载入“user.txt”,再用对象输入流
ObjectInputStream包装File文件类,将存储在“user.txt”得向量对象Vector中载入内存中,现在系统中的向量就是对象型数据库,存储着每条用户信息对象。判断是否是第一个注册用户,判断用户名是否已经存在,判断用户名是否为系统关键字,用户名有效后写入数据库,并给客户端返回信息,关闭Socket连接。
2、登录:去数据库读用户数据,打开用户数据库文件“user.txt”,将用户
数据对象集载入内存,以供下面的程序使用。验证用户名是否存在,验证用户密码是否正确,验证用户是否已经登录,验证是否已经超过最大登录人数,如果以上验证全部正确,返回客户端信息,关闭Socket连接。
3、退出:接收退出信息,当用户退出时,客户端将会用基于Socket的对象
输出流发给服务器退出对象,把用户从在线列表中删除,更新在线列表。
4、聊天:接收用户聊天信息,当用户发送聊天信息时,服务端将会收到客户
端用Socket传输过来的聊天信息对象,然后将其转换为Message对象,返回聊天信息,然后系统从Message中提出消息类型,再根据类型将消息强制转化ChatMessage,调用ChatMeaage中方法,获取目的客户名称列表,根据目的地用户名从用户名、socket键值表中获取socket,再通过socket将Message 转发到相应的用户。