版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、* 科 技 大 学 电 信 学 院 课程设计说明书 设计题目: 基于 java 的聊天系统设计与实现 学院、系: 计算机系 专业班级: 计算机 2011-1 班 学生姓名: 指导教师: 成 绩: 2013 年 10 月 27 日 基于 JAVA 的聊天系统的设计与实现 摘 要 网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐。目 前,出现了很多非常不错的聊天工具,其中应用比较广泛的有 Netmeeting、腾讯 QQ、MSN-Messager 等等。该系统开发主要包括一个网络聊天服务器程序和一个网络聊天 客户程序两个方面。前者通过 Socket 套接字建立服务器,服务器能读
2、取、转发客户端发 来信息,并能刷新用户列表。后者通过与服务器建立连接,来进行客户端与客户端的信 息交流。其中用到了局域网通信机制的原理,通过直接继承 Thread 类来建立多线程。开 发中利用了计算机网络编程的基本理论知识,如 TCP/IP 协议、客户端/服务器端模式 (Client/Server 模式) 、网络编程的设计方法等。在网络编程中对信息的读取、发送, 是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些 基本的软件工程的方法。经过分析这些情况,该聊天工具采用 Eclipse 为基本开发环境 和 java 语言进行编写,首先可在短时间内建立系统应用原型,然后,
3、对初始原型系统进 行不断修正和改进,直到形成可行系统 关键词:即时通讯系统 B/S C/S MySQL Socket Swing 目 录 第第 1 1 章章 引言引言.1 1.1 开发背景.1 1.2 开发目的和意义.1 1.3 论文研究内容.2 第第 2 2 章章 即时通讯系统的相关研究即时通讯系统的相关研究.3 2.1 C/S 开发模式.3 2.2 B/S 开发模式.3 2.3 即时通讯原理.4 2.4 Java web 、Struts2、AJAX、JavaScript 应用技术.4 2.5 MySQL 数据库应用技术.4 2.6 Socket 通信技术.4 2.7 开发环境的搭建.5 第
4、第 3 3 章章 系统分析系统分析.6 3.1 系统基本功能描述.6 3.2 可行性分析.6 3.3 系统需求分析.7 3.3.1 功能分析.7 第第 4 4 章章 系统设计系统设计.9 4.1 数据库设计.9 4.2 系统模块设计.10 4.2.1 聊天系统工作原理图.10 4.2.2 系统功能模块图:.11 4.2.3 系统用例图:.11 4.2.4 活动图:.12 4.3 系统类设计.14 4.3.1 Message 类的设计.14 4.2.2 截图类的设计.15 4.2.3 聊天记录类的设计.16 4.2.4 服务器线程类设计.17 第第 5 5 章章 系统实现系统实现.18 5.1
5、实现概况.18 5.2 注册模块.18 5.2.1 流程图.18 5.2.2 关键代码.18 5.3 登录模块.20 5.3.1 流程图.20 5.3.2 关键代码.20 5.4 聊天模块.24 5.4.1 流程图.24 5.4.2 关键代码.24 5.5 文件模块.28 5.5.1 流程图.28 5.5.2 关键代码.28 5.6 用户管理模块.33 5.6.1 流程图.33 5.6.2 关键代码.33 5.7 其他功能的实现.36 5.7.1 截图功能的实现.36 5.7.2 聊天记录功能的实现.37 5.7.3 服务端线程的实现.38 5.8 用户界面的设计.38 结语结语.42 第第
6、1 1 章章 引言引言 1.11.1 开发背景开发背景 随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越 来越多的网民的青睐。目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有 Netmeeting、腾讯 QQ、MSN-Messager 等等。无论是个人还是企业等组织机构,对沟通的 需求也在不断发展,传统的电话、传真、邮件等沟通方式显然已无法满足当今人们工作 和生活沟通的需要。随着软件、网络和通讯三大现代信息技术的发展,在沟通、协作方 面有着更多方便、快捷、实时等优势的即时通讯,成为继电话、E-Mail 之后又一个完全 融入每个人生活的互联网工具。 Java 是一
7、个由 Sun 公司开发而成的新一代编程语言。使用它可在各式各样不同种机 器、不同种操作平台的网络环境中开发软件。不论你使用的是哪一种 WWW 浏览器,哪一 种计算机,哪一种操作系统,只要 WWW 浏览器上面注明了“支持 Java” ,你就可以看到生 动的主页。Java 正在逐步成为 Internet 应用的主要开发语言。它彻底改变了应用软件的 开发模式,带来了自 PC 机以来又一次技术革命,为迅速发展的信息世界增添了新的活力。 1.21.2 开发目的开发目的和意义和意义 网络通信在当今信息社会中起着不可或缺的作用,人们可以利用网络通信技术进行 即时的信息 交流。比如说 QQ 聊天工具,它就是利
8、用网络通信技术开发的一款众所周知 的网络聊天工具。通讯工具最初虽为聊天而诞生,但其作用早已超出了聊天的范畴,随 着企业即时通讯工具的出现,即时信息在网络营销中将发挥更大的作用。 目前,信息交流是互联网提供的主要内容,网络通信系统有多种实现方 式,类似 ICQ 属于一种点对点的聊天系统;还有一种是基于 Socket 的集中式聊天系统,这种聊天 系统需要登录统一的聊天服务器。考虑到要可以在局域网中应用,本系统使用的是第二 种方法,经过设置,在局域网或 internet 上都可以使用。 1.31.3 研究内容研究内容 1、即时通讯原理 首先验证登陆,如果成功,则建立与服务端的 socket 连接,服
9、务端新开启一个线 程专门为它服务,将打包好的 Message 发送给服务器端,服务器端根据 Message 里面的 信息,再将信息转发给其他用户。一个标准的 C/S 模式。 2、Swing 技术 Swing 是一个用于开发 Java 应用程序用户界面的开发工具包。它以抽象窗口工具 包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。用来实现客服端 的界面设计。 3、Java web 和 struts2 技术 采用 B/S 的结构实现服务器端,对用户和在线用户进行增删改查,和踢用户下线, 以及开启服务器和关闭服务器。 4、系统的构建 客户端采用 C/S 结构,管理端采用 B/S 的结
10、构,用 Tomcat 作为服务器,MySQL 作为数据库,还使用到了 WindowBuilder 开源框架进行界面开发。 第第 2 2 章章 即时通讯系统的相关研究即时通讯系统的相关研究 2.12.1 C/SC/S 开发模式开发模式 C/S 结构的优点是能充分发挥客户端 PC 的处理能力,很多工作可以在客户端处理后 再提交给服务器。对应的优点就是客户端响应速度快。缺点主要有以下几个: 而随着互联网的飞速发展,移动办公和分布式办公越来越普及,这需要我们的系统 具有扩展性。这种方式远程访问需要专门的技术,同时要对系统进行专门的设计来处理 分布式的数据。 客户端需要安装专用的客户端软件。首先涉及到安
11、装的工作量,其次任何一台电脑 出问题,如病毒、硬件损坏,都需要进行安装或维护。还有,系统软件升级时,每一台 客户机需要重新安装,其维护和升级成本非常高。(大多数没法自动升级而需要人工升级) 对客户端的操作系统一般也会有限制。可能适应于 Windows 98,但不能用于 Windows 2000 或 Windows XP。或者不适用于微软新的操作系统等等,更不用说 Linux、Unix 等。 2.22.2 B/SB/S 开发模式开发模式 B/S 结构(Browser/Server 结构)结构即浏览器和服务器结构。它是随着 Internet 技 术的兴起,对 C/S 结构的一种变化或者改进的结构。
12、 在这种结构下,用户工作界面是通过 WWW 浏览器来实现,极少部分事务逻辑在前 端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层 3-tier 结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降 低了用户的总体成本(TCO) 。 以目前的技术看,局域网建立 B/S 结构的网络应用,并通过 Internet/Intranet 模式下 数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的 人员,从不同的地点,以不同的接入方式(比如 LAN, WAN, Internet/Intranet 等)访问和 操作共同的数
13、据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全 。 特别是在 JAVA 这样的跨平台语言出现之后,B/S 架构管理软件更是方便、速度快、 效果优。 2.32.3 即时通讯原理即时通讯原理 登陆进入聊天软件后,即显示出好友列表,在线的显示亮头像,不在线的显示灰色 头像。双击好友头像即会显示出聊天界面。 在聊天页面上,有发送文字,发送截图,和发送文件的功能按钮。 点击“发送”按钮之后,程序就会把输入的信息的种类,信息内容、本人的 ID 号、 对方的 ID 号以及当前的时间等内容打包成一个 Message 对象通过 Socket 发送到服务器端。 服务器接收到 Message 之后
14、,按照协议进行解析和转发。这样,双方的即时通讯就 实现了。 2.42.4 JavaJava WebWeb 、struts2struts2、AjaxAjax、javascriptjavascript 应用技术应用技术 通过这些技术,实现服务器的后台管理端,对用户和在线用户进行增删改查,和踢 用户下线,以及开启服务器和关闭服务器。以及用户的注册,前台验证等等 2.52.5 MySQLMySQL 数据库应用技术数据库应用技术 使用 MySQL 存储用户信息,采用 JDBC 技术对其进行增删改查。 2.62.6 SocketSocket 通信技术通信技术 Socket 程序的工作过程: 1、建立 So
15、cket 连接:在通信开始之前由通信双方确认身份,建立一条专用的虚拟连 接通道。 2、数据通信:利用虚拟连接通道传送数据信息进行通信。 3、关闭:通信结束时,再将所建的虚拟连接拆除。 具体如下: 服务器 图 2-1 socket 通信 2.72.7 开发环境的搭建开发环境的搭建 客户端采用 C/S 结构,管理端采用 B/S 的结构,用 Tomcat 作为服务器,MySQL 作 为数据库,还使用到了 WindowBuilder 开源框架进行界面开发。 第第 3 3 章章 系统分析系统分析 3.13.1 系统基本系统基本功能描述功能描述 客户端可以实现注册,即时聊天,相互之间收发文件,发送截图,查
16、看历史聊天记 录等功能。收发消息时,可以实现离线接收。 服务器端应当建立一个 ServerSocket,并且不断进行侦听是否有客户端连接或者断 开连接(包括判断没有响应的连接超时)。服务器端应当是一个信息发送中心,所有客户 端的信息都传到服务器端,由服务器端根据要求分发信息。 在后台管理系统,可以到对用户进行增删改查,查看在线用户,和踢用户下线 3.23.2 可行性分析可行性分析 本系统的可行性分析包括以下几个方面的内容: (1) 技术可行性 使用 Swing 和 socket 技术,可以很轻松地开发出实用、简便、高效的基于网络的即 时通讯系统。 因此技术上是可以实现的。 (2) 经济可行性
17、计算机网络已经普及,因此在网络设备上不需要进行大的投入。本系统需要一个 MySQL 数据库服务器,由于并发使用人数比较少,tomcat 可以作为 web 服务器,所以成 本很低。 (3) 操作可行性 只要一台以上计算机连接在同一个局域网内,本系统就可以安装使用,所以操作上 完全不存在问题。如果要实现 internet 上通讯,只需要将服务器端运行在一个有固定 IP 的公网上就可以。 综上所述,即时 Java 即时通讯系统是可行的。 3.33.3 系统需求分析系统需求分析 .1 功能分析功能分析 本系统要实现的功能如下: 1)注册 服务器收到用户的注册请求,便开始接受客户传递的信
18、息,诸如客户的呢称,性别, 籍贯,个人资料等,接受完毕后,便通过 JDBC 与后台数据库连接,然后向数据库添加记 录,如果成功,便向客户返回其号码。客户收到服务器返回的信息后,便打开窗口登陆。 2)登陆 在客户端,用户输入其号码和密码,然后建立与服务器的连接,告诉服务器我要登 录,服务器收到后,开始通过 JDBC 读取数据库,然后与用户输入的信息进行比对,如果 成功,便打开主程序窗口。然后客户向服务器请求读取好友名单,服务器收到该请求, 从数据库中取出好友列表,然后向客户端发送这些信息,客户收到后就在主窗口显示好 友。 3)聊天 客户端首先发送消息到服务器端,服务器端根据发送人信息和接收者信息
19、来转发。 例如服务器接收到一个 A 发给 B 的消息,先判断 B 是否已经在线,如果在线就将信息发 送过去。如果 B 不在线则把信息储存在服务器,等 B 上线了在发送给他。B 接收到 A 发 来的信息,如果是未建立对话窗口,则自动打开显示。 4)发送截图 客户端 A 点击截图按钮,将屏幕锁定,截取图片,将图片储存在 byte数组中发送到 服务器端。服务器端根据发送人信息和接收者信息来转发。B 接收到 A 发来的截图信息, 会根据 byte构造图片,将图片显示出来。同样,如果是未建立对话窗口,则自动打开显 示。 5)发送文件 客户端 A 点击发送文件按键,从本地选择文件,将文件在 byte数组中
20、分批次发送到 服务器端。服务器端根据发送人信息和接收者信息来转发。B 接收到 A 发来的文件信息, 会根据文件发送的状态和 byte构造文件。 6)日志 客户端发送和接收到的信息都会储存在文本文档中。默认储存在 C 盘下面,会以用 户的登录账号为名。 7)对用户的操作 管理员通过 B/S 的系统对用户进行增加,修改,删除,查找等操作,对系统进行维 护。 8)在线用户的操作 管理员通过 B/S 的系统对在线用户操作,可以踢用户下线。 第第 4 4 章章 系统设计系统设计 4.14.1 数据库设计数据库设计 本系统中所涉及的主要实体及其属性有: 用户(用户账号,用户名,密码,个性签名,头像 ID,
21、年龄,性别) E-R 模型如图所示。 user account Name password signature ProfileID age sex 图 4-1 系统实体及其属性 表 4-1 User 字段名数据类型字段说明键引用备注 accountint(6)IDPK 主键(自动增一) namevarchar(20) 用户名称非空 passwordvarchar(20) 用户密码非空 signatureVarchar(255) 签名 profileIDint(2) 头像 ID ageint(3) 年龄 sexsex char(2) 性别 4.2 系统模块设计系统模块设计 4.2.1 聊天系统工
22、作原理图 图 4-2 系统工作原理 4.2.2 系统功能模块图: JAVA聊天 系统 文件 模块 聊天 模块 登录 模块 用户管理 模块 文件 接收 文件 发送 发送 文字 发送 图片 在线 用户 管理 增加 用户 删除 用户 修改 用户 查找 用户 查看 在线 用户 踢用 户下 线 注册 图 4-3 系统模块 4.2.3 系统用例图: 普通用户的用例图: 用户 注册 登陆 聊天 文件 发送文件 接收文件 文字 图片 图 4-4 普通用户用例图 后台管理员的用例图: 管理员 登陆 增加用户 踢用户下线 查看在线用户 删除用户 查找用户 修改用户 图 4-5 后台用户用例图 4.2.4 活动图:
23、 1)用户登陆活动图 首先填写登陆信息,提交以后服务器会对用户名和密码进行验证。如果不正确,返 回一个提示信息。如果登陆成功,就更新在线状态。通知所有好友自己已经上线。服务 器再检查是否有他的离线消息,如果有这立即发送给用户。 图 4-6 用户登录活动图 2)发送消息活动图 短消息发送以后,服务器端对应的监听线程会接收到一个数据包。此包中包含接收 者的信息,如果接收者在线,数据包将会转发到接收者。如果不在线,存在服务器端, 等它上线在发送。 图 4-7 发送消息活动图 4.3 系统类设计系统类设计 4.3.1 Message 类的设计: 客户端和服务器端通信时,发送的都是 Message 类的
24、对象,因此 Message 类的设计 很重要。 表 4-2 Message 属性属性名名作用作用 private Integer msgType;信息类型 private String content; 信息的文本内容 private Integer senderAccount;发送者 account private Integer receiverAccount;接收者 account private String time;发送时间 private User myself; private List friends; 自己本身对象,用与好友列表头 好友列表 private transien
25、t Image img; 图片对象(不传送) private byte imageByte; 图片的内容 private String fileName; 文件名称 private byte fileByte; 文件的长度 private int length;/文件长度,以 KB为单位 文件的内容 private int state; 文件传输的状态: 0 是不接受文件,1 是接受文件,2 请求发送 文件,3 文件传输中,4 文件传送完成 private Integer msgType消息的类型有这么几种: public interface MessageType Integer messa
26、ge_succeed=1;/表明是登陆成功 Integer message_login_fail=2;/表明登录失败 Integer message_comm_mes=3;/普通信息包 Integer message_get_onLineFriend=4;/要求在线好友的包 Integer message_ret_onLineFriend=5;/返回在线好友的包 Integer message_offline=6;/下线通知包 Integer message_img=7;/图片包 Integer message_file=8;/文件包 4.3.2 截图类的设计: 截图类的实现类为: class
27、 Screenshot extends JFrame implements MouseListener,MouseMotionListener。 +mouseDragged(in MouseEvent e) +mouseClicked(in MouseEvent e) +mousePressed(in MouseEvent e) +mouseReleased(in MouseEvent e) +paint(in Graphics g) Screenshot MouseListener MouseMotionListener +paint(in Graphics g) JFrame 监听各种鼠标
28、动作 图 4-8 Screenshot类 截图类的核心是 JDK 中:Robot 类中createScreenCapture(Rectangle screenRect) 创建 包含从屏幕中读取的像素的图像。 先用截取全部屏幕的图片,然后显示出来,覆盖住整个屏幕。然后监听鼠标事件,再 用createScreenCapture(Rectangle screenRect)方法截图。 双击表示截图成功,右键表示取消截图。 4.3.3 聊天记录类的设计: 记录日志的功能被封装在 MessageRecord 类中,所在包为 com.im.client.record,在发送或接受到数据后,将其写入日志文件。
29、 +afterSend(in o : Object) +afterReceive(in o : Object) MessageRecord afterSend:记录发出数据 afterReceive:记录接收到的数据 +run() +send(in o : Object) +receive() : Object ClientConnToServerThread +run() Thread 图 4-9 MessageRecord 类 如果是图片则显示出,发送时间和图片大小。如果是文件则显示出请求发送时间, 同意接收时间,接收完成时间,和文件大小。 日志文件格式如下: 图 4-10 记录文件 4.
30、3.4 服务端线程的设计: 服务器端的核心是对应客户的线程,每个 socket 对应一个线程,也就是每一个客 户端都在服务器端有一个相应的线程。它负责转发客户端发来的消息。 线程类为 ClientThread: 表 4-3 ClientThread 类 属性属性名名作用作用 public void notifyOnline()通知其他线程,自己上线了,让客户 方更新头像 public void run() 线程的主题,转发消息 public void notifyOffline() 通知其他线程,自己下线了,让客户 方更新头像 public void send(Object o) 发送消息 p
31、ublic Object receive() 接收消息 第第 5 5 章章 系统实现系统实现 5.15.1 实现概况实现概况 本系统可分为登录、聊天、文件、用户管理和注册五个功能模块。 “登录”模块为用 户提供登录界面,并在用户登录显示好友列表;“聊天”模块实现用户的即时传送信息, 即多用户即时聊天,可以发送文字或者截图;“文件”模块主要实现一用户向另一用户 发送文件,对方可以选择接受或者拒绝。聊天记录会以文本文档格式保存。 “用户管理” 模块即管理员对用户进行增删改查,和踢用户下线的操作。 下面详细介绍各个模块的具体实现。 5.25.2 注册模块注册模块 5.2.1 流程图 开始 填写用户信
32、 息 存入数据库 显示账号 结束 图 5-1 用户注册流程图 5.2.2 关键代码 注册的前台页面是 showDetail.jsp,后台是 UserAction 类,UserAction 类中有方法: public String saveOrUpdate() us.saveOrUpdate(user); return refresh; saveOrUpdate 则是用到了 Userservice 里面的方法: public void saveOrUpdate(User u) System.out.println(u.getAccount()=+u.getAccount(); if(u.getA
33、ccount()=null) ud.save(u); else ud.update(u); DAO 类中的方法: public void save(User u) conn=getConnection(); try ps=conn.prepareStatement(SAVE); ps.setString(1, u.getName(); ps.setString(2, u.getPassword(); ps.setString(3, u.getSignature(); ps.setInt(4, 1); ps.setInt(5, u.getAge(); ps.setString(6, u.getS
34、ex(); ps.execute(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); finally close(); 网页上显示用户的 account 图 5-2 用户注册信息 5.35.3 登录模块登录模块 5.3.1 流程图 开始 填写用户 信息 验证用户信息 验证用户 结束 接收离线 信息 成功 失败 发送登陆 失败信息 图 5-3 登录流程图 5.3.2 关键代码 1)客户端代码 登录事件是定义在class IMClientLogin extends JFrame 这个类的监
35、听事件中。 登录成功后,立即向服务器请求自己的好友列表。 /登录事件 login.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) /cus=new IMClientUserServer(); /System.out.println(cus.getServer(); User u=new User(); u.setAccount(Integer.parseInt(account.getText().trim(); u.setPassword(new String(passwordF
36、ield.getPassword(); /登陆成功 if(cus.checkLogin(u) /向服务器发送数据包,请求在线人得信息 ClientConnToServerThread t=Manager.THREAD; Message m=new Message(); m.setMsgType(MessageType.message_get_onLineFriend); m.setSenderAccount(u.getAccount(); try t.send(m); catch (IOException e1) e1.printStackTrace(); dispose(); else JO
37、ptionPane.showMessageDialog(null, 用户名或密码错误, 错误, JOptionPane.ERROR_MESSAGE); ); 登录逻辑是在public class IMClientUserServer 里面,认证成功者就会新建一个线 程,专门负责接收服务器端发来的信息class ClientConnToServerThread extends Thread 。 public boolean checkLogin(Object o) boolean success=false; Message msg=(Message) server.sendLoginInfo(
38、o); /System.out.println(msg.getMsgType(); /System.out.println(MessageType.message_succeed); if(msg.getMsgType().intValue()=MessageType.message_Value() success=true; User u=(User) o; /将好友列表放到管理器中,进行上下线操作 IMFriendList fl=new IMFriendList(msg.getMyself(),msg.getFriends(); Manager.FRIEND_LIST
39、=fl; /开启客户线程 ,接收服务器端的信息 connThread =new ClientConnToServerThread(server.getSocket(); connThread.setSocket(server.getSocket(); connThread.start(); connThread.setName(u.getAccount()+); Manager.THREAD=connThread; return success; 客户端通过public class IMClientServer 类与服务器通信 public Object sendLoginInfo(Objec
40、t o) try ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream(); oos.writeObject(o); ObjectInputStream ois = new ObjectInputStream(socket.getInputStream(); Message ms = (Message) ois.readObject(); return ms; catch (IOException e) e.printStackTrace(); catch (ClassNotFoundException e
41、) e.printStackTrace(); return null; 这样按照MVC的模式设计,减小的系统耦合。 2)服务端代码 服务器端接收用户验证信息的代码被写在了一个线程public class ServerThread extends Thread中,这样服务器就可以不停的监听端口,接收来自不同客户端的请求, 建立socket连接,也不会堵塞在主线程当中。 从数据库中搜索用户,看是否存在 public boolean checkLogin(User u) User user=ud.findById(u.getAccount(); if(user!=null) return user.
42、getPassword().equals(u.getPassword(); return false; 如果验证成功,查找是否有他的离线消息,有就发送给他。然后在服务器上专门开 启一个针对当前用户的线程,并且吧线程放入管理类中,便于日后的管理。 if (checkLogin(u) / 返回一个成功登陆的信息报 User myself=ud.findById(u.getAccount(); m.setMsgType(MessageType.message_succeed); m.setMyself(myself); m.setFriends(ud.findAll();/好友列表 oos.writ
43、eObject(m); /为用户单独创建线程 ClientThread t=new ClientThread(s); /查看是否有离线消息 LinkedList list=OffLineMsgManager.get(u.getAccount(); if(list!=null) for(Message msg:list) t.send(msg); list.clear(); /开启线程 t.start(); t.setName(u.getAccount()+); /把用户线程放入管理类中 ClientThreadManager.addClientThread(u.getAccount(), t)
44、; /通知其他的用户 t.notifyOnline(); System.out.println( 成功); else m.setMsgType(3); oos.writeObject(m); System.out.println( 失败); / 关闭Socket s.close(); 5.45.4 聊天模块聊天模块 5.4.1 流程图 开始 打开聊天窗口 输入数据接收数据 显示数据发送数据 结束 图 5-4 聊天流程图 5.4.2 关键代码 1)客服端代码 发送文字信息: 客户端发送和显示信息的代码被封装在了IMChat extends JFrame implements ActionList
45、ener类中,其中发送文字信息的代码 /点击的如果是发送button if (e.getSource() = confirmButton) Message m=(Message) makePackage(MessageType.message_comm_mes,null); /发送 sendMessage(m); /在自己的Ouput上显示 showMessage(m,Color.BLACK); /清空输入 input_textArea.setText(); 当用户点击发送按钮后,先把先把信息显示在自己的聊天窗口上,后方发送信息, 自己发送的信息和接收到的信息用不同的颜色显示。 显示文字信息,
46、显示在JtextPane控件中 SimpleAttributeSet attrset = new SimpleAttributeSet(); StyleConstants.setForeground(attrset,c); Document docs = output_pane.getDocument(); / 利用getDocument()方法取得JTextPane的Document /一般信息 if(m.getMsgType().intValue()=MessageType.message_comm_mes) String str=m.getSenderAccount() + +m.get
47、Time()+n+ + m.getContent()+ n; try docs.insertString(docs.getLength(), str, attrset); /设置光标到末尾 output_pane.setCaretPosition(docs.getLength(); catch (BadLocationException e) e.printStackTrace(); 发送图片信息: 在发送图片信息的时候,先将图片转换成为byte数组,包装在信息包种发送出去, 接收到图片信息时,从byte数组构建图片,显示出来。 图片和byte之间相互转换的关键代码如下: /将image转换成
48、 byte public byte imageToBytes(Image img) ByteArrayOutputStream bos=new ByteArrayOutputStream(); try ImageIO.write(RenderedImage) img, jpg, bos); catch (IOException e) e.printStackTrace(); return bos.toByteArray(); /将 byte转换成image public Image bytesToImage(byte b) try return ImageIO.read(new ByteArr
49、ayInputStream(b); catch (IOException e) e.printStackTrace(); return null; 在JtextPane中显示图片的代码: if(m.getMsgType().intValue()=MessageType.message_img) /图片信息 String str=m.getSenderAccount() + +m.getTime()+ n; try /显示发送人 和时间 docs.insertString(docs.getLength(), str, attrset); /设置光标到末尾 output_pane.setCaret
50、Position(docs.getLength(); output_pane.insertIcon(new ImageIcon(m.getImg(); docs.insertString(docs.getLength(), n, attrset); /设置光标到末尾 output_pane.setCaretPosition(docs.getLength(); catch (BadLocationException e) e.printStackTrace(); 在客户端显示截图示例: 图 5-5 聊天截图 2)服务端代码 服务端接收到客户端的信息后,只需要根据他的接收人,进行转发就可以。关键
51、代码如下: Message m = (Message) receive(); / 如果是普通信息 if (m.getMsgType() = MessageType.message_comm_Value() System.out.println(m.getSenderAccount() + send to+ m.getReceiverAccount() + at + m.getTime(); Integer receiverAccount = m.getReceiverAccount(); ClientThread t = ClientThreadManager.getClient
52、Thread(receiverAccount); if (t = null) /不在线就暂时存储在服务器上 OffLineMsgManager.putSingle(receiverAccount, m); else t.send(m); 5.55.5 文件模块文件模块 5.5.1 流程图 选择文件 请求发送文件确定接收 选择存放目录 对方拒绝接收 同意接收 发送文件 接收文件 图 5-6 发送文件流程图 5.5.2 关键代码 1)客户端代码 在客户端采用 JfileChooser 来浏览本地文件,点击浏览按钮后,会弹出对话框,让用 户选择文件,然后将文件名,大小等信息封装在数据包里,发送出去。
53、关键代码如下: Override public void mouseClicked(MouseEvent e) fileDialog.setDialogTitle(选择文件); fileDialog.showOpenDialog(IMChat.this); /只能选中文件 fileDialog.setFileSelectionMode(JFileChooser.FILES_ONLY); f=fileDialog.getSelectedFile(); /发送数据包,请求发送文件 Message m = new Message(); m.setMsgType(MessageType.message
54、_file); m.setSenderAccount(ownerId); m.setReceiverAccount(Integer.parseInt(hideButton.getText(); SimpleDateFormat s = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);/发送时间 m.setTime(s.format(new java.util.Date(); m.setFileName(f.getName();/文件名 m.setState(2);/请求发送文件 int length=(int) (f.length()/1000); m.se
55、tLength(length);/文件大小 sendMessage(m); 对方会显示提示信息: 图 5-7 询问接收文件图 如果对方同意接收则开启线程。因为文件可能比较大,所以不能一次性发送,只能 用线程分批发送。线程关键代码如下: 正常发送文件: 图 5-8 文件传输图 Override public void run() try int num ; /bar.setStringPainted(true); JProgressBar bar=chat.getProgressBar(); m.setMsgType(MessageType.message_file); m.setFileNam
56、e(f.getName(); BufferedInputStream bos=new BufferedInputStream(new FileInputStream(f); while(num = bos.read(b) != -1) m.setFileByte(b); Manager.THREAD.send(m); int value=LENGTH/10000; bar.setValue(bar.getValue()+value); bar.setVisible(false); /bar.setValue(0); /发送完毕 SimpleDateFormat s = new SimpleDa
57、teFormat(yyyy-MM-dd HH:mm:ss); m.setTime(s.format(new java.util.Date(); m.setState(4); Manager.THREAD.send(m); /在窗口上显示发送成功 chat.append(new Color(0,0,255), 文件+f.getName()+( +f.length() /+M)+发送成功+n); catch (FileNotFoundException e) / TODO Auto-generated catch block e.printStackTrace(); catch (IOExcept
58、ion e) / TODO Auto-generated catch block e.printStackTrace(); 发送完成后,双方的界面上都会显示成功信息: 图 5-9 文件传输成功图 客户端接收文件的逻辑: 文件的传输状态被定义成了这几种: 0是不接受文件, 1是接受文件, 2请求发送文件, 3文件传输中, 4文件传送完成 客户端接收文件是可根据这些状态,进行操作,关键代码如下: /请求发送包 if(m.getState()=2) /对话框 是否接收 int i=JOptionPane.showConfirmDialog(chat, 确定接收 + m.getFileName()+(
59、 +m.getLength()+KB), 接收文件 ,JOptionPane.YES_NO_OPTION); Integer sender=m.getReceiverAccount(); Integer getter=m.getSenderAccount(); m.setSenderAccount(sender); m.setReceiverAccount(getter); /同意就发送同意接收数据包 if(i=JOptionPane.YES_OPTION) /打开保存文件对话框 JFileChooser jfc=new JFileChooser(c:/); jfc.setFileSelect
60、ionMode(JFileChooser.DIRECTORIES_ONLY); int mod=jfc.showSaveDialog(chat); if(mod=JFileChooser.APPROVE_OPTION) /如果选择了路径 File f=jfc.getSelectedFile(); f=new File(f.getAbsolutePath()+/+m.getFileName(); bos=new BufferedOutputStream(new FileOutputStream(f); m.setState(1); send(m); else /选择了取消或关闭对话框 m.set
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 垃圾填埋气发电行业市场调研分析报告
- 2024内蒙古赤峰市宁城县“绿色通道”引进 高中教师50人笔试模拟试题及答案解析
- 社区家庭参与活动的组织计划
- 职场沟通与礼仪提升培训
- 室内装修设计承揽合同三篇
- 种下希望的种子幼儿园学期计划
- 班级志愿服务活动的实践方案计划
- 2024-2025部编版语文一年级上册阅读5小小的船
- 导游基础知识(中国古代建筑)模拟试卷11(题后含答案及解析)
- 锂电产业新力量-投资分析与市场展望
- 中国移动L1-L3等级认证(无线LTE网络优化)考试复习题库汇总-上(单选题汇总)
- 国网新疆电力有限公司架空输电线路无人机安全工作规程题库
- 防火检查记录表
- Unit 1 课件(第1课时)【知识精研+拓展提升】 中职专用 高一英语高效课堂
- 风电网:风机基础混凝土冬季施工建议措施
- 2023-2024学年北京四中七年级(上)月考数学试卷(10月份)(含解析)
- 关于酒驾醉驾开展谈心谈话
- 《婴幼儿常见疾病预防与照护》课程标准
- 雕塑采购投标方案(技术标)
- 《让我们的学校更美好》课件ppt
- JTGT-3833-2018-公路工程机械台班费用定额
评论
0/150
提交评论