基于JAVA的网络即时通讯软件的设计和实现

获取项目源文件,技术交流与指导联系Q:1225467431

摘要:本论文用Java语言编写的一个聊天系统。该系统是基于Java平台,系统采用面向对象技术和面向对象的设计原则。系统采用C/S结构,客户端和客户端、客户端和服务器端通过Socket发送消息。使用Java语言编写,使用Eclipse开发工具。服务器端的设计和实施过程中,使用多线程技术,它可以在一个程序中同时运行多个不同的线程,执行不同的任务,大大提高服务器资源的利用率。数据库管理系统SQL Server2005完成并通过JDBC-ODBC桥访问数据库。聊天系统将完成多人互相聊天、添加、删除好友、新用户注册、收发邮件、文件传输和语音视频聊天。

关键词:网络,即时通信,C/SSQL2005

1绪论

 

1.1即时通讯系统产生的背景

电子信息技术飞速发展,它融合了计算机、通信、信息和信号处理技术,使得信息飞速发展已成为一种必然趋势。各种信息化系统已成为一个国家基础设施,电子商务、电子政务、电子金地、科学研究、通信、交通和网络教育等十分重要的领域都因此而有了非常大的发展。因此,推进各领域高速发展的必要前提是信息化建设的发展。为实现其投资效益的最大化,必须加快信息化建设的发展步伐,信息化工程的实施必须立竿见影。所以为了将实施信息化工程的风险降至最低,我们需要一套或者多套稳定应用、功能贴切、易学易用、快速实施的信息化解决方案,能确保其关键业务和关键管理需求的优先解决,并能提供足够的扩展性来适应其不断增长的需要。但是传统业务的各个系统是独立设计的,支撑系统也是以满足生产为目的,而如果还是完全按照传统的思路进行各个系统的信息化建设,那么即使系统建成,也会有较大发展,但这种发展也只是各自单独的发展,并没有实信息化时代信息的快速传递和交换形成的互促发展的特点。这显然不符合我们希望信息资源的集成共享从而加快高度的自动化、智能化的信息化建设的初衷。

所以,我们就需要变化视角,通过新的角度设计出新的技术发展方案.,重新构建信息化建设和相关产业模式,才能达到实现便捷、多赢的目的。即时通讯系统应运而生。

1.2即时通讯系统的现状和发展

    即时通讯系统是基于Internet网络及其它有线、无线网络的一种非常流行的实时通信方式,是一种非常便捷的网络通讯技术,它用互联网通过通信系统建立起网络虚拟环境,通过计算机键盘或无线设备在网络上进行实时交换,成为一种提供公共通讯、商务通讯及商务合作的新媒介,也弥补了传统通讯形式的不足,尤其是电子邮件及语音通信方面。随着即时通信普及,全球即时通信用户的数量也不断增长。

微软公司的MSN0ICQ和雅虎公司的雅虎通,腾迅公司QQ,网易公司的网易泡泡等通信系统都是家喻户晓的。除了最基本的单纯的文本交流,即时通信业务增加了视频、音频交流等多种宽带应用元素,如提供视频、语音通信服务、交流共享、短信收发、数据传输等服务项目。即时通信软件的第二次发展浪潮来临----基于PgP技术的多媒体和基于IP技术的通信方。即时通信业务的承载设备也将趋向于多元化。用户可以通过手机、个人计算机、PDA等工具使用即时通信,宽带电话、网络电话业务也逐渐在即时通信的软件上实现功能。

1.3 开发即时通讯系统的意义

    即时通信系统的3大优势:

    1 .功能的多样性。如提供视频、交流共享、语音通信服务、短信收发、数据传输等服务项目,同时也注重了安全性、健壮性。

    2 .通信的即时性和高效性。即时通信系统的速度快,不管接收方的计算机处理什么样的业务,发送的消息都能很快的通知众多的用户,使通信更加即时有效。

 3 .功能上较强的延伸性。例如,有些即时通信软件可以用无线接入设备实现无线即时通信、直接访问公司的数据库、召集网上会议、多种语言的互译等等。

即时通信软件是应用软件的一个重要的分支,构造的成本低、实时性好、网上交流平台便捷的特点决定了它的普及性,使其成为了在互联网上和他人联系的重要方式,可以加强信息沟通,推动政府机构、大型事业单位信息化的建设!因此,开发及时通讯软件也就具有了重要的意义!

2相关技术

2.1 JAVA语言

