(精品论文)毕业论文使用java编写网络通信程序_第1页
(精品论文)毕业论文使用java编写网络通信程序_第2页
(精品论文)毕业论文使用java编写网络通信程序_第3页
(精品论文)毕业论文使用java编写网络通信程序_第4页
(精品论文)毕业论文使用java编写网络通信程序_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录摘要2前言4第1章 JAVA概述51.1 JAVA 简介51.2 Java的特性61.2.1 Java中输入/输出流概念61.2.2 Socket 机制61.2.3 Java语言71.2.4 JAVA工具8第2章 如何使用JAVA来进行网络编程102.1使用JAVA来进行网络编程102.2客户机/服务器通信的动机102.3服务器的特权和复杂性112.4无连接的和面向无连接的服务器112.5无状态的和有状态的服务器12第3章 网络通信程序的编写143.1客户机和服务器143.2客户机/服务器通信的实现143.3客户机-服务器范例的应用163.4 Application 同 Applet 的通信163.5 Applet之间的通信163.6程序17第4章 程序调试25后记26参考文献27湖北广播电视大学摘 要Java是当前最流行的程序设计语言之一,它的出现大大地促进了软件产业和互联网的发展。Java之所以如此地流行是因为它是一种简单易学易用的、纯面向对象的、可移植的、安全的、高效的、健壮的、分布式的、多线程的、结构中立的、可解释执行的动态语言。Java拥有包括Sun、IBM在内的世界各大软件厂商的支持,因而发展迅速。随着计算机技术的发展,网络通信显得越来越重要.计算机技术越成熟,对通信的要求越高,本论文主要阐述了使用JAVA编程语言对基于客户/服务器模式的应用编写网络通信程序以及介绍了Application 同 Applet 的通信和Applet之间的通信,讨论了SOCKET机制、Java中输入输出流以及程序实现代码。关键词:JAVA,网络,SOCKET,客户/服务器,APPLETAbstractJava is the most popular programming language, one of which has significantly contributed to the development of software industry and the Internet. Java is so popular is because it is in a simple and easy to learn, and pure object-oriented, portable, safe, efficient, robust, distributed, multi-threaded, structure neutral, can interpreted dynamic language. Java has, including Sun, IBM, including the worlds major software vendors support it, which is developing rapidly. With the development of computer technology, network communications become more and more important. The more sophisticated computer technology, the higher the communication of requirements, present paper mainly elaborates on the use of JAVA programming language based on Client / Server Application network communication procedures and the the Application of communication with the Applet and Applet communication between the discussed SOCKET mechanism, Java in the input and output streams and program implementation code. Keywords: JAVA, Internet, SOCKET, client / server, APPLET前 言Java作为在Internet上最流行的编程语言,其发展非常迅速。从1995年诞生以来,经过短短的几年发展,如今它已不仅仅是一门语言,而已发展为一门技术,包括Java的芯片技术、Java的编译技术、Java的数据库连接技术、基于Java的信息家电的联网技术、企业信息服务的综合求解方案技术等等。Java语言作为一种优秀的面向对象的程序设计语言,具有平台无关性、安全机制、高可靠性和内嵌的网络支持等特点。由于Java语言的这些特点,使得Java语言成为当前网络应用程序编写的首选工具之一。还有人预言,不久的将来,全世界90%的程序代码将用Java语言重写和改写。Java语言和技术的大量使用也促使Java语言本身不断发展。本论文是面向高职专科学生及其他对Java语言和面向对象编程技术感兴趣的读者的。学习本论文前应对计算机有一定的认识,最好了解DOS、Windows等系统的基础操作。可以将本书作为第一门开发语言来学习,获得开发程序的初步经验。对有其他高级语言编程经验的读者,学习本文也会感到得心应手,从中领略Java语言面向对象、易学易用的特点。本文第介绍了面向对象的一些基本概念,引出两种Java程序的介绍,并简述了Java程序的结构和开发过程。介绍Java语言编程的基础知识,包括一般程序设计语言的大部分内容,有基本数据类型、常量、变量、运算符、表达式和流程控制语句、方法(函数)等,还介绍了如何使用Java语言初步编写网络通信程序。计算机语言的学习应是课堂学习和上机实验的有机结合,特别要重视上机实验的环节。优秀的软件开发人员都有大量上机编程的经验,从实践中可学到很多文中没有的东西。第一章 JAVA概述1.1 JAVA 简介 Java是由Sun Microsystems 公司于1995年5月推出的Java程序设计语言所发展出来的程序语言(以下简称Java语言或JAVA),它本身是一种对象导向(Object-Oriented )的程序语言。JAVA目前在手机上且应用最多的就是手机Java游戏。Java也号称是能跨平台使用的语言,这主要是因为Java本身被编译之后,并不是直接产生可执行的码,而是产生一种中间码叫作 ByteCode,这种码必需在透过 Java 的直译器来解读它,才能够真正的被执行,所以只要平台上装有这种Java的直译器,就能解读 ByteCode 也就能执行 Java 编译过的程序,故与Java程序是在那种平台上被编译的,就完全没有干系了。Java 写出来的程序可分为两类,分别是Java Applet 与一般的Application,而Application 这一类就与一般的程序如C+ 的作用是比较类似的,是一个独立可执行的应用程序,像HotJava是一个浏览器,且就是使用Java 程序所发展出来的。最常见的Java程序包括应用程序和Applets。应用程序是单独的程序,诸如HotJava 浏览器软件就是用Java语言编写的。 Applets 类似于应用程序,但是它们不能单独运行,Applets可以在支持Java的浏览器中运行。Applet主要是内置于HTML网页中,在浏览时发挥作用。Java的目标是为了满足在一个充满各式各样不同种机器,不同操作系统平台的网络环境中开发软件。利用Java程序语言,可以在网页中加入各式各样的动态效果。可以放上一段动画,加入声音,也可以建立交互式网页等。Java手机软件平台,Java手机软件平台采用的基本Java平台是CLDC (Connected Limited Device Configuration)和MIDP (Mobile Information Device Profile),是J2ME (Java 2 Micro Edition)的一部分,在中国一般称为“无线Java”技术。此前,有人把它叫做“K-Java”;其实,K-Java的叫法只是Sun公司在开发KVM Java虚拟机时的项目代号,在该技术被正式命名为KVM后,就不再用K-Java了。KJava即J2ME(Java 2 Micro Edition),是Sun公司专门用于嵌入式设备的Java软件。以KJava编程语言为手机开发应用程序,可以为手机用户提供游戏、个人信息处理、电子地图、股票等服务程序。J2ME (Java 2 Micro Edition)是致力于消费产品和嵌入式设备的最佳解决方案。J2ME在设计其规格的时候,遵循着“对于各种不同的装置而造出一个单一的开发系统是没有意义的事”这个基本原则。于是J2ME先将所有的嵌入式装置大体上区分为两种:一种是运算功能有限、电力供应也有限的嵌入式装置(比方说PDA、手机);另外一种是运算能力相对较佳、并且在电力供应上相对比较充足的嵌入式装置(比方说冷气机、电冰箱)。因为这两种区分,所以Java引入了一个叫做Configuration的概念,然后把上述运算功能有限、电力有限的嵌入式装置定义在Connected Limited Device Configuration(CLDC)规格之中;而另外一种装置则规范为Connected Device Configuration(CDC)规格。也就是说,J2ME先把所有的嵌入式装置利用Configuration的概念区隔成两种抽象的型态。1.2 Java的特性 Java技术的开放性、安全性和庞大的社会已有资源,以及其跨平台性,即“编写一次,到处运行”的特点,使Java技术成为智能手机软件平台的事实标准。采用Java技术后,编写应用程序和提供服务的人就不必关心接受其服务的手机采用的是什么操作系统和芯片,只要按照Java的要求去写程序就好了;同样,生产手机的厂商也不必顾虑将来谁来提供增值服务。可以看出,采用Java技术,可以建立完整、高效的无线数据增值服务产业链,从而为用户提供灵活、个性化、内容方式多样的服务。1.2.1 Java中输入/输出流概念过滤流DataInputStream 和DataOutputStream 除了分别作为FilterInputStream 和FilterOutputStream的子类外,还分别实现了接口DataInput 和DataOutput。接口DataInput 中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数,如readBoolean() readInt()、readLine()、readFully()等。接口DataOutput中定义的方法主要是向流中写入基本类型的数据或者写入一定长度的字节数组,如writeChar()、writeDouble() DataInputStream可以从所连接的输入流中读取与机器无关的基本类型数据,用以实现一种独立于具体平台的输入方式;DataInputStream 可以向所连接的输出流写入基本类型的数据。1.2.2 Socket 机制Socket是面向客户/服务器模型设计的,网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。 Socket通常用来实现客户方和服务方的连接。客户程序可以向Socket写请求,服务器将处理此请求,然后通过Socket将结果返回给用户。Socket通信机制提供了两种通讯方式:有联接和无联接方式,分别面向不同的应用需求。使用有联接方式时,通信链路提供了可靠的,全双工的字节流服务。在该方式下,通信双方必须创建一个联接过程并建立一条通讯链路,以后的网络通信操作完全在这一对进程之间进行,通信完毕关闭此联接过程。使用无联接方式时其系统开销比无联接方式小,但通信链路提供了不可靠的数据报服务,不能保证信源所传输的数据一定能够到达信宿。在该方式下,通信双方不必创建一个联接过程和建立一条通讯链路,网络通信操作在不同的主机和进程之间转发进行。1.2.3 Java语言Java语言的优点主要表现在:简单、面向对象、多线程、分布性、体系结构中立、安全性等方面。(1) 简单性Java与C+语言非常相近,但Java比C+简单,它抛弃了C+中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。 Java实现了自动的垃圾收集,简化了内存管理的工作。这使程序设计更加简便,同时减少了出错的可能。(2) 面向对象Java提供了简单的类机制和动态的构架模型。对象中封装了它的状态变量和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而既实现了代码的复用,又提供了一种动态的解决方案。Java是一种完全面向对象的程序设计语言,它除了数组、布尔和字符三个基本数据类型外的其它类都是对象,它不再支持全局变量。在Java中,如果不创建新类就无法创建程序,Java程序在运行时必须先创建一个类的实例,然后才能提交运行。Java同样支持继承特性,Java的类可以从其它类中继承行为,但Java只支持类的单重继承,即每个类只能从一个类中继承。Java支持界面,界面允许程序员定义方法但又不立即实现,一个类可以实现多个界面,利用界面可以得到多重继承的许多优点而又没有多重继承的问题。(3) 多线程多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这样容易实现网络上的实时交互操作。Java程序可以有多个执行线程,如可以让一个线程进行复杂的计算,而让另一个线程与用户进行交互,这样用户可以在不中断计算线程的前提下与系统进行交互。多线程保证了较高的执行效率。 (4) 分布性Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便的访问其他对象。(5) 体系结构中立Java是一种网络语言,为使Java程序能在网络的任何地方运行,Java解释器生成与体系结构无关的字节码结构的文件格式。Java为了做到结构中立,除生成机器无关的字节码外,还制定了完全统一的语言文本,如Java的基本数据类型不会随目标机的变化而变化,一个整型总是32位,一个长整型总是64位。为了使Java的应用程序能不依赖于具体的系统,Java语言环境还提供了用于访问底层操作系统功能的类组成的包,当程序使用这些包时,可以确保它能运行在各种支持Java的平台上。java.lang: 一般的语言包。其中包括用于字符串处理、多线程、异常处理和数字函数等的类,该包是实现Java程序运行平台的基本包java.util: 实用工具包。其中包括哈希表、堆栈、时间和日期等java.io: 基于流模型的输入/输出包。该包用统一的流模型实现了各种格式的输入/输出,包括文件系统、网络和设备的输入/输出等: 网络包。该包支持TCP/IP协议,其中提供了socket、URL和WWW的编程接口。java.awt: 抽象窗口工具集。其中实现了可以跨平台的图形用户界面组件,包括窗口、菜单、滚动条和对话框等。java.applet: 支持applet程序设计的基本包。(6) 安全性用于网络、分布环境下的Java必须要防止病毒的入侵,Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。1.2.4 JAVA工具1 JDK(1) Java编译器Java编译器将Java源代码文件编译成可执行的Java字节码。Java源代码文件的扩展名为 .java,Java编译器把这种扩展名的文件编译成扩展名为.class的文件。源文件中的每个类在编译后都将产生一个class文件,这意味一个Java源代码文件可能编译生成多个class文件。(2) Java解释器Java解释器对编译生成的字节码格式的可执行程序的运行提供支持,它是运行非图形Java程序的命令行工具。(3) Appletviewer它是Java Applet的简单测试工具,可使用它来测试Java Applet程序,而不需要WWW浏览器的支持。2 Visual J+Visual J+ 集成了可视化界面设计、交互式调试、代码编辑、联机帮助信息和介绍如何快速掌握该开发环境的实用向导等多项功能,同时具有能充分利用Active X和COM新技术的优势。利用Visual J+可创建交互性很强的Internet应用程序,是难得的Java 开发系统。网络上的系统结构多为客户/服务器模式,服务器端负责数据和图像等的存储、维护、管理以及传递,客户端则负责人机界面的操作、送出需求及显示收回的数据。第二章 如何使用JAVA来进行网络编程2.1使用JAVA来进行网络编程1) 由于客户端通过IE同服务器建立联系,所以客户端使用Applet,服务器端使用Application;2) 服务器应设置成多线程,应答多个客户的请求;3) 两端通信使用SOCKET机制。2.2客户机/服务器通信的动机客户机-服务器范例的基本动机来自聚集问题。为了理解这一 问题,设想一个人试图在分离的机器上启动两个程序并让它们进行通信,还要记住,计算机的运行要比人的速度快许多数量级。在某人启动第一个程序后,该程序开始执行并向其对等程序发送消息,在几个微妙内,它便发现对等程序还不存在,于是就发出一条错误消息,然后退出。在这时,某个人启动了第二个程序,不幸的是,当第二个程序开始执行时,它发现对等程序已经终止执行了,即便是两个程序连续重新试着通信,但由于它们每个程序执行的速度那么快。因而它们在同一瞬间向对方发送消息的概率是很低的。 客户机-服务器模型是这样解决这种聚集问题的。它要求在任何一对进行通信的应用进程中,有一方必须在启动执行后(无限期地)等待对方的联系,这种解决方案是重要的,因为TCP/IP自己对入呼叫通信是不会响应的。 由于TCP/IP并不是提供在一个报文到达后自动创建运行程序的任何机制,因此一个程序必须在任一请求到来前就在那里等待以接受通信。 因此,为确保计算机已准备好了进行通信,多数系统管理员都安排通信程序在操作系统引导时就自动启动。每个程序都一直运行下去,以便等待下一个服务请求的到来(此服务是该程序提供的)。 2.3服务器的特权和复杂性由于服务器软件往往需要访问操作系统保护的数据、计算以及协议端口,因此服务器软件经常需要一些特定的系统特权。因为服务器软件的执行带有特定的系统特权,为保证这样不会粗心地将特权传递给使用它的客户机,必须要小心行事。例如,一个作为特权程序运行的文件服务器,它必须要含有这样的程序代码,以检查某个给定的文件是否可以被某个给定的客户机访问,服务器不能依赖那些通常的操作系统检查,这是因为它的特权状态将不理会那些检查。 服务器必须含有处理以下问题的代码: 鉴别验证客户机的身份 授权确定某个给定的客户机是否被允许访问服务器所提供的服务 数据安全确保数据不被无意泄露或损坏 保密防止对有关个人的信息进行未授权的访问 保护确保网络应用程序不能滥用系统资源 对那些执行高强度计算或处理大量数据的服务器,如果并发地处理请求,其运行会更有效。这种特权和并发操作的结合使服务器的设计与实现较客户机困难。 在设计客户机应用软件时,要包含这样一些参数,以便允许拥护全面指明目的机器以及目的协议端口号的参数。 全参数化在测试新的客户机或服务器时特别有用,因为它允许独立于已在使用的现有软件来进行测试。例如,某个程序员可以构建一个TELNET客户机和服务器对(pair),使用非标准的协议端口调用它们,这样不打扰标准服务就可对软件进行测试。在测试过程中,其他用户可以继续访问旧的TELNET服务而不受影响。2.4无连接的和面向无连接的服务器在程序员设计客户机服务器软件时,他们必须在两种类型的交互中做出选择:无连接的风格或面向连接的风格。这两种风格的交互直接对应与TCP/IP协议族所提供的两个主要的运输协议。如果客户机和服务器使用UDP进行通信,那么交互就是无连接的;如果使用TCP,则交互就是面向连接的。 从应用程序员的角度看,无连接的交互和面向连接的交互之间的区别是非常重要的,因为这决定了下层系统所提供的可靠性等级。TCP提供了穿过一个互连网络进行通信所需要的全部的可靠性。它验证数据的到达,对未到达的报文要自动进行重传。它还计算数据上的校验和,以保证数据在传输过程中没有损坏。它使用序列号以确保数据按序到达并自动忽略重复的分组。它提供了流量控制以确保发送方发送数据的速度不要超过接受方的承受能力。最后,如果下层网络因任何原因变得无法运作,TCP将通知客户机和服务器双方。 与TCP相比,使用UDP的客户机和服务器在可靠传输上没有任何保证。某个客户机发送一个请求,这个请求可能丢失、重复、延迟或者传递失序。类似地,服务器发回给客户机的响应也可能丢失、重复、延迟或交付失序。客户机和(或)服务器应用程序必须采取合适的行动以检查并更正这样的差错。 UDP可能是不可信的,这是因为它提供的是尽最大努力交付(best effort delivery)。UDP并不引入差错,它只是依靠下层的IP互连网络来交付分组。而IP则要依赖于下层的硬件网络和中间的一些网关。从程序员的角度看,使用UDP的后果是:如果下层的互连网络工作得,UDP也就工作得好。例如,在一个本地环境下UDP工作得好,因为在本地环境下,可靠性差错很少发生。差错往往在通信延伸到一个广域互连网时才发生。 程序员有时会犯这样的错误,即选择了无连接的运输。例如,UDP来构建应用程序,并仅仅在一个局域网下测试这个应用程序。因为一个局域网很少甚至从不迟延分组、丢失分组或者将它们交付失序,这样,应用软件好像工作得很好。然而,如果同样的软件要穿过一个广域互连网络使用,就可能失败或产生不正确的结果。 初学者以及大多数有经验的专业人员喜欢使用面向连接风格的交互。面向连接的协议使编程简单,把程序员从检查和改正差错的责任中解脱出来。实际上,在个像UDP这样的无连接的互连网报文协议中加入可靠性并非容易之举,它要求具有相当的协议设计经验。 应用程序也经常只使用UDP。如果:(1)应用协议指明必须使用UDP(假定应用协议已设计了处理可靠性和交付差错的内容)。(2)应用程序协议要依靠硬件进行广播或组播。(3)应用协议不能容忍TCP虚电路的额外的计算开销或时延要求。我们可作如下的概括: 在设计客户机-服务器应用时,强烈建议初学者使用TCP,因为TCP提供了可靠的、面向连接的通信。程序仅在以下情况使用UDP。如果应用协议处理可靠性,或应用协议不能容忍虚电路的额外开销。 2.5无状态的和有状态的服务器 由服务器维护的、关于它与客户机正在进行的交互的信息称为状态信息。不保持任何状态信息的服务器称作无状态服务器(stateless server),而与此相反的称为有状态的服务器(stateful server)。 期望获得高效率促使设计者在服务器中保存状态信息。在服务器中保持少量信息可减少客户机和服务器间交换的报文的大小,还能允许服务器快速地响应请求。从本质上说,状态信息允许服务器记住客户机以前申请了什么,并在每个新的请求到来时,计算出一个增加的响应。相反,采用无状态服务器的动机是协议的可靠性:如果报文丢失、重复或交付失序或者如果客户机计算机崩溃或重启动,则一个服务器中的状态信息就会变得不正确。在服务器计算响应时,若使用了不正确的状态信息,可能产生不正确的响应。 一个有状态的服务器的例子: 考虑一个文件服务器,它允许客户机远程访问保存在本地磁盘中的信息。服务器作为一个应用程序运作,它等待在网络上的某个客户机与它联系。客户机发送以下两种请求之一,它要么发送一个从某个指定文件中获取数据的请求或者发送一个在指定文件中存储数据的请求。服务器执行所请求的操作并向客户机发回响应。 一方面,如果文件服务器是无状态的,它是不维护事物所处理的信息。从客户机发来的每个报文(请求服务器从某个文件获取数据),都必须指明文件全名(名字可能相当长)、想要获取的数据在文件内的位置、以及想要获取的字节数。类似地,每个要求服务器在某个文件中存储数据的请求也必须指明文件全名、数据将存储在文件中的位置、以及想要存储的数据。 另一方面,如果服务器为它的客户机维护了状态信息,它就不必在每个报文中都传递文件名。服务器维护着一张表,该表保持着关于当前正被访问的文件的状态信息。 在理想的情况下,只要网络能可靠地交付所有的报文,并且计算机从不崩溃,则在这种情况下,使服务器为每个进行着的交互保持少量状态信息,就可以使交互的报文小些,并且处理也简单些。 一般来说,对保持正确的状态信息这个问题只有用复杂的协议才能解决,这种协议解决不可靠的交付和计算机系统重启动的问题。概括地说: 在真实的互连网中,机器可能崩溃或重启动,而报文可能丢失、重复、或交付失序。采用有状态的设计会导致复杂的应用协议,而这种应用协议难于设计、理解和正确编程。 一个服务器到底是无状态还是有状态的呢?这一问题更多地集中在应用协议上,而不是在实现上。如果应用协议指明某个特定报文的意义在某种方式上依赖于先前的一些报文,这样就不可能提供一种无状态的交互。 从本质上说,无状态的问题关注于应用协议是否承担可靠交付的责任。要避免出问题并使交付可靠,应用协议的设计者必须确保每个报文决无二义性,也就是说,一个报文既不能依赖于被按序交付,也不能依赖于前一个报文已被交付,关键是协议设计者必须这样构建交互,即无论一个请求何时到达或多次到达,服务器都应给出相同的响应,数学家们用术语幂等(idempotent)指一个总是产生相同结果的数学运算。我们用这个术语制这种协议,它让服务器对某个给定报文发出相同的响应,而不管该报文到达几次。 如果一个互连网中的下层网络可能使报文重复、延迟或不按序交付,或者运行客户机应用程序的计算机可能会意外崩溃,那么对这样的网络,服务器应是无状态的,只有应用协议设计成让操作是幂等的,服务器才是无状态的。第三章 网络通信程序的编写从技术上讲,服务器是一个程序而不是一块硬件。然而计算机用户经常(错误地)将这一术语用于指负责运行某个特定的服务器程序的计算机。例如,他们可能说:“那台计算机是我们的文件服务器”,这时他们实际上指的是:“那台计算机运行我们的文件服务器程序”。3.1客户机和服务器 许多程序并不准确符合客户机或服务器的定义,一个服务器程序也许需要访问网络服务,而这个服务要求该程序作为一个客户机。例如,假设我们的文件服务器程序需要获得本日的时间,以便在文件中打上访问时间的标记。我们还假设运行服务器的系统没有日期时间,为了获得这个时间,该服务器就作为客户机向日期时钟服务器发出请求。 在一个具有许多服务器的网络环境中,经常可以发现某一个应用的服务器对另一个应用则是客户机,当然,设计人员必须小心从事以避免在这些服务器之间出现循环的依赖关系。因此: 客户机服务器范例将进行通信的应用程序分为两类即:要么是客户机要么是服务器,这取决于它是否发起通信。除了为标准应用设计的客户机和服务器软件外,许多TCP/IP用户为其自定义的非标准的应用构建了客户机和服务器软件。 初学者以及多数有经验的程序员使用TCP在客户机与服务器之间运输报文,因为TCP提供了互连网络环境所需要的可靠性。程序员只有在TCP不能解决问题时才选择UDP。 在服务器中保持状态信息可以提高效率。然而,如果客户机意外崩溃或者下层的传输网络允许重复、延迟或分组丢失则状态信息会消耗资源或者变得不正确。因此,多数应用协议设计者努力减少状态信息。如果应用协议不能使操作成为幂等的,就可能不能使用无状态的服务器。 各种程序不能简单地划分为客户机和服务器这两类,这是因为许多程序同时具有客户机和服务器这两种功能。一个程序对某个服务来说是服务器,但它又可作为客户机访问其他的服务。 3.2客户机和服务器的实现在应用层,客户-服务器(Client/Server)是典型的Web信息系统模式。客户-服务器一词在20世纪80年代首先被提出,起初,主要指个人计算机和Web的连接,在互联网中,主要指计算机系统之间通过Web的信息交互传递模式;客户是指信息服务的索取方,服务器指服务的提供方,根据软件的不同设置,一台计算机可以是客户也可以是服务器。随着Web科技的发展,客户-服务器软件框架成为一种灵活、分布式和模块化的信息系统结构。与客户-服务器软件框架相反的结构是大型集中式主机。这种结构将主要运算操作放在中心计算机上。同集中式大型计算系统比较,客户-服务器结构的主要优点是提供了良好的实用性、灵活性、交互性和可扩展性。客户-服务器以数据库服务器取代集中式文件共享进而实现了计算机系统之间的松耦合。 由于客户并非完全依靠服务器,计算机之间可以更动态地进行协作。这样扩大了计算机联网的范围,同时降低了Web流量。客户和服务器之间在企业内部网(Intranet)中主要通过远程过程调用(remote procedure call)和SQL数据库检索语言,在因特网(Internet)上可以通过HTTP、telnet、FTP等协议进行通信。Web程序客户-服务器模式衍生出了不同体系结构,如双层结构、三层结构和分布式结构等。它们适用于不同的情况。双层结构(2-tier architecture),通常将客户端程序作为界面,而将数据库置于服务器上;一台服务器上的数据库同时支持多个用户(一般是个人计算机),数据处理过程由客户界面和数据库管理系统(database management systems)协调进行,数据库管理系统(如Oracle,DB2,MySQL等)提供现成的方法供用户调用,用户也可以在其基础之上进行开发;双层结构的Web系统适用于少量用户在局域网内对数据进行操作,但是当客户数量超过数百时,由于双层结构系统和大量的客户保持联系,处理速度往往难以满足要求,另外,由于双层结构系统对数据库的依赖性很强,系统的维护和更新常常令人头疼,当服务器的机器升级或更新时,软件系统的重新安装和调试非常麻烦。 三层结构(3-tier architecture)弥补了双层结构的不足;在客户界面和数据库之间加入了完善系统功能的中间层(middle tier),典型的中间层可以是事务处理控制器(transaction processing monitor)、消息服务器(message server)、应用服务器(application server)等;在客户界面与数据库之间,中间层支持数据检索、程序的分布式运行和数据库状态控制,中间层像是数据的周转和分配站,客户界面不再直接获取数据,而是通过中间层提供的接口间接访问和更新数据,中间层可以协调和优化各种处理进程,这样,对于大量客户使用的系统,三层结构的主要特点是能提高用户的使用效率,同时提高程序的可移植性;由于中间层使用标准化的接口,使Web程序无需改动就能在不同机器上运行,由于三层结构系统比双层结构复杂,程序开发人员需要掌握和考虑多种技术因素,例如如何维护数据交换一致,如何保证安全等。3.3客户机-服务器范例的应用客户机-服务器范例用发起通信的方向来对程序分类,即区别一个程序是客户机还是服务器。一般地讲,发起对等通信的应用程序叫客户机。端用户往往在其使用网络服务时调用客户机软件。多数客户机软件由常规的应用程序构成。客户机应用程序每次执行都要向服务器进行联系、发送申请已经等待响应。当响应到达时,客户机再继续处理。客户机常常较服务器易于构建,它的运行往往并不需要特殊的系统特权。 比较而言,服务器是等待来自客户机的入呼叫通信请求的任何一种程序。服务器接收某个客户机的请求,执行所需的计算然后将结果返回给客户机。3.4 Application 同 Applet 的通信两端通过Socket机制进行连接:1. 客户端的编程流程:(1) 打开Socket,新建一个套接字;(2) 为套接字建立一个输入和输出流;(3) 根据服务器协议从套接字读入或向套接字写入;(4) 清除套接字和输入/输出流;2) 服务器端的编程流程:(1) 打开Server Socket,创建一个服务器型套接字和一个普通套接字,服务器型套接字在指定端口为客户端请求的Socket 服务;(2) 使用ServerSocket类的accept()方法使服务器型套接字处于监听状态并把监听结果返回给普通套接字;(3) 为该普通套接字创建输入和输出流;(4) 从输入和输出流中读入或写入字节流,进行相应的处理,并将结果返回给客户端;(5) 在客户端和服务器工作结束后关闭所有的对象,如服务器型的套接字,普通套接字,输入和输出流。正是由于Java系统具有基于Socket的灵活通信机制,因而其应用程序能自由地打开和访问网络上的对象,就象在本地文件系统中一样。3.5 Applet之间的通信Applet之间的通信使用Applet Context类的getApplet()方法。只要在程序中加入 Applet oneapplet=getAppletContext().getApplet(“first”);便可使用name为first的Applet中的方法了。在该课题中大量使用了该种通信方法,因为专门同服务器端通信的 Applet中包含接收信息方法和发送信息方法,所有客户端的负Applet都要使用责通信的Applet中的方法,所以客户端的Applet同负责通信的Applet必须进行通信。3.6 程序/服务器端程序S.java 负责与客户端通信import java.io.*;import .*;import java.lang.*;import T2;class ThreadEchoHandler extends Thread /创建线程T2 theT2=new T2();Socket incoming;int counter;ThreadEchoHandler(Socket i,int c) incoming=i;counter=c; public void run()tryDataInputStream in=new DataInputStream(incoming.getInputStream();DataOutputStream out=new DataOutputStream(incoming.getOutputStream();System.out.println (hello); boolean done=false;while(!done)String aa= ;String str=in.readUTF(); /从客户端得到字符串/在此加入各自的服务程序System.out.println (str);theT2.pass(str); /解码theT2.tongji( ); /修改监控库中的信息aa=theT2.guan( );/操纵数据库System.out.println (string z is:+aa);if(pareTo(null)!=0 ) /若是查询数据库,返回查询后的结果/若不是查询数据库,不向客户端输出信息 out.writeUTF(aa);out.flush( ); /while incoming.close( ); /线程关闭/trycatch(IOException e)System.out.println(e);/end run/-class S public static void main(String args) int i=1;tryServerSocket s=new ServerSocket(1111);for(; ;)Socket incoming=s.accept( );System.out.println(connect: +i);new ThreadEchoHandler(incoming,i).start( );i+;catch(Exception e) System.out.println(e); /客户端通信小应用程序 Echo.javaimport java.io.*;import .*;import java.awt.*;import java.applet.*;public class Echo extends AppletTextArea ta;Socket echoSocket;DataOutputStream os;DataInputStream is;String Line;public void init( ) setBackground(Color.white);ta=new TextArea(5,80);ta.setEditable(false);add(ta); tryechoSocket=new Socket(1,1111); /与服务器建立连接catch(IOException e)System.out.println(error);public void st(String stri) /发送字符串的方法try DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream();DataInputStream is=new DataInputStream(echoSocket.getInputStream(); os.writeUTF(+ stri ); /向服务器输送stringos.flush();catch(IOException e)System.out.println( error:+e); public String st1() /接收字符串的方法String Line=;try DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream();DataInputStream is=new DataInputStream(echoSocket.getInputStream(); Line=is.readUTF(); /从服务器读来的信息ta.appendText(+Line); /在文本域中输出信息catch(IOException e)System.out.println( error:+e); return Line;所谓socket通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过套接字向网络发出请求或者应答网络请求。 Socket和ServerSocket类库位于包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。 下面给出一个最简单的Socket通信的例子供初学者参考: 服务器端:ServerDemo.java Java代码package com.lanber.socket;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .ServerSocket;import .Socket;public class ServerDemo /* * 注意:Socket的发送与接收是需要同步进行的,即客户端发送一条信息,服务器必需先接收这条信息, * 而后才可以向客户端发送信息,否则将会有运行时出错。 * param args */ public static void m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论