湖南科技职业学院软件职业技术学院 教师课时授课计划 教师姓名: 授课班级: 授课课时:6 课程名称:JAVA程序设计 第 9 课 教学循环号:6-2 课题 创建网络服务器应用  各教学环节课时分配 讲授  4 课时   有指导的实践  1 课时   独立实践  1 课时  教学内容 1、识别客户/服务器体系结构性质 2、识别类的性质和语法和创建网络服务器应用所需的方法 3、创建一个网络服务器  重点 识别客户/服务器体系结构性质 识别类的性质和语法和创建网络服务器应用所需的方法  难点 创建一个网络服务器  教具 多媒体  作业 独立实践  授课日期 (校历) 第 4 周星期 5 第 7-8 节   第 5 周星期 1 第1-4 节   第 周星期 第 节   第 周星期 第 节  课后小结 java.net 包的ServerSocket类 用于创建一个套接字以让服务器监听客户的请求 ServerSocket 类的accept()方法返回对客户的套接字的引用,它是Socket 类的对象 Socket 类包含提供对客户流引用的功能,由此检索数据或发送数据到客户。 实现此的Socket类的二个方法是:?getInputStream() ?getOutputStream() 可用 ObjectInputStream 类的readObject()方法读入来自流串行化的对象  详细教学过程附后 详细教学过程: 一、教学目标陈述(5分钟) 识别客户/服务器体系结构的性质 识别类的性质和语法和创建网络服务器应用所需的方法 创建网络服务器应用 二、了解网络协议和Sockets编程的概念 1、客户/服务器体系结构(20分钟) 应用程序开发的客户/服务器 模型是设计将数据的表示与其内部处理和存储分开 客户请求服务,而服务器为这些请求提供服务。客户的请求通过网络从客户传送到服务器 服务器所进行的处理对客户来说是隐藏的。一个服务器可以为多个客户服务 2、协议(20分钟) 网络协议是系统跨网络通信时要遵循的规则和惯例的集合 网络协议的某些例子是TCP/IP, UDP, Apple Talk, 及NetBEUI Java 提供了丰富的网络使能类库,允许应用容易地访问网络资源 3、Sockets(20分钟) 用套接字来处理网络上应用之间的通信连接 传输控制协议 (TCP)提供了客户/服务器应用彼此通信的的可靠的、点对点的通信通道。为在 TCP上通信,客户和服务器程序建立连接并约束在套接字上。 用TCP的套接字模型比其它通信模型(如:NetBEUI 和 Apple Talk)的优越性是服务器可与任何类型客户通信,客户不限于为 UNIX, Windows, DOS, 或 Macintosh 平台 Java 提供以下套接字类: Socket是支持TCP协议的基本类。TCP是一个流网络连接协议。ServerSocket是一个用于监听客户请求的Internet服务器程序的类 4、IP 地址和端口(20分钟) Internet服务器可想象为一组套接字(socket) 类,提供一般称为服务的附加能力 每个服务有相关的端口(port)。端口是一个被处理的服务请求的数字地址如:Web 页面的请求 TCP 协议需要二个数据项: IP 地址和端口号 Internet 协议 (IP) 提供了带有逻辑地址(称为IP 地址)的每个网络设备 Internet协议提供的IP 地址有特定的形式。每个是一个 32位的数,表示为一串四个 8位数字,它的范围是从0 到255。 三、实例分析 9.D.1(45*2) 1、问题的陈述 让我们开发CellGO 需要的谈话应用,以帮助他们的客户与支持的执行者交互。需要用Java 开发有以下功能规格说明的服务器应用: 服务器应能够接收来自客户applet 的消息。 服务器应能够发送确认客户的消息。 服务器应是多线程的并能够迎合任何个数的客户。 服务器应在端口# 1001上运行。 2、确定任务 选择创建网络服务器应用所需的类和方法 识别用户定义的类、它们的目的、及它们的方法 识别用户定义类的数据类型和变量 识别服务器的IP 地址和端口号 识别要处理的异常 识别异常的错误消息 编写服务器程序 保存、编译、及执行程序 检查服务器应用 3、分析解决问题 选择创建网络服务器应用所需的类和方法 由服务器使用类: 创建服务器的过程是创建一个ServerSocket对象,它在一个特殊的端口上监听客户请求 当它辩认到一个有效的请求时,服务器套接字得到客户所创建的一个Socket对象。使用套接字时就发生了服务器与客户之间的通信。 ServerSocket类表示客户/服务器应用中服务器。它提供构造符来创建特定端口上的套接字 二个变元构造符取端口号取第一个变元(将服务所有客户请求的端口),和指出可用连接的最大数的第二个变元。toString() 方法返回关于所创建的套接字的信息 close() 方法关闭套接字。构造符和 close()方法可能会引发IOException, ,必须捕获和处理它 accept()方法通过在它约束的端口监听等待客户连接。当客户企图连接到这个服务器套接字时,该方法接收连接,并返回一个客户套接字。 套接字的输出流是被连接客户的输入流,反之亦然如果在建立连接时出现任何错误,将会引发IOException异常。Java迫使你处理引发的异常 创建服务器: Server类是Thread类的子类 ServerSocket对象监听客户请求。Server类的构造符创建ServerSocket 线程 如果在启动服务器时异常被引发,显示一个错误消息 fail()的通用错误处理例程被定义,以负责所有的异常处理。它有两个变元:(一个Exception对象和一个String对象)打印错误消息并退出 监听客户请求: 服务器的run()方法与实现Runnable接口的所有线程一样,有线程的指令 当服务器获得与客户连接时,ServerSocket类的accept()方法接收此连接 服务器为客户创建用户定义的类Connection的对象,传递Socket对象给此构造符。.客户与服务器之间的通信通过此套接字发生 启动服务器: main() 方法创建一个Server类的对象,启动此线程 连接线程: Connection类创建了一个BufferedReader对象 (fromClient)和一个PrintStream对象(toClient)。它使用getInputStream()方法检索客户的输入;toClient使用getOutputStream()方法使得服务器可以写入到客户。 服务器使用fromClient 对象的readLine()方法,以存储在串变量clientMessage中客户发送的消息。 用 println()方法写出“Received” 消息到此套接字 当注销时,服务器退出循环。 这引起执行finally块,关闭客户套接字。.关闭客户套接字是关键的,因为让连接开着会耗尽服务器内存。Finally块保证连接是关闭的。 ObjectInputStream 类: ObjectInputStream类包含读入持久存储来的类对象的功能 持久存储可以是磁盘或套接字。这由ObjectInputStream 类的readObject()方法完成 readObject()方法的用法 : FileInputStream fp = new FileInputStream(“date.txt”); ObjectInputStream istream = new ObjectInputStream(fp); Date date = (Date) istream.readObject(); 结果: 所需的方法和类是: ServerSocket, Thread, Socket,和ObjectInputStream类 accept(), start(), getInputStream(),和readObject()方法 识别用户定义的类、它们的目的、及它们的方法. 结果: 带有run()方法的 AppServer 类监听客户请求 带有Connect()和 submit() 方法的Connect 类检索客户的数据 Message 类存放客户的消息 识别用户定义类的数据类型和变量 结果: 类 数据类型 变量  AppServer ServerSocket Socket Thread server fromClient serverThread  Connect Message ObjectInputStream message streamFromClient  Message String String String fromUser message userStatus  识别服务器的IP 地址和端口号 结果: 使用本地机的 IP地址 问题中给出的端口号为1001 识别要处理的异常 InvalidClassException: 当Java 运行系统发觉类包含不知道的数据类型时,引发类型为InvalidClassException的异常 NotSerializableException: 当对象需要实现Serializable 接口时,引发类型为NotSerializableException,的异常 IOException: IOException类型的异常通知已出现了某种类型的 I/O异常 结果: 属性 控件  InvalidClass Exception 当调用 readObject() 方法时,  NotSerializable Exception 当调用 readObject() 方法时  IOException 当调用 readObject() 方法时  Exception 当创建 Thread 对象时 当调用 accept()方法时 当调用 getInputStream()方法时   识别异常的错误消息 结果: 异常 消息  InvalidClassException “Message class is invalid”后接异常对象.  NotSerializable Exception “The object is not serializable”后接异常对象.  IOException “Cannot read from the client stream”后接异常对象  Exception (for thread) Cannot start the thread”后接异常对象  异常 消息  Exception (for accept()) “Cannot listen to the client”后接异常对象   (for getInputStream()) “Cannot get the client stream”后接异常对象  编写服务器程序 4、执行验证 保存、编译、及执行程序 检查服务器应用 动作 执行应用并看一看它是否等待客户请求。在另一个命令提示窗口中执行 TestClient 。验证此客户和服务器的通信 四、指导性练习(45分钟) 9.P.1 1、问题陈述 需要用Java开发一个服务器应用,具有以下功能规格说明: 服务器应能够接收来自客户applet的消息. 服务器应能够发送确认客户的消息。此消息应指出是否其名字和口令一样. 服务器应是多线程的,能够迎合任何数目的客户要求. 服务器应存储文件中所有的消息. 服务其应在端口# 1001处运行 2、问题分析 3、验证 五、小结 (10分钟) 六.独立实践(45分钟) 布置学生进行独立实践9.MR.1 根据完成情况进行少量讲解