基于java的网络聊天室服务器端大学论文.docx
《基于java的网络聊天室服务器端大学论文.docx》由会员分享,可在线阅读,更多相关《基于java的网络聊天室服务器端大学论文.docx(32页珍藏版)》请在冰豆网上搜索。
基于java的网络聊天室服务器端大学论文
河北农业大学
本科毕业论文(设计)
题目:
基于java的网络聊天室--服务器端
目录
1绪论2
1.1背景及意义1
1.2研究现状1
2系统分析3
2.1实现技术3
2.2系统分析6
3系统设计7
3.1系统功能结构7
3.2系统业务流程8
3.3系统实现原理8
3.4模块化设计9
3.5数据库设计9
3.6开发环境与运行环境10
3.7客户端结构10
3.8服务器端结构11
4系统实现11
4.1新用户注册模块11
4.2登录模块13
4.3消息通信模块:
与显示的在线好友间通信15
4.4服务器端17
5总结22
参考文献23
致谢23
1绪论
1.1背景及意义
网络通信在当今信息社会中起着不可或缺的作用,人们可以利用网络通信技术进行即时的信息交流。
比如QQ聊天工具,它就是利用网络通信技术开发的一款众所周知的网络聊天工具。
目前,信息交流是互联网提供的主要内容,网络通信系统有多重实现方式,类似ICQ属于一种点对点的聊天系统;还有一种是基于Socket的集中式聊天系统,这种聊天系统需要登录统一的聊天服务器。
当今主流的聊天工具有QQ,ICQ,MSNMessage等,国内最热门的当属QQ,腾讯QQ
是由深圳市腾讯计算机系统公司开发的,基于Internet的即时寻呼软件。
您可以使用QQ和好友用户进行交流、信息即时发送、即时回复、收发即时,功能全面。
QQ支持显示朋友在线信息、即时传送信息、即时交谈、即时发送文件和网址。
网络聊天以成为上网族的一种普遍的休闲方式,可以毫不夸张的说,全国的网民中没人不知道QQ聊天软件,所以,一款好的即时通信聊天软件成了上网的必备工具之一。
网上有很多的聊天软件可供网民们选择,各有不同的特点和长处,可满足不同人的各种需求。
局域网聊天工具,是在局域网内部使用的,用户之间用来交流的一个工具,一般都具有文本聊天和文件传输功能。
局域网聊天软件因其使用简单,系统资源消耗少等优点,成为各企事业单位等的局域网内广泛应用的软件之一。
1.2研究现状
目前国内外做聊天系统的公司很多,产品也琳琅满目,国内有诸如腾讯QQ、新浪UC等,国外有著名的MSN等。
本人取最具代表性的QQ和MSN进行了一些研究,作为我开发聊天系统的准备。
腾讯无疑是国内即时通讯市场的霸主,自从99年进入即时通讯领域并迅速占市场之后,其在国内用户数量始终高居榜首,即使近几年面对微软MSN的强大攻势,腾讯QQ的时常占有率依然稳步增长。
腾讯的成功与其对QQ的不断创新和完善是分不开的。
参考了许多网络上的资料,以及自己通过观察腾讯QQ运行时的各种细节。
可以确定腾讯QQ是以多服务器提供服务、服务器总控客户端、客户端之间UDP直连通信的。
并且在两个客户端之间不能建立直连的情况下,才由服务器进行中转通信。
其模型如图1.1:
图1.1腾讯QQ服务器-客户端模型
与腾讯QQ不同,微软的MSNMessenger只使用了TCP作为传输层通信协议,所有客户端与服务器进行连接,然后通过与服务器的TCP连接进行中转通信。
其模型如图1.2:
图1.2MSN服务器-客户端模型
腾讯使用的模型中,服务器主要处理客户端各种状态的控制,可以极大减轻服务器的处理压力,但其内部协议和实现复杂度都较高。
而MSNMessenger所有数据都要经过服务器,服务器压力可想而知(难怪平时很少见到使用MSN进行语音视频聊天的)。
2系统分析
2.1实现技术
2.1.1Java语言
Java,是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由Sun公司的詹姆斯·高斯林(JamesGosling)等人于1990年代初开发。
它最初被命名为Oak,目标设置在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。
由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。
就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,在1995年5月以“Java”的名称正式发布了。
Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
Java编程语言的风格十分接近C++语言,Java继承了C++语言面向对象技术的内核,舍弃了C++语言中容易引起错误的指针(以引用取代)、运算符重载(operatoroverloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间。
在JavaSE1.5版本中Java又引入了泛型编程(GenericProgramming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
Java不同于一般的编译运行计算机语言和解释执行计算机语言。
它首先将源代码编译成字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。
不过,这同时也在一定程度上降低了Java程序的运行效率。
但在J2SE1.4.2发布后,Java的运行速度有了大幅提升。
与传统程序不同Sun公司在推出Java之际就将其作为一种开放的技术。
全球数以万计的Java开发公司被要求所设计的Java软件必须相互兼容。
“Java语言靠群体的力量而非公司的力量”是Sun公司的口号之一,并获得了广大软件开发商的认同。
这与微软公司所倡导的注重精英和封闭式的模式完全不同。
Sun公司对Java编程语言的解释是:
Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。
Java语言有以下特点:
简单(Simple):
指的是去除了C/C++中较少使用或可能不安全的功能,例如指标,运算子重载,多重继承等。
物件导向的(Object-oriented):
利用OOP的三种基本特性:
PIE(多型,继承,封装),来设计出可重複使用的元件,使系统有弹性易于维护。
网路的(Network-Savvy):
提供容易使用的API来撰写网路程式。
直译式的(Interpreted):
bytecode在JVM上执行时,JIT负责转换为机器码。
稳健的(Robust):
捨弃了对记忆体的指标运作。
安全性(Secure):
资源回收处理(GarbageCollection)由JVM自行作记忆体管理,例外处理(Exception)可预防突发错误的产生。
结构中立(ArchitectureNeutral):
程式执行在虚拟机器上。
可携的(Portable):
Writeonce,runanywhere指的是由JVM与不同的作业系统沟通。
高效率的(HighPerformance):
利用HotSpot,JIT技术改善效能。
多执行绪的(Multithreaded):
Java程序可发出多隻并行的轻量化行程。
动态的(Dynamic):
Java程式执行时动态的连结类别库。
Java语言的优良特性使得Java应用具有无比的健壮性和可靠性,这也减少了应用系统的维护费用。
Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。
Java的编译一次,到处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。
特别是Java企业应用编程接口(JavaEnterpriseAPIs)为企业计算及电子商务应用系统提供了有关技术和丰富的类库。
2.1.2Java与Internet
Java语言取得成功的领域之一就是网络(其他语言)数页代码---->(Java)一条语句。
TCP/IP(传输控制协议/网间协议)是internet的主要协议,定义了计算机和外设进行通信所使用的规则(应用层,传输层,网络层,链路层)。
大多数基于internet的应用程序被看作TCP/IP协议的上一层,如:
ftp,http,smtp,pop3,telnet,nntp等。
IP地址:
TCP/IP网络中的每台计算机都有唯一的地址--IP地址。
在Java中,有一个用来存储internet地址的类叫InterAddress。
Java提供的网络功能有三大类:
URL,Socket,Datagram。
1、URL是三大功能中最高级的一种,通过URLJava程序可以直接送出或读入网络上的数据。
2、Socket是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道。
3、Datagram是更低级的网络传输方式,它把数据的目的纪录在数据包中,然后直接放在网络上。
2.1.3Socket编程
1)TCP/IP协议
TP/IP(TransmissionControlProtocol/InternetProtocol)是传输控制协议/网际协议的缩写,TCP/IP是当今网络互联的核心协议。
TCP/IP协议是聊天工具在建立连接下使用的协议,该协议是网络中使用的通讯协议,包括传输控制协议和网际协议,TCP/IP协议是网络互连的标准协议,可使不同环境下不同节点之间彼此通信,是连入互联网的所有计算机在网络上进行各种信息交换和传输所必须采用的协议。
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为一般端口,也称动态端口、连接端口,用来随时分配要求通信的各个客户端应用程序。
在数据传输过程中,各种服务器不断的检测分配给它的端口,一边发现要求和它通信的客户端。
4)Socket通信机制
Socket,简称套接字,用于实现网络上客户和服务器之间的连接。
也就是说网络上两个或两个以上双工方式通信的进程之间总有一个连接,这个连接的端点称为套接字,套接字是在比较低的层次上通信的。
Socket所完成的通信时一种基于连接的通信,即在通信开始之前先由通信双方确认身份并建立一条专用的虚拟连接通道,然后他们通过这条通道传送数据信息进行通信,当通讯结束时再将原先所建立的连接断开。
Socket程序的工作过程:
1、建立Socket连接:
在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接通道。
2、数据通信:
利用虚拟连接通道传送数据信息。
3、关闭:
通信结束时,再将所建的虚拟连接断开。
三次握手:
第一次握手:
原主机发送一个带有本次连接的序号的连接请求。
第二次握手:
目的主机收到请求后,如果同意连接,则发回一个带有一个本次连接序号和源端机连接序列号的确认。
第三此握手:
源端机收到含有两次初始序列号的应答后,再向目的主机发送一个带有两次连接的序列号的确认。
具体过程如下:
主机A主机B
ACK=1,SYN=1,SEQ=
aaaaaaaaaa
SYN=1,SEQ=
图2.1三次握手图
2.2系统分析
2.2.1可行性分析
经济可行性:
开发此网络通讯系统所需的硬件和软件环境(Myeclipse开发工具;数据库SQLServer),可以从相关网站免费下载。
操作可行性:
此通信系统具备友好的用户界面,使用方便,快捷,操作简单易于维护,易于被用户接受,用户只需熟悉操作计算机,和对此系统做简单的了解可方便使用。
技术可行性:
:
Java技术日趋成熟,java的平台无关性使得用java的应用程序不用修改就可在不同的软硬件平台上运行,它支持数据分布和操作分布着两种分布性。
Java提供了一整套网络类库,开发人员可以利用类库进行网络程序设计,方便实现java的分布式特性。
另外java还支持多线程。
Java提供了一个类thread,由它负责启动、运行、终止线程,并可检查线程状态。
利用java的多线程编程接口,开发人员可以方便的写出至此后多线程的应用程序,提高程序执行效率。
开发软件环境:
winxp,Sqlserver,Myeclipse。
2.2.2系统功能需求分析
根据用户对聊天工具的要求,可分为以下几点:
(1)操作简单方便、界面简洁美观;
(2)可以在局域网实现文字和文件的传输;
(3)可以实现用户的注册、登录和注销;
(4)程序启动之后就能看到当前哪些用户在线,哪些可以与之进行对等通信。
可以实现局域网聊天;
(5)一旦有某个网内的机器上线或下线了,要有即时通知,并能及时更新用户界面中的用户列表;
(6)当单击用户列表项的时候,直接在聊天对话框聊天,发送聊天信息;
(7)当有远程用户向本机发送文件的时候,弹出一个消息提示,用户可选择接收或者拒绝;
(8)文件传输过程中,应该有当前传输状态提示,并作为当前网络状态的一种反馈;
(9)为用户提供一个简单的聊天记录保存功能。
聊天系统包括服务器端和客户端。
服务器端的主要任务:
服务器端应当建立一个
ServerSocket,并且不断进行监听是否有客户端连接或者断开连接(包括判断没有响应的连接超时);服务器端应当是一个信息发送中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。
客户端主要完成的工作包括:
与服务器端建立通信通道,向服务器端发送信息;接收来自服务器的信息。
3系统设计
3.1系统功能结构
本系统中主要包括两个部分:
服务器端和客户端。
(1)服务器端的功能包括:
验证登录:
检查登陆信息是否正确,并向客户端返回登陆信息,如信息正确,就将在线用户发给该用户,并将该用户的状态发给各在线用户,同时在服务器端显示出来。
处理注册信息:
用户提交注册信息后,自动验证是否重名,如果重名则返回提示,如果不重名则将信息加入数据库。
处理用户发送信息:
服务器监控聊天内容,服务器过滤非法内容。
发布系统消息:
将此用户上线、下线消息发给各客户端,并在服务器端显示在线用户信息。
保存聊天记录:
在接收到用户保存聊天记录申请的同时,自动保存聊天记录为文本文件。
保存服务器日志。
(2)客户端的功能包括:
用户登录:
建立与服务器的连接并登录,能显示登录错误信息。
用户注册:
建立与服务器连接并提交注册信息,注册成功后自动登录。
界面显示:
登录成功后,自动显示在线用户列表。
发送消息:
选择要发送对象后,可以发送文本消息或者文件。
发送信息时,可以选择私聊,即其他人看不到信息。
接收消息:
收到其他用户消息后,提醒并显示。
接收文件时可以选择接收或拒绝。
聊天记录的保存:
用户下线前自动向服务器发送申请保存聊天记录。
3.2系统业务流程
首先由服务器开启服务,监听局域网中客户端的连接请求,客户端连接后,登录或者处理注册信息,并返回操作结果。
客户端注册或者登录成功后,显示聊天窗体,此时各客户端将自主的监听局域网中的用户,实时更新自己的用户列表并显示,各个客户端之间的信息交流不再通过服务器转发,而是自主通信。
局域网聊天系统的业务流程图如图所示:
图3.1业务流程图
3.3系统实现原理
聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。
因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。
客户与服务器之间用TCP协议连接,客户与客户之间通过服务器转发消息.
其中用到了Socket,它是介于应用程序与硬件之间,并可以提供标准的函数以符合不同的网络硬件规格。
图3.2系统实现原理图
3.4模块化设计
软件模块化设计方法是从计算机实现的角度出发对整个软件进行审核和校验,将整个系统划分为不同的功能模块,实现软件的一个特定功能。
各个功能模块之间具有相对独立性,便于整个软件的设计、实施、维护和扩充。
这种模块化结构设计方法,为整个软件顺利进行奠定了基础。
3.5数据库设计
系统需求主要体现在用户的注册、登录、发送消息、接收消息、聊天记录的保存等方面,而本系统发送消息,接收消息,聊天记录保存均有客户端自主完成,因此不需要体现在数据库中,这样数据库只需存储用户的信息即可。
数据库采用sqlserver,,里面建立了2个表,存储用户包含登录账号和密码的用户信息yonghu表,用户发送消息记录的信息表log表。
表3.1用户的基本信息表
列名
custname
cusPassword
age
sex
email
head
用户名
密码
年龄
性别
电子邮箱
头像
vchar
vchar
vchar
vchar
vchar
vchar
log表字段:
登录用户(id),消息记录,时间
3.6开发环境与运行环境
开发环境:
应用服务器
数据库服务器
系统:
内存2G,硬盘320G
运行环境:
本系统是用Myeclipse工具开发的,所以首先要安装Myeclipse工具。
这次的设计是在windows系统下,要先安装java的jdk来支持Myeclipse的运行。
本系统的安装环境为:
WindowsXP+JDK1.7+Myeclipse8.5.
3.7客户端结构
客户端用来向服务器端发起一个连接,等待服务器的允许接入确认。
若服务器端同意连接请求,接收到服务器的同意连接信号后,开启接收信息线程,并置消息发送事件为Enable,通信双方就可以进行文本聊天了。
若服务器端拒绝连接,则释放Socket连接并关闭网络流。
若已建立连接,当断开连接时,将向对方发送断开信号,然后将释放Socket和网络流,不影响到下一次连接的发起。
图3.3客户端结构图
ChatClient.java为客户端程序启动类,负责客户端的启动和退出。
Login.java为客户端程序登录界面,负责用户帐号信息的验证与反馈。
Register.java为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。
ChatRoom.java为客户端程序聊天室主界面,负责接收、发送聊天内容等。
Windowclose为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。
3.8服务器端结构
图3.4服务器端结构图
ServeFrame.java为服务器端程序界面,负责为服务器的启动提供界面服务。
AppServer.java为服务器端启动界面,负责监听服务器的状态、在线人数、最多在线人数、服务器名称、访问协议、服务器IP、服务器端口以及用户信息的管理、日志的保存。
Connection.java是连接服务器和客户端的桥梁,主要负责将客户端的信息传送给服务器,并将服务器端的信息反馈给客户端,即所谓的“三次握手”,也是Socket编程的重要部分。
WordFilter.java负责将聊天过程中不合法的文字语句等过滤掉,返回合法内容。
4系统实现
4.1新用户注册模块
4.1.1注册流程
当服务器收到用户注册请求后,开始接收该客户传递的消息,如用户的昵称、密码、性别、头像、个人资料等信息。
接收完毕后,服务器通过jdbc与后台数据库连接,向数据库添加记录。
注册事件处理是客户端注册的主要部分。
Java事件包括键盘事件,鼠标事件和按钮事件,而所用到的是鼠标事件就是点击鼠标时,系统会调用监听器。
注册流程图:
图4.1注册流程图
4.1.2注册界面
本界面要填写的项目包括:
用户名,密码,邮件地址,需要选择的项目包括:
性别,头像。
本界面主要负责将用户的信息包装成一个customer对象。
注册按钮一旦被点击,就会试图创建一个与服务器端的连接。
连接创建成功就会将填写的信息发送到服务器端。
图4.2注册界面
4.1.3源代码
publicvoidregister()
{
Register_Customerdata=newRegister_Customer();
data.custName=txtUserName.getText();
data.custPassword=pwdUserPassword.getText();
data.age=txtAge.getText();
data.sex=rbtnMale.isSelected()?
"男":
"女";
data.email=txtEmail.getText();
data.head=comboBox.getSelectedItem().toString();
try
{
SockettoServer;
toServer=newSocket(strServerIp,1001);
ObjectOutputStreamstreamToServer=newObjectOutputStream(toServer.getOutputStream());
streamToServer.writeObject((Register_Customer)data);
BufferedReaderfromServer=newBufferedReader(newInputStreamReader(toServer.getInputStream()));
Stringstatus=fromServer.readLine();
JOptionPaneop=newJOptionPane();
op.showMessageDialog(null,status);
if(status.equals(data.custName+"注册成功"))
{txtUserName.setText("");
pwdUserPassword.setText("");
pwdConfirmPass.setText("");
txtAge.setText("");
txtEmail.setText("");
streamToServer.close();
fromServer.close();
}
catch(Exceptione){
Syetem.out.println(e);
}
}
4.2登录模块
4.2.1登录界面
用户登录首先要与服务器连接,服务器的连接是在Connection类中实现。
本界面需要填写的有两个,一个是用户名,一个是密码。
在客户端,用户输入用户名和密码,然后建立与服务器的连接,告诉服务器我要登录,服务器收到后,开始通过jdbc读取数据库,然后与用户输入的信息比较,否则返回错误。
图4.3登录界面
4.2.2源代码
publicvoidlogin()