1、 摘要互联网诞生于传统的电话网络,通讯交流可以说是互联网天然的应用之一。Internet是目前世界上最大的计算机互联网络,它遍布全球,将世界各地各种规模的网络连接成一个整体。随着网络通信技术和计算机技术的进一步发展,即时通信正在成为网络在线活动中不可缺少的业务。近年来计算机技术的快速发展,特别是计算机网络的发展,越来越深刻的改变了人们生活的方方面面。Socket是TCP/IP协议的编程接口,利用Socket提供的一组API就可以编程实现TCP/IP协议。本文论述了使用J包与Java.awt包提供的类和接口,开发了一款即时通讯系统“LanMessage”,可实现点对点的文字聊天、群发消息、文件传
2、输等功能,经测试,系统基本达到预期的设计目标。关键词:Java,局域网,即时通讯,TCP/IPABSTRACTInternet was born in the traditional telephone network while communication exchange can be said of the Internet natural one. Internet is now the worlds largest computer Internet, it spread globally, of all sizes around the world connects to the
3、network as a whole. With the network communication technology and the further development of computer technology, instant communication network online activities are becoming indispensable to business. In recent years, computer technology is developing rapidly, in particular the development of compu
4、ter networks, increasingly profound changes in all aspects of peoples lives. Socket is the Programming Interface of TCP/ IP , namely using a set of API , offered by Socket , programming to realize TCP/ IP. This paper takes use of the class and interface of J packets and Java. awt packet, using JDK6.
5、0. developed instant communications software LanMessage. The software include client, the client has a general communications software functions, including: point-to-point text chat function, file transfer function,Mass function, After testing the basic system design to achieve the desired objective
6、s.Keywords: Java, Lan, Instant communication, TCP / IP 目录摘要IABSTRACTII第1章 引言11.1 背景11.2JAVA以及相关技术21.2.1 Java的由来与定义21.2.2 Socket41.2.3 Java编译工具NetBeans41.3 论文的组织结构51.4 本章小结5第2章 系统实现的相关知识62.1通信协议与模型62.1.1 OSI模型62.1.2 TCP/IP协议72.1.3 TCP协议与UDP协议的比较92.2 基于Socket通信的基本应用模式92.2.1 Socket的基本通讯模式92.2.2 Java So
7、cket传输模式112.3 Socket连接的过程112.4 双方之间的网络连接132.4.1 使用Java控制UDP协议132.4.2 在Java中操作UDP132.5 本章小结14第3章 系统的需求分析与设计153.1需求分析153.1.1 功能需求153.1.2程序界面设计153.2 总体设计163.2.1 系统结构设计163.2.2 系统功能模块设计163.3 本章小结17第4章 详细设计184.1 主要功能模块184.1.1 系统主界面184.1.2 文字聊天模块204.1.3 文件传输模块224.2 其他功能模块284.2.1查看本地IP284.2.2添加黑名单模块284.2.3添
8、加好友列表模块304.2.4退出模块314.3 本章小结32第5章 结束语33致谢34参考文献3535第1章 引言随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式,如:信件、电报、电话等已经难以满足人们的交流要求,在互联网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。因此,两台计算机之间进行即时通讯、发送文件等交流方式已经成为必然潮流。因此出现了QQ等聊天工具,然而QQ等聊天工具虽然方便、实用,但是,娱乐功能太多,有很多吸引人的娱乐功能,从一定程度上来说,是一种娱乐工具,不能作为用于即时通讯、文件共享的专用工具1。目前,用于实现单一的即时通讯、文件共享的软件实
9、在太少,而且,它们中大部分都是绝对的C/S模式,对远程服务器有非常大的依赖性,对应用有着很大的局限性,没有彻底实现点对点的交流。为此,决定开发一个专用于实现两台计算机或者多台计算机之间即时通讯、文件共享的传输,以方便两台或者多台计算机之间信息的交流。本软件属于点对点连接的,在连接并通信时,尤其是近程的即时通讯,彻底的脱离了远程的服务器,避免了和远程服务器连接时过多的浪费网络资源。并且避免了服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接。因此,这个软件是极具适应性和实用性的即时通讯软件。1.1 背景 电子邮件就是最重要的通讯交流工具,是互联网最早的通讯交流工具。此后兴起的网络论坛
10、和网络聊天室都是网络聊天的前身。但是,个人对个人的网络聊天真正崛起还是需要从ICQ的开始。ICQ产品最早的创始人是三个以色列青年,是他们在1996年做出来的,取名叫ICQ。1998年当ICQ注册用户数达到1200万时,被AOL看中,以2.87亿美元的天价买走。目前ICQ有1亿多用户,主要市场在美洲和欧洲,已成为世界上最大的即时通信系统。这是一款网络即时讯息传呼软件,支持在互联网上面各种聊天、发送文件等功能。在网络无所不在的今天,在Internet上,有QQ等网上寻呼软件,极大程度上方便了处于在世界各地的友人之间的相互联系,也使世界好像一下子缩小了,不管你在哪里,只要你上了网,打开这些软件,就可
11、以给你的朋友发信息,不管对方是否也同时在线,只要知道他有号码。网上寻呼软件在国外的有ICQ等,在国内的主要有腾讯的Oicq,还有Ticq,OmO和一些在网页上的即时通讯工具,像Chinaren网站上的WebMaster等等,都做得即美观,且功能强大,Oicq(QQ)非常大的用户群。目前全球已有20%的企业采用IM进行信息通信和文件共享。据权威人士预瞻,到2008年,全球将有80%的企业会采用即时通信软件来代替费用高昂的电话、传真等通信方式。这将是一个非常庞大的市场和财富。强大的网络聊天工具如QQ,MSN等软件占据了一定是市场,俨然成为当今社会人们主流的联系方式。但是这些聊天工具虽然方便、实用,
12、但是,有个最不好的确定就是功能太多,有很多吸引人的娱乐功能,从一定程度上来说,是一种娱乐工具,不能作为用于作为即时通讯、文件共享的专用工具。而也有很多企业与公司都把QQ,MSN作为公司内部禁止使用的软件之一。这样必然会造成一个问题就是,当公司或者企业内部人员需要相互交流或者传输资料文件的时候,必须采用最原始的办法,用U盘相互拷贝,对文件以及电脑有着极大的危害。所以,我想设计一个能用于局域网之间的用来完成点对点通讯与传输文件的即时通信软件工具。即时通信,是以Internet网络及其它有线、无线网络为基础,实现交互双方文字、文件、语音等信息实时传送的通信过程。目前,用于实现这种单一的即时通讯、文件
13、共享的软件实在太少,并且,它们中大部分都是的C/S模式,对远程服务器有非常大的依赖性,没有彻底实现点对点的交流。为此,我选择这一课题,并且决定所开发的软件应属于点对点连接的,这样在连接并通信时,尤其是近程的即时通讯,可以彻底的摆脱对远程的服务器的依赖,避免和远程服务器连接时过多的浪费网络资源。同时还可以避免服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接!因此我基本上确定了开发的目标和方向。1.2JAVA以及相关技术1.2.1 Java的由来与定义 在Java出现以前。Internet上的信息内容都是一些乏味死板的HTML文档。这对于那些迷恋于WEB浏览的人们来说简直不可容忍。他
14、们迫切希望能在WEN中看到一些交互式的内容,开发人员也极希望能够在WEB上创建一类无需考虑软硬件平台就可以执行的应用程序,当然这些程序还要有极大的安全保障。对于用户的这种要求,传统的编程语言显得无能为力,面SUN的工程师敏锐地察觉到了这一点,从1994年起,他们开始将OAK技术应用于WEB上,并且开发出了HotJava的第一个版本2。Java是一种简单的,面象对象的,分布式的,解释的,键壮的安全的,结构的中立的,可移植的,性能很优异的多线程的,动态的语言。Java的开发环境有不同的版本,如sun公司的Java Developers Kit,简称JDK。Java的特点如下1) 平台无关性平台无关
15、性是指Java能运行于不同的平台。Java引进虚拟机原理,并运行于虚拟机,实现不同平台的Java接口之间。使用Java编写的程序能在世界范围内共享。Java的数据类型与机器无关,Java虚拟机(Java Virtual Machine)是建立在硬件和操作系统之上,实现Java二进制代码的解释执行功能, 提供于不同平台的接口的。 2) 安全性 Java的编程类似C+,学习过C+的读者将很快掌握Java的精髓。Java舍弃了C+的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指 针侵入系统。Java对程序提供了安全管理器,防止程序的非法访问。 3) 面向对象Jav
16、a 吸取了C+面向对象的概念,将数据封装于类中,利用类的优点,实现了程序的简洁性和便于维护性。类的封装性、继承性等有关对象的特性,使程序代码只需一次编译,然后通过上述特性反复利用。程序员只需把主要精力用在类和接口的设计和应用上。Java 提供了众多的一般对象的类,通过继承即可使用父类的方法。在 Java中,类的继承关系是单一的非多重的,一个子类只有一个父类,子类的父类又有一个父类。Java 提供的Object 类及其子类的继承关系如同一棵倒立的树形,根类为 Object 类, Object 类功能强大,经常会使用到它及其 它派生的子类。4) 分布式Java建立在扩展TCP/IP网络平台上。库函
17、数提供了用HTTP和FTP协议传送和接受信息的方法。这使得程序员使用网络上的文件和使用本机文件一样容易。5) 键壮性Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自已操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能。这些功能特征大大提高了开发Java应用程序的周期。Java提供:Null指针检测、数组边界检测、异常出口、Byte code校验。1.2.2 Socket所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求3。 Socke
18、t和Server Socket类库一般位于J包中。Server Socket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是Server Socket它们的工作都是通过SocketImpl类及其子类完成的。1.2.3 Java编译工具NetBeansNetBeans由Sun公司在2000年创立,它是开放源运动以及开发人员和客户社区的家园,旨在构建世界级的Java IDE。NetBeans当前可以
19、在Solaris、Windows、Linux和Macintosh OS X平台上进行开发,并在SPL(Sun公用许可)范围内使用。 NetBeans是一个全功能的开放源码Java IDE,可以帮助开发人员编写、编译、调试和部署Java应用,并将版本控制和XML编辑融入其众多功能之中。NetBeans 可支持Java 2平台标准版(J2SE)应用的创建、采用JSP和Servlet的2层Web应用的创建,以及用于2层Web应用的API及软件的核心组的创建。此外,NetBeans 最新牒还预装了两个Web服务器,即Tomcat和GlassFish,从而免除了繁琐的配置和安装过程。所有这些都为Java
20、开发人员创造了一个可扩展的开放源多平台的Java IDE,以支持他们在各自所选择的环境中从事开发工作,如Solaris、Linux、Windows或Macintosh。而最重要的原因是因为NetBeans是与Sun公司开发,这意味这NetBeans跟Java有着良好的兼容性。而其友好的操作界面跟可视化的GUI界面的操作使得软件开发如虎添翼。1.3 论文的组织结构本文共分为四章第一章介绍了局域网即时通讯的背景,发展前景以及编写的语言进行简单的阐述。第二章介绍了编写程序所需要的相关知识与关键技术,对设计中用的一些相关知识与技术进行介绍和阐述,便于理解后续章节里系统的设计和实现。第三章具体阐述了即时
21、通信系统的设计和实现,对系统的需求进行分析,构思出设计方案,然后对怎样使用Java来实现网络通信的进行阐述。第四章为结论,是对论文的研究结果进行自我总结和评价,同时,总结了系统设计中的不足和缺陷,并提出将来发展的趋势。1.4 本章小结本章介绍了构建“局域网内即时通讯技术”的背景和意义,以及课题的任务,确定编写程序所用的语言。简明的阐述了编程语言的优越性,并合理安排论文结构,较为清晰规划出全文脉络。第2章 系统实现的相关知识2.1通信协议与模型2.1.1 OSI模型OSI(Open Systems Interconnection),即开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一
22、个试图使各种计算机在世界范围内互连为网络的标准框架4。OSI定义了开放系统的层次结构、层次之间的相互关系以及各层所包括的可能的任务,它本身并不是一个标准,而是一个在制定标准时使用的概念性框架,是作为一个框架来协调和组织各层所提供的服务的。在单台机器中,每一层通过两层间的层间接口调用下一层的服务,取出对该层有意义的数据;机器之间则是使用某个给定层的协议的对等进程进行通信。这种通信由一些协议来控制,协议就是实现双方都同意的一组规则和约定。对等进程是指每一个机器的某个给定层上进行通信的进程。2.1.2 TCP/IP协议TCP/IP(Transmission Control Protocol/Inte
23、rnet Protocol),即传输控制协议/互联网络协议,是美国的国防部高级计划研究局DARPA为实现ARPANET(后来发展为Internet)互联网而开发的。该协议是Internet国际互联网络的基础和事实上的标准,其规范了网络上的所有通信设备,尤其是两台主机之间的数据往来格式以及传送方式。TCP/IP协议由应用层、传输层(TCP)、网络层(IP)和数据链路层(包括物理层)四层组成,与OSI模型的对应关系如图2-1所示。DNSFTPRPC 各种应用程序层应用层UDP表示层会话层TCP传输层RARPIPICMPARPIGMP网络层由底层网络协议定义的协议数据链路层物理层SMTP图2-1 T
24、CP/IP和OSI模型的关系在物理和数据链路层中TCP/IP并没有定义任何特定的协议,它支持所有标准的和专用的协议。网络层提供主机到主机的通信服务,负责将分组从发送主机送到接收主机。网络层通过选路算法和协议为分组选择通过通信子网最适当的路径,并通过路由器的将数据报从源主机转发到目的地主机。传输层的作用是将两个端系统间的IP交付服务扩展为运行在两个端系统上的进程之间的交付服务,提供进程逻辑通信功能。传输层协议是在端系统而不是在路由器中实现的,其中包括UDP和TCP。应用层为不同的端系统提供通过计算机网络交换报文互相通信的功能。应用层协议定义了进程间交换的报文格式和顺序,以及传输和接收到报文时采取
25、的动作,其中包括交换的报文类型、报文类型的语法、字段的语义、报文响应规则等。要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户机端,我们称之为ClientSocket,另一个运行于服务器端,我们称之为ServerSocket。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。 所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指
26、出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。 所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。 套接字的两种类型:一种采用Stream Sockets(流格式),另一种为Datagram Sockets(数据报格式)。数据报格式又称为无连接套接字,相反流格式肯定是有连接了。这是跟两种类型采用的传输协议有关。Stream Sockets(流格式)基于TCP协
27、议,Datagram Sockets(数据报格式)基于UDP协议6。套接字允许数据的发送和接收,但是UDP套接字和TCP套接字之间有本质的区别。首先TCP套接字连接到单个计算机,然而UDP套接字可以向多台计算机传输或接收数据;其次,UDP套接字只能发送和接收数据包,然而TCP允许通过字节流的数据传输(表现为输入流(Input Stream)和输出流(Output Stream)。为了在网络上传输,它们被转换为数据包,不需要程序员干涉(如图2-2所示)。图2-2 TCP把数据流处理为协议的2.1.3 TCP协议与UDP协议的比较UDP(用户数据报协议)与TCP(传输控制协议)区别(表2-1)表2
28、-1 UDP与TCP区别TCP UDP基于连接 基于无连接 系统资源的要求多系统资源的要求少 数据包结构复杂数据包结构简单保证数据正确性可能丢包保证数据顺序 不保证通信效率相对低 通信效率较高 由表2-1可见TCP保证数据能可靠并且按顺序到达,是完全可靠的连接传输,然而资源要求也比较多,结构也比较复杂。TCP首先需要在传输方的两端建立一可靠的连接 (通过信号的三次握手),然后通过数据包的各项校验确保数据完全正确。UDP设计初衷就是尽可能快的将数据包发送出去。所以 UDP协议显得非常精简。你只要建立一个包,构造一个有目标信息的IP头,然后发出去。无需连接。当然UDP也需要通过对方返回“命令正确应
29、答”也叫“ACK”包,来避免数据包丢失。假使一定时间内,发送方没有收到接收方的应答,则重新发送数据包,直到收到“ACK”确认包。2.2 基于Socket通信的基本应用模式2.2.1 Socket的基本通讯模式事实上网络编程简单的理解就是两台计算机相互通讯数据而已。对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了。Java SDK提供一些相对简单的API来完成这些工作,Socket就是其中之一。 对于Java而言,这些API存在与J这个包里面。因此只要导入这个包就可以准备网络编程了。网络编程的基本模型就是客户机到服务器模型。简单的说就是两个进程之间相互通讯,然后其中一个
30、必须提供一个固定的位置,而另一个则只需要知道这个固定的位置,并去建立两者之间的联系。然后完成数据的通讯就可以了。这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。客户端和服务器在通信过程中的基本操作和时序如图2-3所示:建立客户端Socket 指定服务器地址,端口等 连接到服务器 在建立的连接上向服务器发送请求信息接收服务器发回的响应信息.断开连接建立服务器Socket 设定服务器地址,端口等 监听客户端的连接请求 接受请求,建立连接 在建立的连接上读取客户端的请求信息处理请求向客户端发送响应信息.断开连接客户端服务器图2-3 基于Socket应用的基本时序图在上述基本时序中,请求
31、服务和提供服务的过程都可以反复进行,直到完成某个预定的应用功能5。这样,通过基本消息传递,可以建立起灵活多样的网络应用。Java对这个模型的支持有很多种API。而这里介绍有关Socket的编程接口。对于Java而言已经简化了Socket的编程接口。首先讨论有关提供固定位置的服务方是如何建立的。Java提供了Server Socket来对其进行支持。事实上当创建该类的一个实力对象并提供一个端口资源就建立了一个固定位置可以让其他计算机来访问这台计算机。1) 是直接处理该请求并发送应答信息,然后再进行下面的工作。在服务器处理请求的过程中,不可能再对另外的请求进行响应。只有当一个完整的服务过程完成后,
32、程序再循环回到接收请求的地方,此时才又可以接收下一个请求。如此周而复始。这种方式叫做重复服务器,即一次只能处理一个服务请求。2) 是每收到一个服务请求时,就激活一个新的进程(或线程)来专门处理这个客户请求。新建立的进程(或线程)从创建它的服务器继承了建立好的连接等资源,并使用这个建立好的连接与客户端进行通信,为客户端提供服务。而原来的服务器就可以立刻又回到等待请求的地方,可以接受下一个连接请求。新进程(或线程)中服务完成后,关闭自己与客户端的通信链路,并自行终止。这种方式叫做并发式服务器 ,即可以同时响应多个客户端的清求。2.2.2 Java Socket传输模式Sockets有两种主要的操作
33、方式:面向连接的和无连接的。面向连接的sockets操作就像一部电话,他们必须建立一个连接和一人呼叫。所有的事情在到达时的顺序与它们出发时的顺序时一样。无连接的sockets操作就像是一个邮件投递,没有什么保证,多个邮件可能在到达时的顺序与出发时的顺序不一样。到底用哪种模式是由应用程序的需要决定的。如果可靠性更重要的话,用面向连接的操作会好一些。如果一些数据丢失了,系统的有效性将会失去。一些服务器,比如间歇性地发送一些数据块。如果数据丢了的话,服务器并不想要再重新发过一次,因为当数据到达的时候,它可能已经过时了。确保数据的有序性和正确性需要额外的操作的内存消耗,额外的费用将会降低系统的回应速率
34、。1) 无连接的操作无连接的操作使用数据报协议(相对应的是UDP)。一个数据报是一个独立的单元,它包含了所有的这次投递的信息。把它想象成一个信封吧,它有目的地址和要发送的内容。这个模式下的socket不需要连接一个目的的socket,它只是简单地投出数据报。无连接的操作是快速的和高效的,但是数据安全性不佳。2) 面向连接的操作面向连接的操作使用TCP协议。一个这个模式下的socket必须在发送数据之前与目的地的socket取得一个连接。一旦连接建立了,sockets就可以使用一个流接口:打开-读-写-关闭。所有的发送的信息都会在另一端以同样的顺序被接收。面向连接的操作比无连接的操作效率更低,但
35、是数据的安全性更高。2.3 Socket连接的过程在Java 中,可以通过Socket 套接字向网络发出请求或者应答请求。通过Socket连接一般要经过四个步骤:创建Socket,建立连接,打开连接到Socket的输入/输出流,按照一定的协议对Socket 进行读/写操作,关闭Socket。1) 建立SocketSocket也就是套接字,是TCP/IP 协议的编程接口,是运行在网络上的两个程序间双向通讯连接的末端,它提供客户端和服务器端的连接通道。Socket绑定于特定端口这样TCP 层就知道将数据提供给哪个应用程序。主要分以下几个步骤:1服务器端创建ServerSocket对象,绑定某个端口
36、,进行监听,等待客户端的连接请求;ServerSocket类: ServerSocket对象的创建:ServerSocket server_socket=new ServerSocket(port);此语句创建了一个ServerSocket 类的对象server_socket它提供监听服务的端口号是port的值,如8080。为了随时监听可能的客户端请求,还应该执行如下的语句:Socket client=server_socket.accept();Accept()方法的执行,是服务器端的程序一直处于等待状态,直到捕捉到来自客户端的连接请求。结束监听,需要用到语句server_socket.cl
37、ose();2客户端创建Socket 对象,向服务器和特定端口请求连接;Socket 类:创建Socket 对象:Socket client_socket=new Socket(hostname,port);其中hostname 为希望连接到的服务器名称,可以用IP 表示,port 为其提供服务的端口号。Socket 对象建立成功后,就可以在客户端和服务器端建立一个连接,并通过此连接传递数据了。3服务器端接受客户端的连接请求,产生新的socket,用此socket建立和客户端的连接;4通过向socket读写数据实现服务器端和客户端的通信;5通信完毕,服务器端关闭与客户端通信的socket,客户
38、端socket 对象关闭,服务器端serversocket对象关闭,以及一些其它的结束工作;2) 数据传输 Socket是两个进程间通信链的端点, 而通信就要有输入和输出,因此Socket 有两个流:一个输入流和一个输出流。客户端和服务器的连接建立后,就要进行通信,就要获取连接上的输入/输出流,并通过这些流进行数据传输。Socket 提供了专门用于获取这些输入/输出流的方法。1.getInputStream()方法:用来获取输入流,返回InputStream 类对象;2.getOutputStream()方法:用来获取输出流,返回OutputStream类对象。然后将这些返回的类对象通过rea
39、d()方法或者readLine()方法读取出来,根据传输的信息进行相应的处理,完成客户端和服务器端的通讯。3) 关闭Socket 两个主机之间的通信结束时,要关闭连接。首先关闭与Socket相关的所有输入/输出流, 然后再通过close()方法关闭Socket。2.4 双方之间的网络连接Java在这方面有其独特的优势,Java提供了丰富的网络类库的支持,可以轻松编写多种类型的网络通信程序7。2.4.1 使用Java控制UDP协议本程序的开发选择了UDP协议。虽然在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速
40、度快的优点,所以通常音频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响8。比如ICQ和OICQ中的语音聊天就是使用的UDP协议。2.4.2 在Java中操作UDP使用位于JDK中J包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文。在描述它们之前,必须了解位于同一个位置的InetAddress类。InetAddress实现了Java.io.Serializable接口,不允许继承。它用于描述和包装一个Internet IP地址,通过三个方法返回InetAddress实例: 1) getLocalh
41、ost():返回封装本地地址的实例; 2) getAllByName(String host):返回封装Host地址的InetAddress实例数组;3) getByName(String host):返回一个封装Host地址的实例。其中,Host可以是域名或者是一个合法的IP地址。 DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。DatagramSocket类有3个构建器:DatagramSocket():创建
42、实例。这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的; DatagramSocket(int port):创建实例,并固定监听Port端口的报文; DatagramSocket(int port,InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。 值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。DatagramSocket类最
43、主要的方法有4个: 1) Receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”; 2) Send(DatagramPacket d):发送报文d到目的地;3) SetSoTimeout(int timeout):设置超时时间,单位为毫秒; 4) Close():关闭DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。2.5 本章小结本章是完成本项目所必需的理论技术基础。通
44、过本章的介绍,我们明确了本项目中所采用的理论基础和模型,对程序的编写有了一个大体的方向,利于理解后续章节。本章主要介绍了为构建即时通讯系统所需要的相关知识与关键技术,通信传输协议,TCP/IP的协议,JAVA的Socket编程,从而为系统设计与实现作好理论准备。第3章 系统的需求分析与设计3.1需求分析3.1.1 功能需求即时通迅系统以“先进合理的应用理念”、“高效率的通信服务”、“安全的系统服务”,为用户提供了一套安全快捷的即时信息交流和办公的平台,以增强企事业单位内部的信息交流,拓宽单位员工的安全沟通渠道,创建新型的沟通文化,提高单位的工作效率。该系统具有点对点或者广播消息通信,一对一传输
45、文件等基本功能,同时保证数据通信的即时性以及通信过程和信息存储的安全性。文本通信提供客户之间的消息传输服务,保证信息传输的即时性和安全性。文本通信包括:点对点通信实现两个用户之间的信息沟通;消息通知群发实现单个用户对多个用户的文字会话、消息通知分发和任务分配等。系统的即时文本通信功能方便了员工间的工作交流,使员工在第一时间得知单位的重要通知、本人的工作任务,以提高工作效率。文件传输功能为一对一的计算机能相互提供文件传输服务。计算机之间可以互相传输文件,并且将文件信息保存至指定地点供查询使用。文件传输过程不会对正常文本通信造成影响。3.1.2程序界面设计界面包括:1) 用户界面:用户进行操作的主
46、界面,可以查看局域网内的在线人员;2) 聊天界面:用户与用户的即时通讯界面;3) 广播消息界面:用来广播消息的界面;4) 文件传输界面:用户与用户的文件传输界面;5) 还有其他的提示信息界面。3.2 总体设计3.2.1 系统结构设计软件启用后,将会在局域网内群发广播包,把在线的局域网的用户全部显示在列表中。同时,可以进行的操作包括查看列表中任何一个列表中用户的IP,对某个选中的用户发送信息,广播消息,发送文件,修改自己的昵称等。3.2.2 系统功能模块设计即时通讯工具系统窗口配置刷新好友列表查看好友信息查看本地IP列表刷新本地IP信息加入黑名单退出发送消息广播消息发送文件管理好友管理黑名单发送
47、列表修改用户昵称消息快捷键重置默认设置图3-1 功能模块图如图3-1所示,本程序按模块划分可分为系统模块、窗口模块、配置模块每个模块有相对应的分模块。其中窗口模块为本程序的重点模块,它包含了本软件的主要功能,即文字聊天模块、广播消息模块、文件传输功能模块。1) 系统模块查看系统的一些基本信息,包括:查看本地的IP,任意一个在线用户的IP,把任意一个用户添加成为黑名单等;2) 窗口模块最主要的功能模块,整个软件的重点:有分送消息,广播消息,发送文件等主要功能。另外还有管理黑名单跟好友列表模块。各个模块的主要实现分别为:发送消息模块主要用于用户间完成简单的文本聊天;广播消息模块主要用于群发消息给所有所在列表的人员;