基于TCPIP协议的网络聊天程序服务端设计讲解.docx
- 文档编号:26017721
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:28
- 大小:141.49KB
基于TCPIP协议的网络聊天程序服务端设计讲解.docx
《基于TCPIP协议的网络聊天程序服务端设计讲解.docx》由会员分享,可在线阅读,更多相关《基于TCPIP协议的网络聊天程序服务端设计讲解.docx(28页珍藏版)》请在冰豆网上搜索。
基于TCPIP协议的网络聊天程序服务端设计讲解
基于TCP/IP的网络聊天程序服务端设计
摘要本课程设计的目标是基于Eclipse技术实现一个点对点通信程序,其工作机制模仿即时通信软件的基本功能,包括登陆,上线,传递信息等等。
采用TCP/IP原理,分别为客户端和服务器端完成基本数据配置,实现网络聊天功能。
在设计过程中,主要采用Eclipse编程环境,使用Java语言进行程序的编写,程序通过调试运行并且经过完善后,初步实现了设计的目标,能很好地在局域网环境实现即时聊天。
关键字Java语言;Eclipse;TCP/IP;套接字;C/S工作模式
1前言
21世纪是网络的世界,现在网络发展的不可估量了,它可以包括我们生活中的方方面面,小到上网购物、查找资料,大到网上理财、网上会议,可以说网络把我们的世界变小了,即使在天涯海角,有网络的地方我们就可以随时联系。
最简单的形式就是进行网络聊天了,这个很简单的聊天工具,可以随时拉近你我的距离[1]。
本设计将基于TCP/IP协议和局域网环境,使用Java和Eclipse实现一个即时聊天程序。
1.1课程设计的目的
本课程设计主要采用Eclipse编程环境,使用Java语言编写程序,通过调试运行并且经过完善后,初步实现了设计的目标,能很好地在局域网环境实现即时聊天。
1.2Java简介
Java是由SunMicrosystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。
用Java实现的HotJava浏览器(支持Javaapplet)显示了Java的魅力:
跨平台、动态的Web、Internet计算。
从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Javaapplet。
另一方面,Java技术也不断更新。
Java平台由Java虚拟机(JavaVirtualMachine)和Java应用编程接口(ApplicationProgrammingInterface、简称API)构成。
Java应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。
在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。
现在Java平台已经嵌入了几乎所有的操作系统。
这样Java程序可以只编译一次,就可以在各种系统中运行。
Java应用编程接口已经从1.1x版发展到1.2版。
目前常用的Java平台基于Java1.5,最近版本为Java1.7。
Java是一种简单的,面向对象的,分布式的,健壮的,安全的,体系结构中立的,可移植的,解释型的,高性能的,多线程的,动态的语言。
Java语言的优良特性使得Java应用具有无比的健壮性和可靠性,这也减少了应用系统的维护费用。
Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。
Java的编译一次,到处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。
特别是Java企业应用编程接口(JavaEnterpriseAPIs)为企业计算及电子商务应用系统提供有关技术和丰富的类库[5]。
1.3Eclipse简介
Eclipse是一个开放源代码的、基于Java的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentTools,JDT)。
Eclipse最初是由IBM公司开发的替代商业软件VisualAgeforJava的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会(EclipseFoundation)管理。
Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。
它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成——EclipsePlatform、JDT、CDT和PDE.JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,EclipsePlatform则是一个开放的可扩展IDE,提供了一个通用的开发平台。
它提供建造块和构造并运行集成软件开发工具的基础。
EclipsePlatform允许工具建造者独立开发与他人工具无缝集成的工具从而无须分辨一个工具功能在哪里结束,而另一个工具功能在哪里开始。
EclipseSDK(软件开发者包)是EclipsePlatform、JDT和PDE所生产的组件合并,它们可以一次下载。
这些部分在一起提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到EclipsePlatform中的工具。
EclipseSDK由Eclipse项目生产的工具和来自其它开放源代码的第三方软件组合而成。
Eclipse项目生产的软件以CPL发布,第三方组件有各自自身的许可协议
Eclipse平台体系结构主要由5部分组成,分别是平台运行库、工作区、工作台、团队支持和帮助。
整个Eclipse体系结构如图1-1所示:
图1-1Eclipse体系结构
1.4基本设计任务
(1)熟悉TCP/IP协议以及套节字编程原理。
(2)熟悉Eclipse编程环境及Socket/ServerSocket编程方法。
(3)理解C/S工作模式。
(4)实现一个局域网环境下的即时通信程序服务端,可通过telnet方式作客户端测试。
2需求分析
2.1功能需求分析
(1)用户端之间的信息发送,本程序需要实现的最基本的功能。
用户在界面上选择需要对话的服务器IP,并将自己需要发送的信息填入相应的对话框中,点击发送按钮后,可以将信息正常的发送给相应的其它用户,这个过程中的客户端与客户端之间使用点对点发送信息,预计利用TCP/IP协议,在本程序中共需要1个端口。
(2)在线用户主机IP列表的维护。
在用户发送信息之前,需要选择相应的目的地端IP,这也就需要客户端拥有在线用户主机的IP地址,这个在线主机列表的维护是需要客户端定时自动向服务器端发送信息,服务器端收集并维护在线用户列表,再发送回客户端。
(3)在C/S模式中,服务器与客户端是相互依赖的。
在客户端启用以后,需要查看服务器端是否在线,服务器在线才能正常使用客户端,如果服务器不在线,则在检测一定次数以后自动退出客户端程序。
在使用过程中,客户端在指定时间内未向服务器端发送信息的,服务器认为客户端下线;客户端在一定时间内未收到服务器端信息的,认为服务器已经下线,则提示用户并建议退出,在用户一定时间后没有退出的则自动关闭客户端程序。
2.2数据需求分析
(1)客户端之间聊天信息。
在控件上显示时格式化,更易于用户的查看自己发送或接收到的信息。
(2)在线用户列表信息。
服务器端存放在适当的空间中,在发送给客户端时,对信息列表进行格式化,便于客户端提取信息。
(3)客户端向服务器端发送的确认在线信息。
包括客户端刚刚启动时的初始化信息和在使用过程中的确认在线信息。
(4)其它程序内部可能需要设计的数据结构体。
2.3性能需求分析
(1)可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。
在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。
(2)宜操作性,程序简单易懂,容易上手使用。
设计界面是,简化界面的复杂性,模拟QQ等现有即时通讯工具的界面,使用户能很容易看懂并使用。
(3)开发文档易理解,保证以后自己二次开发或他人接手开发时,能够清晰的理解整个系统的设计思路和实现细节。
(4)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。
2.4运行需求分析
(1)用户界面
程序较小,启动速度快,无启动界面。
在本地局域网中使用,所以无需进行用户登录,无需认证界面,启动后的应用界面要清爽,设计要简单明了,要具有较高的易用性。
(2)故障处理
在遇到可预知的故障与情况时,能提示用户并自动退出;在遇到不可预知的故障时能安全退出。
通过以上需求分析可以实现局域网网络聊天设计的目的。
3相关原理分析
3.1TCP/IP参考模型
下面首先介绍OSI参考模型及TCP/IP参考模型。
OSI模型(opensysteminterconnectionreferencemodel,开放系统互连)是基于国际标准化组织(ISO)的建议而发展起来的,它分为如图1所示的七层。
当卫星和无线网络出现以后,现有的协议在和这些网络互联时出现了问题,所以需要一种新的参考体系结构,能无缝地连接多个网络。
这个体系结构就是TCP/IP参考模型。
图3-1TCP/IP参考模型
OSI参考模型可以分为7层。
各层次及相关功能为:
(1)应用层:
包含大量人们普遍需要的协议。
(2)表示层:
用于完成某些特定功能。
(3)会话层:
允许不同机器上的用户之间建立会话关系。
(4)传输层:
实现网络中不同主机上的用户进程之间可靠的数据通信。
(5)网络层:
完成网络中主机间的报文传输。
(6)数据链路层:
如何在不可靠的物理线路上进行数据的可靠传输。
(7)物理层:
完成相邻结点之间原始比特流的传输。
TCP/IP与OSI不同,不包括表示层,会话层。
TCP/IP模型一共有4层。
各层次及功能如下:
(1)应用层:
处理高层协议。
(2)传输层:
在源结点和目的结点的两个进程实体之间提供可靠的,端到端的数据传输。
(3)互连网层:
处理上层发送请求,处理输入数据报,处理ICMP报文。
(4)网络接口层:
涉及分组与网络接口[3]。
因特网在传输层有两种主要的协议:
一种是面向连接的协议,一种是无连接的协议。
传输控制协议TCP是(transmissioncontrolprotocol,传输控制协议)专门用于在不可靠的因特网上提供可靠的、端对端的字节流通信的协议。
通过在发送方和接收方分别创建一个称为套接字的通信端口就可以获得TCP服务。
所有的TCP连接均是全双工的和点到点的。
3.2TCP的建立
TCP实体所采用的基本协议是滑动窗口协议。
当发送方传送一个数据报时,它将启动计时器。
当该数据报到达目的地后,接收方的TCP实体向回发送一个数据报,其中包含有一个确认序号,它等于希望收到的下一个数据报的顺序号。
如果发送方的定时器在确认信息到达之前超时,那么发送方会重发该数据报[2]。
建立一个TCP连接,需要三次握手,连接才能建立起来。
如图3-2所示:
ESTABLISHED
图3-2三次握手
握手过程的第一个段的代码位设置为SYN,序列号为x,表示开始一次握手。
接收方收到这个段后,向发送者回发一个段。
代码位设置为SYN和ACK,序列号设置为y,确认序列号设置为x+1。
发送者在受到这个段后,知道就可以进行TCP数据发送了,于是,它又向接收者发送一个ACK段,表示,双方的连接已经建立。
在完成握手之后,就开始正式的数据传输了。
通信完结束后,就要释放连接了.有客户方请求释放连接,被动方接到信号后,给客户端发出一个确认信号,告知已经收到它的信息。
如果服务器端没有信息发送的话,就给客户端发送一个信息,告知自己也没有信息发送了,客户端此时回应信息,到此,连接就彻底结束了。
上面握手段中的序列号都是随机产生的[4]。
3.3TCP传输原理
TCP协议在IP协议之上。
与IP协议提供不可靠传输服务不同的是,TCP协议为其上的应用层提供了一种可靠传输服务。
这种服务的特点是:
可靠、全双工、流式和无结构传输。
它是通过一下步骤来实现可靠传输的:
TCP协议使用了一个叫积极确认和重发送(positiveacknowledgementwithretransmission)的技术来实现这一点的。
接收者在收到发送者发送的数据后,必须发送一个相应的确认(ACK)消息,表示它已经收到了数据。
发送者保存发送的数据的记录,在发送下一个数据之前,等待这个数据的确认消息。
在它发送这个数据的同时,还启动了一个记时器。
如果在一定时间之内,没有接收到确认消息,就认为是这个数据在传送时丢失了,接着,就会重新发送这个数据[4]。
3.4套接字的客户端
所谓的客户客户端/服务器。
是一种能够在基于网络环境的分布处理过程中,使用基于连接的网络通信模型。
该通信模型首先在客户机和服务器之间定义一套通信协议,并创建一个Socket类,利用这个类来建立一条可靠的链接;然后,客户端/服务器再在这条连接上可靠地传输数据。
客户端发出请求,服务器发出请求,服务器监听来自客户机的请求,并为客户端提供相应服务。
利用Socket类,我们可以轻松地实现网路客户端程序的编写,Socket类的一些常用的方法汇总如下:
getLocalAddress()
读取套接字对象的本地地址。
getLocalPort()
读取套接字所使用的本地端口号。
getlnputStream()
得到一个输入流。
getOutputStream()
得到一个输出流。
通常情况下,客户端只要能够顺序地处理服务器程序的响应就可以了,因此客户端程序通常不用使用多线程。
3.5C/S模式
由于Eclipse支持多种协议上的网络程序开发,比如TCP、UDP、和IP等等。
由于这次课程设计是实现点到点的可靠连接,所以在此使用TCP连接方式。
在这个连接中,双方分为客户和服务器,他们各自的功能不同。
客户机一方,TCP/IP应用程序功能如下:
(1)打开通信信道(申请一套接字),并连接到服务器在主机的保留端口,该端口对应服务器的TCP/IP进程。
(2)向服务器发出请求报文,等待接收应答。
(3)从服务器方收到最终应答结果,或在不再请求时关闭信道并终止客户机进程。
服务器一方,TCP/IP应用程序动作如下:
(1)打开通信信道(申请一套接字),通知本地主机在某一保留端口接收客户机请求。
(2)等待客户请求到达指定端口。
(3)接收到请求,启动一新进程处理用户请求,同时释放旧进程以响应新的客户请求,一旦服务完成,关闭新进程与客户的通信链路。
(4)继续等待客户机请求。
(5)如果不想响应客户机请求,关闭服务器进程[3]。
综上所述,TCP/IP应用中的服务器程序必须先于客户机进程启动,直到对客户机的响应结束或强迫终止。
其面向连接的应用程序流程图如图3-3所示:
图3-3C/S模式
4总体设计
在网络越来越普及的今天,网上聊天成为人们通信的主要方式,因此产生了基于QQ聊天的一些软件,通过编写相关程序实现网络聊天设计。
下面主要讲述聊天室的总体设计过程。
聊天室的总体设计过程比较简单主要是构建设计框图。
,就是当客户端发出信息时,我们将数据写到socket,当对方有数据到达时,我们从socket读出来并显示给客户。
程序关键在于如何监听到有信息到达的过程。
应用程序流程图如下图所示,开始是先创建主窗口,然后初始化窗口,程序下面才开始消息循环处理。
如果没有消息循环的活,直接结束掉这个程序。
如果有循环的话,要判断这个窗口消息的内容是哪种类型,然后再进行选择处理方式。
然后依据不同的内容选择“创建控件”,还是要“判断命令”,或是分别处理各种socket的消息。
流程图如图4-1所示:
图4-1聊天室设计架构图
5详细设计
此次设计是利用Java编写一个聊天程序,要求双方能够进行文字聊天,这是基于Java异步选择模式编程实现的一个简单的基于TCP协议的聊天程序,每个程序既可以做TCP主叫方,即客户端(client)。
聊天室详细设计包括服务端设计,客户端设计,多线程设计,线程池设计非堵塞I/O设计。
通过详细设计初步实现基于TCP/IP网络聊天室的设计目的。
5.1服务端设计
服务器包括7个文件,他们的功能如下。
(1)ChatServer,java
包含名为ChatServer的Pulic类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。
调用ServerListen类来实现服务端用户上线与下线的侦听,调用SererReceive类来实现服务端的消息发送。
如图5-1所示:
图5-1服务进行端口监听
(2)Sererlisten,java
该类实现服务端用户上线与下线的侦听。
该类对用户上线和下线的侦听通过调用用户链表类来实现的,当用户上线和下线情况发生变化时,该类会对主类的界面进行相应的修改。
(3)SererReceive,java
该类是实现服务器消息收发的类。
该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的界面上。
如图5-2所示:
图5-2服务器界面显示用户加入
(4)portConf.java
该类继承自JDialog,是用户对服务端侦听端口进行修改配置的类。
(5)Node.Java
用户链表节点类,定义了链表中的用户。
(6)UerLinlList,java
用户链表节点的具体实现类。
该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据用户名查找用户名查找用户、根据索引查找用户这5个方法。
(7)Help.java
服务端程序的帮助类。
5.2客户端的设计
聊天室客户端主要包括5个文件,他们的功能如下:
(1)CharClient,java
包含名为CharClient的public类,其主要功能为定义客户端的界面,添加事件侦听与事件处理。
该类定义了Connect()与DisConnect()方法实现与服务器的连接与断开连接。
当登陆指定的服务器时,调用CharClient类来实现消息收发,同时该类还定义SendMessage()方法来向其他用户发送带有表情的消息或者悄悄话。
如图5-3所示:
图5-3客户端连接服务器的界面
(2)ClintReceive.java
该类时实现服务器与客户端消息收发的类。
(3)ConnectConf,java
该类继承JDialog,是用户对所要连接的服务器IP及侦听端口进行修改配置类。
(4)UserConf.java
该类继承自JDialog,是用户对连接到服务器时所显示的用户名进行修改配置的类。
(5)Help.java
客户端程序的帮助类。
5.3协议的设计
TCP是一种面向连接协议,传输数据比较可靠。
TCP协议中包含了专门的传递保证机制:
当接收方收到发送方来的信息时,会自动向发送方传来的信息时,会自动向发送方发出确认的消息:
发送方只有在接收到该确认消息之后才正式传送数据信息,否则将一直等待直到接收到确认信息为止。
TCP在正式收发数据前,首先必须建立可靠的连接。
一个TCP连接需要经过3次对话才能建立起来,其中的过程非常复杂。
UDP是面向非连接的协议。
传送数据之前不需要建立专门的连接。
直接发送数据就可以了。
基于以上因素。
在本系统中。
聊天信息属于一种短小的信息,一般情况下可以使用UDP发送,但是为了防止数据的丢失,在UDP发送数据失败的情况下可采取TCP在发送一次,而传送的数据才用HTTP协议[5]。
5.4多线程
主要是为了访问同一个资料不需要同步,如读操作,针对方法体内局部变量的写操作也不需要同步,关键是对变量的访问操作,一旦设置了类变量,那么就需要非常小心。
采取两种变量形式如下:
PulicclassTest{
Privateintstate;
Privatevolatilelongstatelong
Privatebyte[]states=null;
PrivateStringstateStrs=null;
PrivatefinalObjectstateObject=null;
PrivateHashMapmap=newHashMap();
PrivateHashMaphashtable=newHashtable();
PublicvoidsetState(intstate){
This.state=this.state+state;
}
5.5线程池
多线程使用时对资源的争夺情况的处理,只要掌握几个基本的原则,在一般情况下使用多线程实现应用处理就没有太大的问题。
线程池的基本原理是基于队列的实现,通过不断的查询队列是否有可以运行的线程。
如果有,就立即运行线程;如果没有,就锁定等待,直到有新的线程加入被触发解锁。
使用PooledExecutur类就可以将自己的线程放入线程池中运行。
举例如下:
PooledExecuturpool=newPooledExecutur(newboundedBuffer(20),100);
Pool.setMinmumPoolSize(10);
Pool.setKeepAliveTime(-1);
5.6非堵塞I/O
传统网络系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作。
过去,当打开一个Socket的I/O通道后,使用下列语句:
Socket=newSocket(url,port);
InputStreamin=socket.getInputStream();
While(!
Thread.interrupted()){
Intbyteread=in.read();
}
6调试
通过前面的设计,基本解决了本系统实现的主要技术问题,下面将就调试的过程及结果展开讨论。
首先根据编程思想编写JAVA程序,包括两个文本文件:
ChatServer.jar和ChatClient.jar。
其中ChatServer.jar是服务端程序,而ChatClient.jar是包含客户端程序。
然后运行程序并进行调试完善。
最终设计目的。
在同一机器或网络上几个不同机器运行聊天程序的两个实例。
双击ChatServer.jar运行服务端程序,单击“开始”按钮,启动WebServer服务。
双击ChatClient.jar运行客户端程序,然后在程序中设置好服务器的IP地址及端口号后单击“连接”连接服务端,这时几个聊天程序就已经建立好连接并可以通讯了。
在客户端程序面板“输入聊天信息”栏输入用用户名,点击“发送”或按回车键即可加入聊天室。
在“输入聊天信息”栏输入信息,点击“发送”或按回车键即可发送消息。
聊天内容将会在客户服务窗口内显示。
服务端运行效果如图6-1,6-2所示:
图6-1运行后界面
图6-2开启服务端后的界面
客户端运行后会弹出一连接信息的界面,可以设置服务器地址和端口,但端口必须和服务监听端口保持一致,如图6-3所示:
图6-3客户端运行后的界面
点击“连接”按钮后会弹出一个网络聊天客户端得界面,在聊天内容的窗口里会出现“欢迎来到超越——网络聊天室,请输入您的姓名”的信息如图6-4所示:
图6-4连接服务端后的界面
在同一机器或网络上几个不同机器运行聊天客服程序,其中一个设置他的服务器的地址,另外几个与他的服务器地址保持一致,建立通信连接,并在弹出的客户端界面输入自己的名字,点击发送,就加入了聊天室,进行群聊。
如下图6-5所示:
图6-5聊天过程的界面
每个客户端加入或退出聊天室时,网络聊天室的服务端的对每个客户加入和退出都有数据记录如图6-6所示:
图6-7客户端离开后
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 TCPIP 协议 网络 聊天 程序 服务端 设计 讲解
![提示](https://static.bdocx.com/images/bang_tan.gif)