Java是一种简单、多线程、安全、容易适用、可移置、面向对象、高性能的语言。它具有如下特点: 

  1. 面向对象。面向对象技术一次革新,它可以提高模块化程度和重复适用率,缩短软件开发时间,减低开发成本。
  2. 安全性。Java提供了许多安全机制,是能用在网路和分布环境下的程序设计语言。
  3. 多线程。Java具备内建的多线程功能,使各线程并发、独立执行,提高系统的运行效率。
  4. 平台独立。平台独立是指程序不受操作平台限制,可以应用于各种平台。Java源程序经过编译后能够生成字节码文件,字节码和具体的计算机无关。计算机安装能解释执行字节码的JVM,就能执行字节码文件,实现了Java的平台独立性。

5. 执行效率。字节码要经过JVM解释成机器码才能执行,所以速度较慢。

2.2 TCP/IP协议

TCP协议是网络通信的基石。Java专门提供了Socket的类库,抽象出TCP协议通信中的常用方法:

TCP协议与三次握手:

1)客户端,首先发送TCP请求,客户端是服务(如数据查询服务)的请求者。

2)服务器,接收到客户端的请求后,服务器向客户端提供服务。服务器是服务的执行者,返回服务执行的结果给向客户端。

首先客户端发送一个数据包SYN。如果服务器收到SYN,它会发回一个数据包SYN+ACK。客户端为了表示收到SYN+ACK信息,向服务器发送一个最终确认信息ACK。SYN,SYN+ACK,ACK步骤被称为 “三次握手”,这样,连接就建立好了,并将一直保持活动状态,直到其中一方发出FIN(结束)信号或者超时。这种通信模式也被叫做客户端/服务器(C/S)模式。

如图5-1所示:

主机A                         主机B

2-1握手协议

 

2.3 Socket通信 

 

从概念上理解,Socket是网络编程中最常见的客户/服务器模式,也是本系统的基础。以该模式编程时,服务器端有一个进程或多个进程在指定的端口等待客户来连接,一旦连接成功,便按设计的数据交换方法和格式进行数据传输。客户端向服务器端提出连接请求,连接之后进行通信。Socket是一种用于表达两台机器上都有一个Socket,可以想象一条虚拟的电缆工作在两台机器之间,电缆插在两台机器的Socket上。简单的说,一台计算机上的Socket同另一台计算机通话创建一个通信信道,我们可以用这个信道在两台机器之间发送数据。如图5-2 Socket实现原理图:

 

2-2 Socket实现原理图

 

3系统需求分析

3.1项目设计的需求描述

随着网络技术的快速发展,即时通信(Instant Messaging缩写为IM或IMing)成为网络在线活动中重要的业务,它是使人们能网上识别在线用户并和他们交换实时消息的技术。

    设计一个基于JAVA的网络即时通信系统,在通用计算机网络上实现信息传递,包括基本的文本消息传递和音频信号的传输,实时获取联系人状态,对常用联系人进行管理等。主要考虑以下基本功能:注册并登录服务器获得用户列表,用户运行客户端程序后,服务器端程序在公网上运行,与其他用户进行点对点的实时消息通信。

    统一建模语言(UML)是可视化建模语言,用于构造软件系统和描述可视化。UML简单且功能强大,提供了大多数面向对象核心概念,还提供了扩展方案。UML通过提供九种图(类图、对象图、用例图、协作图、状态图、顺序图、部署图、组件图、活动图)可视化的表达语义。图(Diagram)是模型元素的图形符号化,由一组元素的图形表示。UML通过这九种图可以可视化描述世界上的复杂事物,有很大的灵活性。

    Rational Rose是基于UML的工具。面向对象技术逐步成熟与软件工程化思想日益深入,提出基于组件的软件开发模式和自动的、科学的技术和产品,覆盖了软件工程各个环节,如可视化建模、过程自动化、需求管理、软件质量自动保证、软件配置管理和开发工具等。不论是系统需求阶段,还是在对象的软件的分析与设计、实现和测试阶段,它提供了清晰的UML工具和表达方法,建立了相应的软件模型。

因此,本系统可以使用面向对象(JAVA)的开发方法,用UML对整个系统进行设计分析,并用Rational Rose 2003作为UML工具。

3.2项目设计的系统用例图

用户(user)通过登录界面与服务器(Server)进行通信,不仅能够注册新账号,还能通过Server与在线好友进行聊天,包括文本消息传递和音频信号传输,还能管理自己的好友列表,如删除好友等。如图3-1系统的总体功能用例图所示:

 

