资源描述
摘要
互联网诞生于传统的电话网络,通讯交流可以说是互联网天然的应用之一。Internet是目前世界上最大的计算机互联网络,它遍布全球,将世界各地各种规模的网络连接成一个整体。近年来计算机技术的快速发展,特别是计算机网络的发展,越来越深刻的改变了人们生活的方方面面。
本论文使用J包和Java. sound包提供的类和接口,在NT 4.0 网络环境(TCP/IP)下使用JDK5.0,数据库使用SQL Server,开发了一款即时通讯软件“I Talk”。该软件分为客户端与服务器端两个部分,客户端具有一般通信软件的功能,包括:点对点的文字聊天功能、文件传输功能、即时语音通讯功能。服务器端主要提供新用户的帐号注册功能,用户登录的帐号名与密码验证功能。
关键词: Java;I Talk;即时通讯;TCP/IP
ABSTRACT
Internet was born in the traditional telephone network while communication exchange can be said of the Internet natural one. Internet is now the world's largest computer Internet, it spread globally, of all sizes around the world connects to the network as a whole. In recent years, computer technology is developing rapidly, in particular the development of computer networks, increasingly profound changes in all aspects of people's lives.
This paper takes use of the class and interface of J packets and Java. Sound packet, In NT 4.0 network (TCP / IP) using JDK5.0. SQL Server database developed instant communications software "I Talk." The software is divided into two parts of client and server, the client has a general communications software functions, including: point-to-point text chat function, file transfer function,instant voice communications function. The server provides new user account registration function, and the user account name login and password verification function.
Keywords: Java; I Talk; Instant communication; TCP / IP 目录
摘要 I
ABSTRACT II
第1章 引言 1
1.1 背景 1
1.1.1 即时通讯的背景 1
1.1.2即时通讯与JAVA 1
1.2 即时通讯 2
1.2.1 发展前景 2
1.2.2 Eclipse开发平台简介 2
1.3 本课题主要工作 4
第2章 JAVA网络编程介绍 5
2.1 Java语言的特性 5
2.2 传输控制协议 7
2.2.1 TCP/IP协议 7
2.2.2 TCP与UDP 8
2.2.3 使用端口在应用程序之间通信 10
2.3 Java Socket 11
2.3.1 Java Socket简介 11
2.3.2 Java Socket传输模式 11
2.4 双方之间的网络连接 12
2.4.1 使用Java控制UDP协议 13
2.4.2 在Java中操作UDP 13
第3章 客户端的需求分析与总体设计 15
3.1需求分析 15
3.1.1功能需求 15
3.1.2 技术难点 15
3.2 总体设计 16
3.2.1 系统结构设计 16
3.2.2 系统功能模块设计 17
第4章 详细设计 19
4.1 主要功能模块 19
4.1.1 客户端登陆 19
4.1.2 文字聊天 21
4.1.3文件传输 22
4.1.4 语音聊天 22
4.2 实现语音聊天的主要类 23
4.2.1 主要功能类中的Java Sound API 23
4.3 系统的实现 26
4.3.1 客户端 26
第5章 主要功能模块测试 32
5.1 用户登陆模块测试 32
5.2 文字聊天模块测试 32
5.3文件传输模块测试 33
5.4 语音聊天模块测试 33
第6章 结束语 35
致谢 36
参考文献 37
- 31-
第1章 引言
1.1 背景
1.1.1 即时通讯的背景
互联网诞生于传统的电话网络,通讯交流是互联网的应用之一。随着计算机和通信技术快速发展,IM将提供的服务会更加丰富.网络虚拟社区将会普及.即时通信将更加凸显个人信息处理的能力。同时与社会文化和本地化应用将进一步深入融合。随着即时通信标准及安全的完善和发展,即时通信有可能实现各个通信系统之间的统一接入,使得人们可以在远隔千里之遥随时通讯。所以在未来可以预见即时的快速信息通讯与传输成为网络数据交换的主流。
1.1.2 即时通讯与JAVA
Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。它被开发出来是为小型消费类和嵌入式设备提供一个面向对象的、与机器无关的编程语言,可实现“编写一次,随处运行”,但后来却发展成为一种开发桌面应用和服务器应用的平台技术。
所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。
Socket和Server Socket类库一般位于包中。Server Socket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是Server Socket它们的工作都是通过 SocketImpl类及其子类完成的。
1.2 即时通讯
1.2.1 发展前景
电子邮件就是最重要的通讯交流工具,是互联网最早的通讯交流工具。此后兴起的网络论坛和网络聊天室都是网络聊天的前身。但是,个人对个人的网络聊天真正崛起还是需要从ICQ的开始。
ICQ产品最早的创始人是三个以色列青年,是他们在1996年做出来的,取名叫ICQ。1998年当ICQ注册用户数达到1200万时,被AOL看中,以2.87亿美元的天价买走。目前ICQ有1亿多用户,主要市场在美洲和欧洲,已成为世界上最大的即时通信系统。这是一款网络即时讯息传呼软件,支持在互联网上面各种聊天、发送文件等功能。
在网络无所不在的今天,在Internet上,有QQ等网上寻呼软件,极大程度上方便了处于在世界各地的友人之间的相互联系,也使世界好像一下子缩小了,不管你在哪里,只要你上了网,打开这些软件,就可以给你的朋友发信息,不管对方是否也同时在线,只要知道他有号码。网上寻呼软件在国外的有ICQ等,在国内的主要有腾讯的Oicq,还有Ticq,OmO和一些在网页上的即时通讯工具,像Chinaren网站上的WebMaster等等,都做得即美观,且功能强大,Oicq(QQ)非常大的用户群。目前全球已有20%的企业采用IM进行信息通信和文件共享。据权威人士预瞻,到2008年,全球将有80%的企业会采用即时通信软件来代替费用高昂的电话、传真等通信方式。这将是一个非常庞大的市场和财富,于是腾讯QQ、微软MSN、雅虎通、朗玛UC、ICQ等竟相加力,最终导致中国即时通信市场战国群雄并起。
1.2.2 Eclipse开发平台简介
Eclipse是一种可扩展的开放源代码IDE。2001年11月,IBM公司捐出价值4,000万美元的源代码组建了Eclipse联盟,并由该联盟负责这种工具的后续开发。集成开发环境(IDE)经常将其应用范围限定在“开发、构建和调试”的周期之中。为了帮助集成开发环境(IDE)克服目前的局限性,业界厂商合作创建了Eclipse平台。Eclipse允许在同一IDE中集成来自不同供应商的工具,并实现了工具之间的互操作性,从而显著改变了项目工作流程,使开发者可以专注在实际的嵌入式目标上。
Eclipse框架的这种灵活性来源于其扩展点。它们是在XML中定义的已知接口,并充当插件的耦合点。扩展点的范围包括从用在常规表述过滤器中的简单字符串,到一个Java类的描述。任何Eclipse插件定义的扩展点都能够被其它插件使用,反之,任何Eclipse插件也可以遵从其它插件定义的扩展点。除了解由扩展点定义的接口外,插件不知道它们通过扩展点提供的服务将如何被使用。
利用Eclipse,我们可以将高级设计(也许是采用UML)与低级开发工具(如应用调试器等)结合在一起。如果这些互相补充的独立工具采用Eclipse扩展点彼此连接,那么当我们用调试器逐一检查应用时,UML对话框可以突出显示我们正在关注的器件。事实上,由于Eclipse并不了解开发语言,所以无论Java语言调试器、C/C++调试器还是汇编调试器都是有效的,并可以在相同的框架内同时瞄准不同的进程或节点。
Eclipse的最大特点是它能接受由Java开发者自己编写的开放源代码插件,这类似于微软公司的Visual Studio和Sun 微系统公司的NetBeans平台。Eclipse为工具开发商提供了更好的灵活性,使他们能更好地控制自己的软件技术。Eclipse 联盟已经宣布将在2004年中期发布其3.0版软件。这是一款非常受欢迎的java开发工具,这国内的用户越来越多,实际上实用它java开发人员是最多的。
虽然大多数人很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。
这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如 C/C++、COBOL 和 Eiffel 等编程语言的插件已经可用,或预计会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。
基于Eclipse 的应用程序的突出例子是 IBM 的 WebSphere Studio Workbench,它构成了 IBM Java 开发工具系列的基础。例如,WebSphere Studio Application Developer 添加了对 JSP、servlet、EJB、XML、Web 服务和数据库访问的支持。
Eclipse很方便的为我们提供了开发平台,我们只要安装JDK,然后在Eclipse里建立工程,运行就可以看见结果。
1.3 本课题主要工作
本程序在NT 4.0 网络环境(TCP/IP)下使用JDK5.0。数据库用SQL2000技术,将用户的帐号信息,用户的个人信息分别管理。
本软件的工作机制是模仿即时通信软件的基本功能,利用Java开发点对点通信软件,实现登陆,上线,语音聊天,传递信息等等。分为客户部分和服务器部分两块,客户部分类似一般通信软件例如QQ,服务器部分主要提供客户端用户基本数据配置。
本软件突出即时语音通讯,快速的数据交换。在点对点连接通信时,可以彻底的摆脱对远程的服务器的依赖,避免和远程服务器连接时过多的浪费网络资源。同时还可以避免服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接。
第2章 Java网络编程介绍
2.1 Java语言的特性
Java语言是一个支持网络计算的面向对象程序设计语言。Java语言吸收了Smalltalk语言和C++语言的优点,并增加了其它特性,如支持并发程序设计、网络通信、和多媒体数据控制等。主要特性如下:
(1)、Java语言是简单的。Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。另一方面,Java丢弃了C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。
(2)、Java语言是一个面向对象的。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++ 语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
(3)、Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、 ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
(4)、Java语言是健壮的。Java的强类型机制、异常处理、废料的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。
(5)、Java语言是安全的。Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。
(6)、Java语言是体系结构中立的。Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件), 然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
(7)、Java语言是可移植的。这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。
(8)、Java语言是解释型的。如前所述,Java程序在Java平台上被编译为字节码格式, 然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
(9)、Java是高性能的。与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。
(10)、Java语言是多线程的。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable) 的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。 Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
(11)、Java语言是动态的。Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
Java语言的优良特性使得Java应用具有无比的健壮性和可靠性,这也减少了应用系统的维护费用。Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。Java的编译一次,到处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。特别是Java企业应用编程接口(Java Enterprise APIs)为企业计算及电子商务应用系统提供了有关技术和丰富的类库。
2.2 传输控制协议
2.2.1 TCP/IP协议
TCP/IP(Transmission Control Protocol/Internet Protocol),即传输控制协议/互联网络协议,是美国的国防部高级计划研究局DARPA为实现ARPANET(后来发展为Internet)互联网而开发的。该协议是Internet国际互联网络的基础和事实上的标准,其规范了网络上的所有通信设备,尤其是两台主机之间的数据往来格式以及传送方式。TCP/IP协议由应用层、传输层(TCP)、网络层(IP)和数据链路层(包括物理层)四层组成,与OSI模型的对应关系如图2.1所示。
DNS
SMTP
各种应用程序层
FTP
应用层
………
RPC
表示层
会话层
TCP
UDP
传输层
RARP
IP
ICMP
ARP
IGMP
网络层
由底层网络协议定义的协议
数据链路层
物理层
图2.1 TCP/IP和OSI模型的关系
在物理和数据链路层中TCP/IP并没有定义任何特定的协议,它支持所有标准的和专用的协议。网络层提供主机到主机的通信服务,负责将分组从发送主机送到接收主机。网络层通过选路算法和协议为分组选择通过通信子网最适当的路径,并通过路由器的将数据报从源主机转发到目的地主机。传输层的作用是将两个端系统间的IP交付服务扩展为运行在两个端系统上的进程之间的交付服务,提供进程逻辑通信功能。传输层协议是在端系统而不是在路由器中实现的,其中包括UDP和TCP。应用层为不同的端系统提供通过计算机网络交换报文互相通信的功能。应用层协议定义了进程间交换的报文格式和顺序,以及传输和接收到报文时采取的动作,其中包括交换的报文类型、报文类型的语法、字段的语义、报文响应规则等。
2.2.2 TCP与UDP
要通过互联网进行通信,你至少需要一对套接字,其中一个运行于客户机端,我们称之为ClientSocket,另一个运行于服务器端,我们称之为ServerSocket。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述 发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
套接字的两种类型:一种采用"Stream Sockets"(流格式),另一种为"Datagram Sockets"(数据报格式)。数据报格式又称为无连接套接字,相反流格式肯定是有连接了。这是跟两种类型采用的传输协议有关。"Stream Sockets"(流格式)基于TCP协议,"Datagram Sockets"(数据报格式)基于UDP协议。
套接字允许数据的发送和接收,但是UDP套接字和TCP套接字之间有本质的区别。首先TCP套接字连接到单个计算机,然而UDP套接字可以向多台计算机传输或接收数据;其次,UDP套接字只能发送和接收数据包,然而TCP允许通过字节流的数据传输(表现为输入流(Input Stream)和输出流(Output Stream))。为了在网络上传输,它们被转换为数据包,不需要程序员干涉(如图2-2所示)。
图2-2 TCP把数据流处理为协议的
UDP(用户数据报协议)与TCP区别 (表2-1)
表2-1 UDP与TCP区别
TCP
UDP
基于连接
基于无连接
系统资源的要求多
系统资源的要求少
数据包结构复杂
数据包结构简单
保证数据正确性
可能丢包
保证数据顺序
不保证
通信效率相对低
通信效率较高
可见TCP保证数据能可靠并且按顺序到达,是完全可靠的连接传输,然而资源要求也比较多,结构也比较复杂。TCP首先需要在传输方的两端建立一可靠的连接 (通过信号的三次握手,详细可参考TCP相关资料),然后通过数据包的各项校验确保数据完全正确。UDP设计初衷就是尽可能快的将数据包发送出去。所以 UDP协议显得非常精简。你只要建立一个包,构造一个有目标信息的IP头,然后发出去。无需连接。当然UDP也需要通过对方返回“命令正确应答”也叫 “ACK”包,来避免数据包丢失。假使一定时间内,发送方没有收到接收方的应答,则重新发送数据包,直到收到"ACK"确认包。
比如聊天室用TCP协议来传送文字、控制信息、画板和屏幕广播数据,用UDP协议来传送语音和视频流。
2.2.3 使用端口在应用程序之间通信
很明显,TCP与UDP之间差别巨大,但是在两种协议之间也有一项重要的相似性。两种都共享了通讯端口的概念,它可以区别各个应用程序。在相同的端口上可以运行多个服务和客户端,而且希望不给它们分配端口号而挑选出某个应用程序是不可能的。当TCP套接字建立到某台计算机的连接的时候,它需要两部分非常重要的信息才能连接到远程客户端——该计算机的IP地址和端口号。此外,本地的IP地址和端口号也将绑定到它上面,因此远程计算机能够识别是哪一个应用程序建立了连接(图2-3所示)。
图2-3 通过端口识别到应用程序的连接
TCP中的端口与UDP中的端口相似——它们的数字范围都是1-65535。1024以下的端口是受限制的,只能被知名的服务(例如HTTP、FTP、SMTP、POP3和telnet)使用。表2-2列举了一些知名的服务以及与它们对应的端口。
表2-2 协议与它们的相关端口
知名的服务
服务端口
Telnet
23
SMTP(简单邮件传输协议)
25
HTTP(超文本传输协议)
80
POP3
110
2.3 Java Socket
Java Socket就是相对与网络编程套接字的一个封装,可以使用Java Socket来实现两台计算机相互通讯数据。
2.3.1 Java Socket简介
事实上网络编程简单的理解就是两台计算机相互通讯数据而已。对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了。Java SDK提供一些相对简单的API来完成这些工作,Socket就是其中之一。
对于Java而言,这些API存在与J这个包里面。因此只要导入这个包就可以准备网络编程了。网络编程的基本模型就是客户机到服务器模型。简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置,并去建立两者之间的联系。然后完成数据的通讯就可以了。这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。基于这个简单的模型,就可以进入网络编程。
Java对这个模型的支持有很多种API。而这里介绍有关Socket的编程接口。对于Java而言已经简化了Socket的编程接口。首先讨论有关提供固定位置的服务方是如何建立的。Java提供了Server Socket来对其进行支持。事实上当创建该类的一个实力对象并提供一个端口资源就建立了一个固定位置可以让其他计算机来访问这台计算机。
2.3.2 Java Socket传输模式
Sockets有两种主要的操作方式:面向连接的和无连接的。面向连接的sockets操作就像一部电话,他们必须建立一个连接和一人呼叫。所有的事情在到达时的顺序与它们出发时的顺序时一样。无连接的sockets操作就像是一个邮件投递,没有什么保证,多个邮件可能在到达时的顺序与出发时的顺序不一样。
到底用哪种模式是由应用程序的需要决定的。如果可靠性更重要的话,用面向连接的操作会好一些。如果一些数据丢失了,系统的有效性将会失去。一些服务器,比如间歇性地发送一些数据块。如果数据丢了的话,服务器并不想要再重新发过一次,因为当数据到达的时候,它可能已经过时了。确保数据的有序性和正确性需要额外的操作的内存消耗,额外的费用将会降低系统的回应速率。
1)无连接的操作
无连接的操作使用数据报协议(相对应的是UDP)。一个数据报是一个独立的单元,它包含了所有的这次投递的信息。把它想象成一个信封吧,它有目的地址和要发送的内容。这个模式下的socket不需要连接一个目的的socket,它只是简单地投出数据报。无连接的操作是快速的和高效的,但是数据安全性不佳。
2)面向连接的操作
面向连接的操作使用TCP协议。一个这个模式下的socket必须在发送数据之前与目的地的socket取得一个连接。一旦连接建立了,sockets就可以使用一个流接口:打开-读-写-关闭。所有的发送的信息都会在另一端以同样的顺序被接收。面向连接的操作比无连接的操作效率更低,但是数据的安全性更高。
2.4 双方之间的网络连接
Java在这方面有其独特的优势,Java提供了丰富的网络类库的支持,可以轻松编写多种类型的网络通信程序。
2.4.1 使用Java控制UDP协议
本程序的开发选择了UDP协议。虽然在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如ICQ和OICQ中的语音聊天就是使用的UDP协议。
2.4.2 在Java中操作UDP
使用位于JDK中J包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文。 在描述它们之前,必须了解位于同一个位置的InetAddress类。InetAddress实现了Java.io.Serializable接口,不允许继承。它用于描述和包装一个Internet IP地址,通过三个方法返回InetAddress实例:
① getLocalhost():返回封装本地地址的实例;
② getAllByName(String host):返回封装Host地址的InetAddress实例数组;
③ getByName(String host):返回一个封装Host地址的实例。其中,Host可以是域名或者是一个合法的IP地址。
DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。
DatagramSocket类有3个构建器:
DatagramSocket():创建实例。这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的;
DatagramSocket(int port):创建实例,并固定监听Port端口的报文; DatagramSocket(int port,InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。
值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。DatagramSocket类最主要的方法有4个:
a. Receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”;
b. Send(DatagramPacket d):发送报文d到目的地;
c. SetSoTimeout(int timeout):设置超时时间,单位为毫秒;
d. Close():关闭DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。
第3章 客户端的需求分析与总体设计
3.1 需求分析
3.1.1 功能需求
3.1.1.1 程序界面
界面包括:
1)用户注册界面:用户进行登陆注册的界面;
2)登陆界面:用户登陆/下线的操作界面;
3)聊天界面:用户与用户的即时通讯界面;
4) 文件传输界面:用户与用户的文件传输界面;
5) 语音聊天界面:语音聊天请求界面;
6) 还有其他的提示信息界面;
3.1.1.2 需要具备的功能
1)个人用户实时注册;
2)个人用户分配独立、唯一帐号;
3)用户登陆/下线;
4)提供用户与用户之间实时在线文字聊天的功能;
5)提供用户与用户之间的即时文件传输功能
6) 提供用户与用户之间的即时语音对话功能。
3.1.2 技术难点
在这个设计中最难的还是在网络上传输音频所需要攻克的困难。这个难题主要可以归纳为以下几点:
1)双方之间的网络连接
要进行音频数据的传输,首先就是要建立数据连结。常用的通讯协议中,TCP较可靠,所以用在不允许数据丢失的应用上。而UDP则较多应用于处理速度要求较快、数据传输可靠性要求不是很高的应用上,如数据广播。通信协议的选择取决于所要做的应用的类型。怎样建立网络连接,稳定的接收和发送音频信号的数据流是双方之间能否达成网络连接的关键。
2)音频信号的采集以及回放
在进行音频信号的采集中必须考虑到采样率的问题,声音信号的采样率有8Khz、16Khz、32Khz、44Khz等,每种数据采样率产生的数据量都不一样,越高的采样率产生的数据量越大,所以要选择合适的采样率以适应网络的带宽。
3)音频数字信号的编码与解码
如果把直接采集到的音频信号数据流在网络上进行传输,它所占有的带宽也是十分大的,所以,从节省带宽的角度考虑,很有必要对这样的数据进行压缩。对多媒体信号的压缩有许多可以选择的格式,如mp2、mp3、GSM等等。同样,这里也存在一个对压缩格式进行选择的问题,考虑到音频数据传输的即时性,对传输的音频数据质量的要求,以及各种压缩格式的压缩比率以及进行压缩和解压缩所要耗费的系统资源等方面问题,选择合适的压缩格式就显得尤为重要。
3.2 总体设计
3.2.1 系统结构设计
如图3-1所示,客户端的登陆上线需要通过服务器进行验证,然后再由服务器将已注册的在线用户罗列起来,并显示在在线用户列表中。当不同的用户想彼此通讯时,只要在在线列表中互相点击彼此的名字就能进行文字聊天、语音聊天、群聊、文件传输等。
图3-1 通信系统结构图
3.2.2 系统功能模块设计
如图3-2所示,本程序按模块划分可分为新用户注册模块、用户登陆验证模块、在线用户列表模块、即时通讯功能模块。其中即时通讯功能模块中又包括文字聊天模块、语音聊天模块、文件传输功能模块。
1.新用户的注册模块
新用户的注册模块是完成个人用户实时注册,每个用户将是独立、唯一帐号并将注册的信息储存到数据库对应的表中。
2.用户登陆模块
用户登陆模块是完成用户的登陆,注册用户的帐号名与密码的验证。
3.在线用户列表模块
在线用户列表模块是客户端通过连接服务器的同时并将自身的IP与通讯端口发送的服务器端,再由服务器端发送给每个用户,以完成用户通讯选择对象的可视化操作。
4.即时通讯功能模块
即时通讯功能模块里面包含了文字聊天模块、文件传输功能模块以及语音聊天模块:
文字聊天模块将使客户间完成简单的文本聊天;
文件传输功能使客户可以传递更多信息;
语音聊天模块是本程序的重点,它将使用户间通过网络进行清晰的即时语音通讯,两个互相通讯的用户间的连接为点对点的连接。通过调用Java. sound包进行俩客户间音频的压缩,打包,接收,回放;通过调用J包来将打包好的数据在网络间传送到指定用户的IP端口。
图3-2 通讯系统的功能模块图
第4章 详细设计
4.1 主要功能模块
4.1.1 客户端登陆
客户端与服务器端进行通信。Java系统具有基于Socket的灵活通信机制,因而其应用程序能自由地打开和访问网络上的对象,就象在本地文件系统中一样。
如图4-1所示,用户首先运行程序,将弹出用户登陆界面。如果用户是第一次使用,要先注册为系统用户。这时注册用户将输入自己唯一的用户名和密码,客户端将用户名和密码发送到服务器端,由服务器端去调用数据库进行添加新用户操作,再将返回的信息发回给客户端。注册完成后就可以用户登陆了,输入刚注册的用户名和密码,发送到服务器端,由服务器端去调用数据库来验证是否为注册用户,再将信息返回给客户端。如果返回信息为真表示验证通过将进入客户端的在线用户列表界面,这里将显示所有在线的注册用户。如果返回为假将返回登陆注册界面,重新执行刚才的步骤。
图4-1 客户端登陆的流程图
客户端/服务器端进行通过Socket机制进行连接实现访问数据库验证用户名和密码:
客户端的编程流程
l 打开Socket,新建一个套接
展开阅读全文