基于java的聊天系统客户端+服务器.docx
《基于java的聊天系统客户端+服务器.docx》由会员分享,可在线阅读,更多相关《基于java的聊天系统客户端+服务器.docx(21页珍藏版)》请在冰豆网上搜索。
![基于java的聊天系统客户端+服务器.docx](https://file1.bdocx.com/fileroot1/2023-1/7/ea1e34e7-78f9-4098-bfb1-e70fcf5a2793/ea1e34e7-78f9-4098-bfb1-e70fcf5a27931.gif)
基于java的聊天系统客户端+服务器
课程设计答辩记录
教师主要
提问记录
学生回答
问题情况
课程设计成绩评定
答辩成绩(50%)
课程设计报告撰写质量(50%)
总分
是否同意通过
□同意□不同意
答辩小组成员签名:
年月日
封面
成都信息工程学院
课程设计
基于JAVA的聊天系统的设计与实现
作者姓名:
王时成
班级:
网络094班
学号:
2009121150
指导教师:
曾令明
日期:
2011年12月12日
作者签名:
基于JAVA的聊天系统的设计与实现
摘要
随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐。
目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有Netmeeting、腾讯QQ、MSN-Messager等等。
与此同时,也造成了很多的问题,比如员工上班聊QQ等等,为了防止这类事件,并且利用企业部门和部门之间,员工和员工之间以及员工与部门之间的交流,需要企业拥有自己的一套交流系统。
该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。
前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。
后者通过与服务器建立连接,来进行客户端与客户端的信息交流。
其中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。
开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。
在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。
经过分析这些情况,该局域网聊天工具采用MyEclipse为基本开发环境和java语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统
关键词:
局域网聊天socketjava
目录
\
1引言1
1.1课题背景1
1.2本文的主要工作1
2聊天系统的需求分析以及开发工具1
2.1系统目标1
2.2系统具备的基本功能1
2.3开发环境及工具2
2.3.1开发环境2
2.3.2JAVA语言介绍2
2.3.3TCP/IP协议介绍6
2.3.4Socket简介6
3系统总体结构设计8
3.1基本简介8
3.2系统功能模块设计8
3.2.1数据库设计8
3.2.2ER图10
3.2.3功能模块介绍10
4系统流程与实现12
4.1系统设计流程12
4.2页面详细介绍12
5系统测试与分析16
5.1测试16
5.2测试中遇到的问题16
结论17
参考文献17
1引言
1.1课题背景
根据当前网络的需求,网络聊天越来越受各种网民所青睐。
因此开发网络聊天是相当有必要,而且在网站内增加聊天功能,它不仅可以提高网站的访问量,同时可以留着访客,更重要的是让访客透过聊天室实时的互相交流。
而本人也学习过JAVA语言,对网络编程也较有兴趣,为了更好的考验自己对JAVA语言的掌握程度,本人就决定以《基于JAVA聊天系统的设计与实现》为软件设计,希望通过这一次的能进一步提高本人的网络开发编程的能力。
1.2本文的主要工作
本文是对本次开发从构思到实现,再到测试整个开发过程中的环节进行描述的文档,提供给开发人员使用,能够理清思路。
同时,也可以提供给其他人员,交流更加清楚。
2聊天系统的需求分析以及开发工具
2.1系统目标
聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。
因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:
1、实现思想
在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。
因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。
2、服务器端工作流程
服务器端通过socket()系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。
如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。
然后登录成功的客户就可以在服务器上聊天了。
3、客户端工作流程
客户端程序相对简单,只需要建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。
2.2系统具备的基本功能
1)服务器端
服务器端应具备的以下的功能
1、开启/关闭服务;
2、查看在线的用户;
3、向全公司或者指定部门发送系统消息;
4、部门管理(包括增删改查);
5、用户管理(包括增删改查);
6、日志查看;
2)客户端
客户端具备以下功能
1、登录服务器;
2、修改密码;
3、查看系统消息、部门消息以及好友消息(包括离线消息);
4、查看所有用户(包括离线用户);
5、聊天功能;
6、退出登录;
2.3开发环境及工具
2.3.1开发环境
主要开发工具:
MyEclipse9.0+SQL2008
辅助开发工具:
ERstido8.0、Viso2003
2.3.2JAVA语言介绍
(一)JAVA的主要特点
Java语言有下面一些特点:
简单、面向对象、分布式、解释执行、鲁棒、安全、体系结构中立、可移植、高性能、多线程以及动态性。
1.简单性
Java语言是一种面向对象的语言,它通过提供最基本的方法来完成指定的任务,只需理解一些基本的概念,就可以用它编写出适合于各种情况的应用程序。
Java略去了运算符重载、多重继承等模糊的概念,,且通过实现自动垃圾收集大大简化了程序设计者的内存管理工作。
另外,Java也适合于在小型机上运行,它的基本解释器及类的支持只有40KB左右,加上标准类库和线程的支持也只有215KB左右。
库和线程的支持也只有215KB左右。
2.面向对象
Java语言的设计集中于对象及其接口,它提供了简单的类机制以及动态的接口模型。
对象中封装了它的状态变量以及相应的方法,实现了模块化和信息隐藏;而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,实现了代码的复用。
3.分布性
Java是面向网络的语言。
通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便地访问其它对象。
4.鲁棒性
Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。
它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。
通过集成的面向对象的例外处理机制,在编译时,Java提示出可能出现但未被处理的例外,帮助程序员正确地进行选择以防止系统的崩溃。
另外,Java在编译时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。
5.安全性
用于网络、分布环境下的Java必须要防止病毒的入侵。
Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止程序员使用“特洛伊”木马等欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。
6.体系结构中立
Java解释器生成与体系结构无关的字节码指令,只要安装了Java运行时系统,Java程序就可在任意的处理器上运行。
这些字节码指令对应于Java虚拟机中的表示,Java解释器得到字节码后,对它进行转换,使之能够在不同的平台运行。
7.可移植性
与平台无关的特性使Java程序可以方便地被移植到网络上的不同机器。
同时,Java的类库中也实现了与不同平台的接口,使这些类库可以移植。
另外,Java编译器是由Java语言实现的,Java运行时系统由标准C实现,这使得Java系统本身也具有可移植性。
8.解释执行
Java解释器直接对Java字节码进行解释执行。
字节码本身携带了许多编译时信息,使得连接过程更加简单。
9.高性能
和其它解释执行的语言如BASIC不同,Java字节码的设计使之能很容易地直接转换成对应于特定CPU的机器码,从而得到较高的性能。
10.多线程
多线程机制使应用程序能够并行执行,而且同步机制保证了对共享数据的正确操作。
通过使用多线程,程序设计者可以分别用不同的线程完成特定的行为,而不需要采用全局的事件循环机制,这样就很容易地实现网络上的实时交互行为。
11.动态性
Java的设计使它适合于一个不断发展的环境。
在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的执行。
并且Java通过接口来支持多重继承,使之比严格的类继承具有更灵活的方式和扩展性。
(二)JavaApplet
Java语言的特性使它可以最大限度地利用网络。
Applet是Java的小应用程序,它是动态、安全、跨平台的网络应用程序。
JavaApplet嵌入HTML语言,通过主页发布到Internet。
网络用户访问服务器的Applet时,这些Applet从网络上进行传输,然后在支持Java的浏览器中运行。
由于Java语言的安全机制,用户一旦载入Applet,就可以放心地来生成多媒体的用户界面或完成复杂的计算而不必担心病毒的入侵。
虽然Applet可以和图像、声音、动画等一样从网络上下载,但它并不同于这些多媒体的文件格式,它可以接收用户的输入,动态地进行改变,而不仅仅是动画的显示和声音的播放。
(三)丰富的类库Java提供了大量的类以满足网络化、多线程、面向对象系统的需要。
1.语言包提供的支持包括字符串处理、多线程处理、例外处理、数学函数处理等,可以用它简单地实现Java程序的运行平台。
2.实用程序包提供的支持包括哈希表、堆栈、可变数组、时间和日期等。
3.输入输出包用统一的"流"模型来实现所有格式的I/O,包括文件系统、网络、输入
4.低级网络包用于实现Socket编程。
5.抽象图形用户接口包实现了不同平台的计算机的图形用户接口部件,包括窗口、菜单、滚动条、对话框等,使得Java可以移植到不同平台的机器。
6.网络包支持Internet的TCP/IP协议,提供了与In-ternet的接口。
它支持URL连接,WWW的即时访问,并且简化了用户/服务器模型的程序设计。
(四)Java和C、C++对于变量声明、参数传递、操作符、流控制等,Java使用了和C、C++相同的传统,使得熟悉C、C++的程序员能很方便地进行编程。
同时,Java为了实现其简单、鲁棒、安全等特性,也摒弃了C和C++中许多不合理的内容。
1.全局变量
Java程序中,不能在所有类之外定义全局变量,只能通过在一个类中定义公用、静态的变量来实现一个全局变量。
例如:
ClassGlobalVar{publicstaticglobal_var;}
在类GlobalVar中定义变量global_var为publicstatic,使得其它类可以访问和修改该变量。
Java对全局变量进行了更好的封装。
而在C和C++中,依赖于不加封装的全局变量常常造成系统的崩溃。
2.Goto
Java不支持C、C++中的goto语句,而是通过例外处理语句try,Catch,final等来代替C、C++中用goto来处理遇到错误时跳转的情况,使程序更可读且更结构化。
3.指针
指针是C、C++中最灵活,也是最容易产生错误的数据类型。
由指针所进行的内存地址操作常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C++中的私有成员,从而破坏安全性,造成系统的崩溃。
而Java对指针进行完全的控制,程序员不能直接进行任何指针操作,例如把整数转化为指针,或者通过指针释放某一内存地址等。
同时,数组作为类在Java中实现,良好地解决了数组访问越界这一C、C++中不作检查的错误。
4.内存管理
在C中,程序员通过库函数malloc()和free()来分配和释放内存,C++中则通过运算符new和delete来分配和释放内存。
再次释放已释放的内存块或未被分配的内存块,会造成系统的崩溃;同样,忘记释放不再使用的内存块也会逐渐耗尽系统资源。
而在Java中,所有的数据结构都是对象,通过运算符new为它们分配内存堆。
通过new得到对象的处理权,而实际分配给对象的内存可能随程序运行而改变,Java对此自动地进行管理并且进行垃圾收集,有效防止了由于程序员的误操作而导致的错误,并且更好地利用了系统资源。
5.数据类型的支持
在C、C++中,对于不同的平台,编译器对于简单数据类型如int,float等分别分配不同长度的字节数,例如:
int在IBMPC中为16位,在VAX-11中为32位,这导致了代码的不可移植性,但在Java中,对于这些数据类型总是分配固定长度的位数,如对int型,它总占32位,这就保证了Java的平台无关性。
6.类型转换
在C、C++中,可以通过指针进行任意的类型转换,常常带来不安全性,而Java中,运行时系统对对象的处理要进行类型相容性检查,以防止不安全的转换。
7.头文件
C、C++中用头文件来声明类的原型以及全局变量、库函数等,在大的系统中,维护这些头文件是很困难的。
而Java不支持头文件,类成员的类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止对私有成员的操作。
同时,Java中用import语句来与其它类进行通讯,以便使用它们的方法。
8.结构和联合
C、C++中的结构和联合中所有成员均为公有,这就带来了安全性问题。
Java中不包含结构和联合,所有的内容都封装在类中。
9.预处理
C、C++中用宏定义来实现的代码给程序的可读性带来了困难。
在Java中不支持宏,它通过关键字final来声明一个常量,以实现宏定义中广泛使用的常量定义
1.1.3JAVA语言在网络上的应用
Java程序可以获取网络上结点的图象、声音、HTML文档及文本等资源,并可以对获得的资源进行处理。
例如Java程序可以每隔一定时间读取某结点提供的最新数据,并以图表的形式显示出来。
在编程处理上,一般先生成一个URL类型的对象,然后用Java中相应的方法(method)获取该对象所代表的资源。
下面列举一个Java从网络上获取图象的的方法以说明。
JavaApplet可以直接从网络上结点获取图象并显示出来,Java提供了如下方法可以创建对应于其他结点的图象:
getImage(newURL(字符串))
其使用格式可有两种:
Stringurl=“结点URL”;
Imageimage;
try{
image=getImage(newURL(url));
}
catch(Exceptione){
System.out.println(“Can’topentheURL“);}
或
URLimgur=null;
Imageimage;
try{
imgur=newURL(“结点URL“);
}catch(MalformedURLExceptione){
System.out.println(“Can’topentheURL“);
}
image=getImage(imgur);
前一种格式用“newURL(url)”生成URL对象,并直接作为getImage的参数,后一种格式先用“newURL(url)”生成一个URL对象,再传给getImage,两种格式本质上是一样的。
以上仅是Java在客户端应用的一些方面,目前,Java更广泛的应用是在服务器端。
1.2JavaBeans技术
什么是JavaBeans?
JavaBeans就是Java的可重用组件技术。
ASP通过COM来扩充复杂的功能,如文件上载、发送email以及将业务处理或复杂计算分离出来成为独立可重复利用的模块。
JSP通过JavaBeans实现了同样的功能扩充。
JSP对于在Web应用中集成JavaBeans组件提供了完善的支持。
这种支持不仅能缩短开发时间(可以直接利用经测试和可信任的已有组件,避免了重复开发),也为JSP应用带来了更多的可伸缩性。
JavaBeans组件可以用来执行复杂的计算任务,或负责与数据库的交互以及数据提取等。
在实际的JSP开发过程中,读者将会发现,和传统的ASP或PHP页面相比,JSP页面将会是非常简洁的,由于JavaBeans开发起来简单,又可以利用Java语言的强大功能,许多动态页面处理过程实际上被封装到了JavaBeans中。
2.3.3TCP/IP协议介绍
(1)IP、TCP协议的特点:
TCP/IP(TransmissionControlProtocol/InternetProtocol)是传输控制协议/网际协议的缩写,TCP/IP是当今网络互联的核心协议。
TCP/IP协议的体系结构共有四个层次,即应用层、传输层、网络互联层和网络接口层。
IP协议的作用:
第一,它是网络层的协议,提供互联网上数据传输的统一格式。
第二,提供不可靠的无连接的服务。
第三,定义了互联网上的传输数据的基本单元,提供了供路由选择的信息,没有差错校验和处理的机制。
TCP协议的功能:
差错控制——可靠性、面向连接、分段(Segment)、端口号。
TCP是传输控制协议,是面向连接的提供了一种可靠的传输服务,它用三次握手和滑动窗口机制来保证传输的可靠性,及进行流量控制。
TCP/IP协议具有以下特点:
1、协议标准具有开放性,其独立于特定的计算机硬件及操作系统,可以免费使用。
2、统一分配网络地址,使得每个TCP/IP设备在网络中都具有唯一的IP地址。
3、实现了高层协议的标准化,能为用户提供多种可靠的服务。
(2)TCP/IP协议进行传输数据传输的过程:
应用程序为了传输数据会调用TCP,将数据和对应的参数传给TCP,将TCP数据包封装在IP包内,通过网络送给目的TCP。
接收方TCP在接收到数据后通知上层应用程序,TCP将保证接收数据的正确性。
在实现TCP的主机上,TCP可以被看成是一个模块,和文件系统区别不大,TCP也可以调用一些操作系统的功能,TCP不直接和网络打交道,控制网络的任务由专门的设备驱动模块完成。
TCP只是调用IP接口,向TCP提供所有TCP需要的服务。
(3)端口号:
有的时候,一个ip地址不能完整的标识一台服务器,这是应为一台物理性的计算机同时运行着多个应用程序,这就需要我们来区别同一台机子上的不同的服务,所以就在传输层和应用层上设置接口,就是端口。
端口实际是一个16位长的地址,他的范围是0~65535之间,其中0~1023是熟知端口,主要是给提供服务的应用程序使用,这些端口是所有应用进程都只道的,1024~65535为一般端口,也称动态端口、连接端口,用来随时分配要求通信的个客户端应用程序。
在数据传输过程中,各种服务器不断的检测分配给他的端口,一边发现要求和他通信的客户端。
2.3.4Socket简介
Socket,简称套接字,用于实现网络上客户和服务器之间的连接。
也就是说网络上两个或两个以上双工方式通信的进程之间总有一个连接,这个连接的端点成为套接字,套接字是在比较低的层次上通信的。
具体的说:
一个服务器应用程序一般侦听一个特定的端口等待客户端的连接请求,当一个连接请求到达时,客户端和服武器端建立一个通信连接,在连接过程中,客户端被分配一个本地端口与一个socket建立连接,客户端通过写socket来通知服务器,以读socket中的信息,类似的服务器也获得一个本地端口,它需要一个新的端口号来侦听原始端口上的其他连接请求。
服务器也通过它的本地端口连接一个socket,通过读写和客户端通信。
Socket程序的工作过程:
1、建立Socket连接:
在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接通道。
2、数据通信:
利用虚拟连接通道传送数据信息进行通道。
3、关闭:
通信结束时,再将所建的虚拟连接拆除。
具体如下:
服务器
三次握手:
第一次握手:
原主机发送一个带有本次连接的序号的请求的一个数据帧
第二次握手:
目的主机收到请求后,如果同意连接,则发回一个带有一个本次连接序号和源端机连接序列号的确认。
第三此握手:
源端机收到含有两次初始序列号的应答后,在向目的主机发送一个带有两次连接的序列号的确认。
具体过程如下
3系统总体结构设计
3.1基本简介
聊天系统不外乎两个方面,服务器端和客户端。
简单分析一下两个方面所要完成的任务,对设计这个程序来说,等于完成了一半。
首先来看一下服务器端的任务:
1.服务器端应当建立一个ServerSocket,并且不断进行侦听是否有客户端连接或者断开连接(包括判断没有响应的连接超时)。
2.服务器端应当是一个信息发送中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。
以上就是服务器端最主要的两个任务。
不难看出,服务器端的任务并不复杂。
客户端应该完成的工作包括:
1.与服务器端建立通信通道,向服务器端发送信息。
2.接收来自服务器的信息。
相对服务器而言,客户端的任务更加简单,有了以上的简单分析,可以知道,解决上述四个问题,即完成了该聊天系统的核心。
3.2系统功能模块设计
3.2.1数据库设计
1)用户表设计
字段名
字段类型
长度
是否能为空
备注
用户ID
Varchar
6
否
主键,PK
用户名
Varchar
50
用户名
用户密码
Varchar
100
登录密码,初始值为0000
性别
Varchar
3
性别
头像ID
Integer
年龄
Integer
电话
Varcahr
20
地址
Varchar
100
注册时间
Datetime
是否在线
Integer
所属部门ID
Varchar
3
否
外键,FK
2)部门表设计
字段名
字段类型
长度
是否能为空
备注
部门ID
Varchar
3
否
主键,PK
部门名称
Varchar
50
备注
Varchar
100
3)消息表设计
字段名
字段类型
长度
是否能为空
备注
消息ID
Integer
否
主键,PK
消息来自
Varchar
15
消息目的
Varchar
15
消息内容
Varchar
500
消息类型
Varchar
20
消息状态
Varchar
10
消息来自ID
Varchar
15
否
外键,FK
消息发送时间
Varchar
30
否
3.2.2ER图
3.2.3功能模块介绍
聊天系统工作原理图
(1)服务器程序模块
服务器与客户间通过套接口Socket(TCP)连接。
在java中使用套接口相当简单,JavaAPI为处理套接口的通信提供了一个类.Socket,使得编写网络应用程序相对容易。
服务器采