3-1 系统的总体功能用例图

注册登录:用户可以通过注册界面填写必要的信息来是申请到一个账户,并可直接跳转到登录界面,输入密码即可登录。

好友聊天:用户可以从在线好友列表中选择好友进行消息传递,也可以跟陌生人进行聊天。

用户管理:用户可以进行添加好友、删除好友等操作。

语音聊天:用户可以选择在线用户进行语音聊天。

    本系统主要通过客户端,服务器端来体现聊天系统的基本功能。

1)服务器端:

1.处理用户注册

2.处理用户登录

3.处理用户发送信息

4.处理用户得到信息

5.处理用户退出

6.保存服务器日志

     7.保存用户聊天信息

2)客户端:

     1.用户注册界面及结果

2.用户登录界面及结果

3.用户发送信息界面及结果

4.用户得到信息界面及结果

5.用户退出界面及结果

 

3.3 user注册活动图

 

启动Server后,Server开启一个Socket连接的监听线程,用来监听来自网络的连接。当User使用Client进行注册账号,user要把个人资料填写完并发送给Server。Server来验证user填写的个人资料是否合法,如果合法,Server将用后台数据库表ICQ自动序列生成ICQ号返回给user。如果不合法,Server拒绝申请,并将填写资料错误的信息返回给user。

如图 3-2 user注册活动图:

 

3-2 user注册活动图

3.4 user登录活动图

启动Sever后,Server开启一个Socket连接的监听线程,用来监听来自网络的任何连接。当Client申请登录,user使用账号和密码进行登录,Server将user发过来的user信息和Server后台数据库里的user信息进行比对。如果user的账号和密码与之完全匹配,则user成功登录,并且Server返回给user登录账号的好友列表、好友资料、好友状态;如果不匹配,Server则告知Client的user登录失败。如图3-3 user登录活动图:

 

3-3 user登录活动图

 

3.5 user好友添加时序图

userA打开好友添加面板并填写添加请求。请求先是由userA发送给Server,再由Server转发给userB,如果userB接收到请求成功,userB的Client则自动打开一个好友请求界面告诉userB有陌生人添加请求。UserB接收请求并回复,将由Server将该回复转发userA。如图3-4 user好友添加时序图:

 

3-4 user好友添加时序图

 

3.6 user聊天时序图

userA使用Client登录,登录成功后选择userB,打开聊天面板并填写聊天内容。消息先是由userA发送给Server,然后由Server转发给userB,如果userB接收消息成功, Server将发送成功的消息返回给UserA;如果userB接收消息失败,Server将发送失败的消息返回给userA。

user聊天时序图,如图3-5:

 

3-5  user聊天时序图

3.7 user语音聊天时序图

userA打开语音聊天界面,选择好友userB,向他发送语音请求。该请求先是由userA发送给server,然后由server转发给userB。userB通过语音聊天界面可以接收到请求并做相应的处理,如拒绝或者接受。userB将处理请求发送给Server,再由server根据userB 的处理请求做出相应处理。如果userB同意语音请求,则userA和userB将通过建立UDP连接来实现发送和接收语音消息。

 UMLuser语音聊天时序图,如图3-6 :

 

3-6  user语音聊天时序图

4系统数据库设计

4.1 用户和客户端的关系

本系统采用SQL2005数据库管理系统,用于实现系统信息的管理。根据系统需求,列出以下数据项和数据结构:

Client:注册、登录、查看资料、离线消息传递等。

User:昵称、性别、号码、年龄、地址、等。

Client和User之间是使用的关系。user登录成功之后则可查询在线user的基本信息。

可画出数据库E-R图,如图4-1所示:

4-1 系统数据库E-R图

 

4.2 用户和登录记录的关系

列出user与聊天记录、user与登录记录的数据结构。

登录记录:登录次数、上线时间、下线时间、登录的IP。

User与登录记录之间是通过号码联系。所以,user与登录记录的E-R图如图4-2所示。

4-2 user与登录记录E-R图

 

4.3 用户和聊天记录的关系

  聊天记录:接收消息内容、发送消息内容、发送消息时间、接收消息时间。

  User与聊天记录之间是通过登录联系,登录的属性包括IP、号码等。所以,user与聊天记录的E-R图如图4-3 所示:

4-3  user与聊天记录E-R

4.4 数据库中表格的设计

本系统需要用SQL server 2005 实现数据表,user个人信息表分别设id 、nickname 、age、sex、password、 address等字段,其中id 和age为数字数据类型,nickname、age、sex、password、 address为文本数据类型。选择使用设计器创建表新建数据库,如图4-4数据库窗口所示:

4-4 数据库窗口

因此,对user个人信息表进行创建、保存,user个人信息表如表4-5 所示:

4-5 user个人信息表

列名

数据类型

长度

允许空

id

int

4

No

nickname

text

16

Yes

sex

text

16

Yes

age

int

4

Yes

address

text

16

Yes

password

text

16

Yes

对表 3-2定义的字段进行详细的信息填充,在user登录成功并获得user列表后

便可通过点击user资料看到在线user的nickname、age、sex、id、address等详细的

基本信息。

    user登录记录表分别设 onlinetime、loginIP、logindegree、outlinetime字段,其中 outlinetime、oulinetime 字段为日期的数据类,loginlP 字段为文本的数据类型,

logindegree字段为整数的数据类型。user登录记录发如表 4-6 所示:

4-6 user登录记录表

 

聊天记录表分别设recvmsg、sendmsg、recvtime、 sendtime字段,其中sendtime、recvtime字段为日期型的数据类型,sendmsg、recvmsg字段为文本的数据类型。user聊天记录表如表4-7所示:

4-7 user聊天记录表

列名

数据类型

长度

允许空

sendmsg

text

16

Yes

recvmsg

text

16

Yes

sendtime

datetime

8

No

recvtime

datetime

8

No

注册user应该具有昵称、Icqno 号码、状态、性别、IP、密码、住址、个人资料、头像、Email信息,其中,昵称、Icqno号码、密码状态在数据库中不能为空值,密码和昵称由user填写,状态由Server根据user在线情况自动更新,Icqno号码由数据库自动序列生成。

user使用Client、Server进行通信。Server根据Client的请求对后台数据库进行写入、查询的操作。后台数据库存储所有Icqnouser的个人信息和好友列表。user通过Client向 Server发出请求来修改个人信息和管理好友列表。

5 详细设计

5.1 系统总体流程图 

 

5-1 系统总体流程图

 

5.2 系统客户端流程图

 

5-2 客户端流程图

 

6 系统实现 

 

6.1 编写服务器端程序

6.1.1 问题陈述

 

      1. 接受用户注册信息并且保存在一个基于文件的对象型数据库。

      2. 能够允许已注册的用户登录聊天界面并可以进行聊天。

      3. 能够接受私聊信息并且发送给指定的用户。

      4. 服务器能够运行在自定义的端口上1001。

      5. 服务器可以监控用户列表和用户聊天信息(私聊除外)。

      6. 服务器踢人,并且发送通知。

      7. 服务器能够保存日志。

 

6.1.2 后台数据库设计

 

     基于服务器跨平台运行的构想,服务器的后台数据库使用SQL Server2005。

(1) register表:

6-1  register表

 

(2) login 表:  

6-2  Login表

 

此表主要包含了用户基本帐户信息。

聊天系统采用UserName作为用户帐号,并给每个用户自动生成一个唯一ID来做系统内部的用户标识。

6.1.3用户注册

 

 首先要启动服务器,聊天服务器的启动界面如图6-3:

 

 

 

6-3 聊天服务器的启动界面

    1.到数据库读数据

    首先,创建一个File文件类,载入“user.txt”文本,再用对象输入流ObjectInputStream把用户信息导入到系统中。

    2.客户端请求注册

客户端要通过Register.java请求注册,并填写注册信息,能够验证密码是否符合规定,能够判断是否两次密码输入一致,如果不一致会弹出提示信息如要求重新输入,最后将请求信息发送给服务器端。客户端请求注册部分代码如下:

int flag = 0; // 是否重名判断标志

Register_Customer clientMessage = (Register_Customer) obj;

File fList = new File("user.txt");

if (fList.length() != 0)// 判断是否是第一个注册用户

{

ObjectInputStream objInput = new ObjectInputStream(

new FileInputStream(fList));

vList = (Vector) objInput.readObject();

// 判断是否有重名

for (int i = 0; i < vList.size(); i++) {

Register_Customer reg = (Register_Customer) vList

.elementAt(i);

if (reg.custName.equals(clientMessage.custName)) {

toClient.println("注册名重复,请另外选择");

flag = 1;

break;

} else if (reg.custName.equals("所有人")) {

toClient.println("禁止使用此注册名,请另外选择");

flag = 1;

break;

 

3.服务器端响应

    服务器端收到注册请求后会把对象输入流转化为文件输出流,并且反馈给客户端。客户端收到注册信息后会在前台填写注册信息,然后创建文件输出流,再用对象输出流包装后写入本地文件将其持久化。最后关闭对象输出流和文件输入流。服务器响应部分代码如下:

// 将向量中的类写回文件

FileOutputStream file = new FileOutputStream(fList);

ObjectOutputStream objout = new ObjectOutputStream(file);

objout.writeObject(vList);

4.向客户端返回信息

    将用户注册成功的信息或失败的信息用打印流包装Socket之后,将注册结果的详细信息输出给客户端。向客户端返回信息部分代码如下:

// 发送注册成功信息

toClient.println(clientMessage.custName + "注册成功");

Date t = new Date();

log("用户" + clientMessage.custName + "注册成功, " + "注册时间:"

+ t.toLocaleString() + "\n");

    5.关闭Socket连接

当以上的程序都正常运行结束后,需要关闭Socket连接,否则服务器与客户端之间的资源将会浪费。关闭Socket连接部分代码如下:

      // 关闭Socket连接部分

file.close();

objout.close();

fromClient.close();

6.1.4用户登陆

    1.到数据库读用户数据

打开用户数据库文件“User.txt”,把用户数据对象集载入内存,供下面的程序使用。

到数据库读用户数据的部分代码如下:

// 读文件

FileInputStream file3 = new FileInputStream("user.txt");

ObjectInputStream objInput1 = new ObjectInputStream(file3);

vList = (Vector) objInput1.readObject();

    2.验证用户名是否存在

    到对象数据库中查找是否存在和登录用户的用户名相同的记录,如果有则继续验证,否则退出验证处理,并返回“没有此用户”错误提示。

用户登陆程序模块部分代码如下:

if (reg.custName.equals(clientMessage2.custName)) {

find = 1;

if (!reg.custPassword.equals(clientMessage2.custPassword)) {

toClient.println("密码不正确");

break;

} else {

// 判断是否已经登录

int login_flag = 0;

for (int a = 0; a < userOnline.size(); a++) {

String _custName = ((Customer) userOnline

.elementAt(a)).custName;

if (clientMessage2.custName.equals(_custName)) {

login_flag = 1;

break;

}

}

if (userOnline.size() >= 50) {

toClient.println("登录人数过多,请稍候再试");

break;

    聊天服务器的用户登录界面如图6-4:

 

                         6-4 聊天服务器的用户登录界面

6.1.5用户退出

 

1.接收退出信息

当用户退出时,客户端将向服务器退出对象发送基于Socket的对象输出流。

    2.在线列表中删除用户

    用户退出后,程序要把用户从在线列表中删除,否则用户退出后用户却还在在线列表中,那么该用户下次将会无法正常登录。

    3.更新在线列表

用户退出后,将服务器端监控界面的用户列表更新。否则用户数据将会不同步。

聊天服务器的用户退出界面如图6-5:

 

6-5 聊天服务器的用户退出界面

用户退出模块程序部分代码如下:

public void serverExit() {

Exit exit = new Exit();

exit = (Exit) obj;

removeUser(exit);

// chenmin

if (sFrame.ti.equals(exit.exitname)) {

sFrame.ti = "";

}

Date t = new Date();

log("用户" + exit.exitname + "已经退出, " + "退出时间:" + t.toLocaleString());

freshServerUserList();

}

 

6.1.6 接收用户聊天信息

    1.接收用户聊天信息

    用户发送聊天信息时,服务端便会接收到客户端用Socket传送过来的聊天信息对象,并且将其强制转换为Chat对象。

    2.过滤用户聊天内容的非法信息

    对聊天信息对象的聊天内容进行分析,用语言过滤类过滤掉非法字符。语言过滤的时候将会打开“badword.txt”文件,不允许出现的关键词已存储在文件中,关键字之间用逗号分割。当聊天内容中出现要过渡的关键字,而聊天内容将会被系统屏蔽。

    3.接收服务器端的系统消息

    当有其他用户登陆时,系统会把用户登陆信息在线发送给所有其他用户,并且可以通过服务器给所有用户发送系统消息。

    4.返回给客户端

当以上信息都封装成功后,打开与客户端连接的Socket的输出流,然后再用ObjectOutputStream对象输出流包装后输出给客户端。

聊天服务器的接收用户聊天信息界面如图6-6:

 

6-6 聊天服务器的接收用户聊天信息界面

接收用户聊天信息部分代码如下:

public void serverChat() {

// 将接收到的对象值赋给聊天信息的序列化对象

Chat cObj = new Chat();

cObj = (Chat) obj;

// chenmin

cObj.chatMessage = WordFilter.filter(cObj.chatMessage);

chatLog(cObj);

// 将聊天信息的序列化对象填加到保存聊天信息的矢量中

userChat.addElement((Chat) cObj);

return;

}

 

6.2客户端程序编写

6.2.1 用户注册

 

程序将通过Register.java用户注册界面收集用户的用户名、密码、头像、性别、年龄、电子邮箱。如图6-7:

 

6-7 用户注册界面

客户端用户注册信息模块程序部分代码如下:

    //连接到服务器

    Socket toServer;

       toServer = new Socket(strServerIp,1001);

    ObjectOutputStream streamToServer=new ObjectOutputStream (toServer.getOutputStream());

    //写客户详细资料到服务器socket

    streamToServer.writeObject((Register_Customer)data);

            //读来自服务器socket的登陆状态

            BufferedReader fromServer=new BufferedReader(new InputStreamReader(toServer.getInputStream()));

            String status=fromServer.readLine();

            //显示成功消息

            JOptionPane op=new JOptionPane();

            op.showMessageDialog(null,status);

            if(status.equals(data.custName+"注册成功"))

            {

                txtUserName.setText("");

                pwdUserPassword.setText("");

                pwdConfirmPass.setText("");

                txtAge.setText("");

                txtEmail.setText("");

            }

6.2.2 用户登录

程序将通过Login.java用户登录界面收集用户的用户名、密码,如图6-8:

 

6-8 用户登陆界面图

用户登录部分代码如下:

// 接受客户的详细资料

try {

// 连接到服务器

Socket toServer;

toServer = new Socket(strServerIp, 1001);

ObjectOutputStream streamToServer = new ObjectOutputStream(toServer.getOutputStream());

// 写客户详细资料到服务器socket

streamToServer.writeObject((Customer) data);

// 读来自服务器socket的登录状态

BufferedReader fromServer = new BufferedReader(

new InputStreamReader(toServer.getInputStream()));

String status = fromServer.readLine();

if (status.equals("登录成功")) {

new ChatRoom((String) data.custName, strServerIp);

this.dispose();

// 关闭流对象

streamToServer.close();

fromServer.close();

toServer.close();

} else {

JOptionPane.showMessageDialog(null, status);

streamToServer.close();

fromServer.close();

toServer.close();}

} // login()结束

6.3 聊天室实现

   

    当用户登录成功后,用户的登录界面将会隐藏,然后创建用户聊天室窗口,在界面的标题栏将会显示当前登录用户的用户名,以防止一个机器上的用户开多个账号进入聊天室后分不清哪个窗口是哪个用户登录的,界面第一行将显示当前在线人数。位于界面正中的两个控件分别是List和TextBox用来显示当前服务器上的在线会员名单列表和公共聊天信息。

位于界面下方的就是一些用于聊天的功能控件和聊天内容个性化配置控件。包括聊天对象,聊天语气,聊天内容,聊天字体,风格,大小,颜色等。聊天室界面如图6-9:

 

6-9 聊天室界面

 

6.3.1 用户发送信息

当用户需要发送信息时,需要在聊天内容里写下要发送的信息,然后点击发送按钮就可以发送到其他客户端,也可以选择私聊、聊天表情,聊天信息将会通过服务器发送到其他客户端。如图6-10:

 

6-10 聊天室界面

    用户发送信息部分代码如下:

// "发送"按钮

public void sendMessage() {

Chat chatobj = new Chat();

chatobj.chatUser = strLoginName;

chatobj.chatMessage = txtMessage.getText();

chatobj.chatToUser = String.valueOf(cmbUser.getSelectedItem());

chatobj.whisper = chPrivateChat.isSelected() ? true : false;

chatobj.emote = emote.getSelectedItem().toString();

// 向服务器发送信息

try {

Socket toServer = new Socket(strServerIp, 1001);

ObjectOutputStream outObj = new ObjectOutputStream(toServer

.getOutputStream());

outObj.writeObject(chatobj);

txtMessage.setText(""); // 清空文本框

outObj.close();

toServer.close();

} catch (Exception e) {

}

} // sendMessage()结束

6.3.2 保存聊天记录

     当用户需要保存聊天记录时,可以点击“保存”按钮,聊天记录将会用“用户名_message.txt”作为文件名,以防多用户聊天记录文件出现冲突问题,并将信息保存在当前应用程序目录下。如图6-11:

 

6-11 记录保存图

保持模块程序部分代码如下:

// "保存"按钮

public void saveMessage() {

try {

FileOutputStream fileoutput = new FileOutputStream(

this.strLoginName + "_message.txt", true);

String temp = taUserMessage.getText();

// System.out.println(temp);

fileoutput.write(temp.getBytes());

fileoutput.close();

JOptionPane.showMessageDialog(null, "聊天记录保存在" + this.strLoginName

+ "_message.txt");

} catch (Exception e) {

System.out.println(e);

}

}

6.3.3显示系统时间

当用户需要查看当前时间时,可以点击“时钟”按钮,程序将会启动一个电子时钟,获取系统当前时间。如图6-12:

6-12 时钟界面

时钟模块程序:

  public void actionPerformed(ActionEvent e)

  {

        timer.restart();

  }

  public void paint( Graphics g )

  {

Insets insets = getInsets();

      int L0 = (insets.left)/2, T0 = (insets.top)/2;

      int hh,mm,ss;

      String st;

      h=getSize().height;

      //绘制圆形

      //获取时间

      Calendar now=Calendar.getInstance();

      hh=now.get(Calendar.HOUR_OF_DAY);//小时

      mm=now.get(Calendar.MINUTE);//分钟

      ss=now.get(Calendar.SECOND);// 秒

      g.setColor(Color.pink);

      g.fillRect(L0,T0,60,28);//填充的矩形

      g.setColor(Color.blue);

      if (hh < 10) st="0"+hh;     else st=""+hh;

      if (mm < 10) st=st+":0"+mm; else st=st+":"+mm;

      if (ss < 10) st=st+":0"+ss; else st=st+":"+ss;

      g.drawString(st,L0,T0+25);

      //计算时间和图形的关系

      sdo=90-ss*6;

      mdo=90-mm*6;

      hdo=90-hh*30-mm/2;

      //擦除秒针 

      //绘制秒针

      g.setColor(Color.yellow);

      x=(int)((r-8)*Math.cos(RAD*sdo)+x0);

      y=(int)((r-8)*Math.sin(RAD*sdo)+y0)-2*T0;

      g.drawLine(x0,y0,x,(h-y));

      old_X=x;

      old_Y=y;

      //绘制分针

      line(g,mdo,(int)(r*0.7),Color.green);

      //绘制时针

      line(g,hdo,(int)(r*0.5),Color.red);

  } // end paint

6.3.4屏蔽聊天信息

当用户发送的信息涉及到敏感词汇(比如一些不文明的用语)的时侯,程序将会把用户发送的信息与badword文件进行比对,如果比对得到敏感词汇,程序将会屏蔽该用户发送的信息,如图6-13

 

6-13 屏蔽聊天信息

部分代码如下:

public void process() {

  String badWord = this.getFile("badword.txt");

  System.out.println(badWord);

  String badWordList[] = badWord.split(",");

  for (int i = 0; i < badWordList.length; i++) {

 System.out.println(badWordList[i]);

System.out.println(badWordList[i]+":"+word.indexOf(badWordList[i]));

if (word.indexOf(badWordList[i]) != -1) {

word = "非法内容,系统屏蔽";

}

}

6.3.5 退出聊天系统

当前用户点击“退出”按钮或者关闭窗口时,系统将会把用户退出的信息打包成对象发送给服务器,并且退出客户端程序。如图6-14:

 

6-14 用户退出聊天系统

退出功能部分代码如下:

// "退出"按钮

public void exit() {

Exit exit = new Exit();

exit.exitname = strLoginName;

// 发送退出信息

try {

Socket toServer = new Socket(strServerIp, 1001);

// 向服务器发送信息

ObjectOutputStream outObj = new ObjectOutputStream(toServer

.getOutputStream());

outObj.writeObject(exit);

outObj.close();

toServer.close();

frmChat.dispose();

// this.destroy();

} catch (Exception e) {

}

private void exitChatRoom() {

exit();

}

6.3.6出现异常信息

 

在用户聊天时,当服务器关闭或者与服务器无法连接时,客户端将会给出“不能连接到服务器!”的信息。并在用户查看后退出客户端。

 

7结语

在这次的毕业设计中,我应用了JAVA开发工具在WINDOWS平台上开发了一个基于WINDOWS平台的局域网通信工具,在这一重要的领域进行了相关的实践,不管是对我的研究能力,还是实际动手能力,还是资料查阅能力,都起了相当大的益处。所以,我决定认真总结这次毕业设计的经验,以及学习到的知识,来更加的充实自己的头脑和完善自己的知识结构。

本文分别讨论了网路即时通讯系统产生的背景、现状和发展前景和开发的意义,对这个软件有了一定的认识和开发方向。然后讨论了网络即时通讯系统需要运用的技术,虽然没有详细描述各项技术,但是也比较全面地罗列了需要的技术及原因。最后从软件需求这个角度详细分析了这个软件的功能,并用了各种用例图、活动图、序列图等来描述系统的功能和实现构想,此外,也初步进行了数据库的设计,并用E-R图来就解释说明。在一般情况下,聊天工具由客户端程序和服务器程序以及服务器端的数据库组成。本系统采用客户机/服务器体系结构模型,由Java Socket类提供连接每个客户端与服务器通信。另一方面,因为聊天是多点对多点的,Java提供可用于完成多点对多点的多线程聊天。数据库管理系统用SQL Server2005完成并通过JDBC-ODBC桥访问数据库。系统着重研究并实现了网络应用的部分。根据实现的情况看,具有较友好的聊天界面生成效果,以及流畅的网络通信效果。生成的聊天室可以达到基本的聊天要求,具有较高的研究价值。

一个月的忙碌和工作,本次毕业设计已经接近尾声,作为一个本科生的毕业设计,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有导师的督促指导,以及一起工作的同学们的支持,想要完成这个设计是难以想象的。在这里再次感谢我的导师,徐昕老师。

通过毕业设计,发现自己在理论研究和实际工作能力等方面都得到了提高,受益匪浅,同时在老师的指导和课题组同学的共同帮助下,及时总结研究成果,这些无疑会对我今后的工作和学习带来很大的帮助。进入社会后,我以后会更加努力,是学校给我学习的机会,在以后的生活中继续提高自己,为自己创造更多的机会,更好的明天!

 

 

参考文献

[1]吴其庆JAVA编程思想与实践 .北京冶金工业出版社.20028

[2]林智扬.范明翔.深入浅出JAVA SWING程序设计.中国铁道出版.20054

[3]张海藩.软件工程导论(第四版).清华大学出版社.200312

[4](英)John Carter ,张淮野 袁怡 等译. 数据库设计与编程实例详解.电子工业出版社 . 20012

[5]Sun.Java Programming Language SL-275.20025

[6]Roger S. Pressman .SOFTWARE ENGINEERING—A PRACTITIONER’S APPROCHFourth Edition .机械工业出版社出版.1999

[7] Edward Yourdon & Carl Argila.case studies in OBJECT ORIENTED ANALYSIS & DESIGN.电子工业出版社出版.1998

[8]Jalote P.Optimum control limits for employing statistical process control in software process. IEEE Trans on Software Engineering.200228(12)

[9] 罗军舟等.TCP/IP协议及网络编程技术.清华大学出版社.200810

[10] 孟凡荣.数据库原理与应用.中国矿业大学,2009828-30

[11] Bruce Tate .Bitter Java. Manning Publications. 2002-04

[12] Joshua Bloch .Effective Java Programming Language Guide. Addison-Wesley Professional. 05 June, 2001

[13] Bruce Eckel .Thinking in Java (3rd Edition). Prentice Hall PTR . 2002-12-06

[14] Joshua Bloch .Effective Java: Second Edition. Addison-Wesley. 2008-05-28

[15] Kathy Sierra / Bert Bates / Sierra Kathy / Bates Bert.Head First Java, 2nd Edition. O'Reilly Media. 2005-02-09

[16]PavlouPAConsumer Acceptance of Electronic CommerceIntegrating Trust and Risk with the Technology Acceptance ModelInternational Journal of Electronic Commerce20037(3)101-134

[17]http://www.ibm.com/developerworks/java/library/os-eclipse-javadebug/index.html?S_TACT=105AGX02&S_CMP=EDU

 

 

 

 

 

 

 

致谢

本论文是在徐昕老师的精心指导下完成的,导师严谨的治学态度、对事业的热忱,对我有很大的帮助,至此论文完成之际,谨向他致以深深地敬意和由衷的感谢!

在完成论文的过程中,也得到了许多同学的大力支持,在此一并感谢。感谢南京信息工程大学图书馆提供的相关资料。

猜你喜欢

转载自www.cnblogs.com/rdutdhtfj/p/12657473.html