十二、网络编程基础.ppt_第1页
十二、网络编程基础.ppt_第2页
十二、网络编程基础.ppt_第3页
十二、网络编程基础.ppt_第4页
十二、网络编程基础.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

网络编程基础 2020 1 27 1 教学目标 1 Java与Internet2 使用InetAddress3 使用URL4 Socket通信5 数据报通信 2020 1 27 2 TCP IP 传输控制协议 网际协议 是Internet的主要协议 定义了计算机和外设进行通信所使用的规则 TCP IP网络参考模型包括五个层次 应用层 传输层 网络层 链路层 物理层 ISO OSI网络参考模型则包括七个层次 应用层 表示层 会话层 传输层 网络层 链路层 物理层 1 Java与Internet 网络基本概念 物理层 2020 1 27 3 大多数基于Internet的应用程序被看作TCP IP网络的最上层 如 ftp http smtp pop3 telnet nntp等 网络层对TCP IP网络中的硬件资源进行标识 连接到TCP IP网络中的每台计算机 或其他设备 都有唯一的地址 这就是IP地址 IP地址实质上是一个32位的整数 通常以 d d d d 的形式表示 每个d是一个8位整数 在TCP IP网络中 不同的机器之间进行通信时 数据的传输是由传输层控制的 这包括数据要发往的目标机器及应用程序 数据的质量控制等 TCP IP网络中最常用的传输协议就是TCP TransportControlProtocol 和UDP UserDatagramProtocol 1 Java与Internet 网络基本概念 2020 1 27 4 1 Java与Internet 网络基本概念 一台机器只通过一条链路连接到网络上 但一台机器中往往有很多应用程序需要进行网络通信 如何区分呢 这就要靠网络端口号 port 了 端口号是一个标记机器的逻辑通信信道的正整数 端口号不是物理实体 IP地址和端口号组成了所谓的Socket Socket是网络上运行的程序之间双向通信链路的最后终结点 它是TCP和UDP的基础 IP与端口号组合而得出的Socket 可以完全分辨Internet上运行的程序 2020 1 27 5 端口号是用一个16位的整数来表达的 其范围为0 65535 其中0 1023为系统所保留 专门给那些通用的服务 well knownservices 如http服务的端口号为80 telnet服务的端口号为23 ftp服务的端口为21 因此 当我们编写通信程序时 应选择一个大于1023的数作为端口号 以免发生冲突 1 Java与Internet 网络基本概念 2020 1 27 6 1 Java与Internet 网络基本概念 传输层通常以TCP和UDP协议来控制端点到端点的通信 用于通信的端点是由Socket来定义的 Socket是由IP地址和端口号组成的 传输控制协议 TCP 是在端点与端点之间建立持续的连接而进行通信 建立连接后 发送端将发送的数据印记了序列号和错误检测代码 并以字节流的方式发送出去 接收端则对数据进行错误检查并按序列顺序将数据整理好 数据在需要时可以重新发送 因此整个字节流到达接收端时完好无缺 这与两个人打电话的情形是相似的 TCP协议具有可靠性和有序性 并且以字节流的方式发送数据 它通常被称为流通信协议 2020 1 27 7 1 Java与Internet 网络基本概念 与TCP协议不同 用户数据报协议 UDP 则是一种无连接的传输协议 利用UDP协议进行数据传输时 首先需要将要传输的数据定义成数据报 Datagram 在数据报中指明数据所要达到的Socket 主机地址和端口号 然后再将数据报发送出去 这种传输方式是无序的 也不能确保绝对的安全可靠 但它很简单也具有比较高的效率 这与通过邮局发送邮件的情形非常相似 TCP协议和UDP协议各有各的用处 当对所传输的数据具有时序性和可靠性等要求时 应使用TCP协议 当传输的数据比较简单 对时序等无要求时 UDP协议能发挥更好的作用 如ping 发送时间数据 语音 图像等 2020 1 27 8 1 Java与Internet 网络基本概念 2020 1 27 9 域名 下面是我们常用的域名解释 com是company的缩写 代表商业组织 gov是goverment的缩写 代表政府部门 net是network的缩写 代表主要网络支持中心 提供网络服务业务 int是international的缩写 代表国际组织 edu是education的缩写 代表教育部门 mil是military的缩写 代表军事部门 org是organization的缩写 代表社会组织 多为非赢利性的 2020 1 27 10 1 Java与Internet Java中的网络支持 针对网络通信的不同层次 Java提供的网络功能有四大类 InetAddress URL Sockets Datagram InetAddress面向的是IP层 用于标识网络上的硬件资源 URL面向的应用层 通过URL Java程序可以直接送出或读入网络上的数据 Sockets和Datagram面向的则是传输层 Sockets使用的是TCP协议 这是传统网络程序最常用的方式 可以想象为两个不同的程序通过网络的通信信道进行通信 Datagram则使用UDP协议 是另一种网络传输方式 它把数据的目的地纪录在数据包中 然后直接放在网络上 2020 1 27 11 1 Java与Internet Java中的网络支持 包中的主要的类和可能产生的异常包括 面向IP层的类 InetAddress面向应用层的类 URL URLConnection面向网络层的类 TCP协议相关类 Socket ServerSocketUDP协议相关类 DatagramPacket DatagramSocket MulticastSocket可能产生的异常 BindException ConnectException MalformedURLException NoRouteToHostException ProtocolException SocketException UnknownHostException UnknownServiceException 2020 1 27 12 类InetAddress可以用于标识网络上的硬件资源 它提供了一系列方法以描述 获取及使用网络资源 InetAddress类没有构造函数 因此不能用new来构造一个InetAddress实例 通常是用它提供的静态方法来获取 publicstaticInetAddressgetByName Stringhost host可以是一个机器名 也可以是一个形如 d d d d 的IP地址或一个DSN域名 publicstaticInetAddressgetLocalHost publicstaticInetAddress getAllByName Stringhost 这三个方法通常会产生UnknownHostException例外 应在程序中捕获处理 以下是InetAddress类的几个主要方法 publicbyte getAddress 获得本对象的IP地址 存放在字节数组中 publicStringgetHostAddress 获得本对象的IP地址 d d d d publicStringgetHostName 获得本对象的机器名 2 使用InetAddress 2020 1 27 13 下面的例子演示Java如何根据域名自动到DNS 域名服务 上查找IP地址 与DNS服务器的连接减至一行 publicclassgetIP publicstaticvoidmain Stringargs InetAddresspku null try pku InetAddress getByName catch UnknownHostExceptione System out println pku 2 使用InetAddress getIP java 2020 1 27 14 通过InetAddress 可以获取本机的IP地址 publicclassgetLocalHostTest publicstaticvoidmain InetAddressmyIP null try myIP InetAddress getLocalHost catch UnknownHostExceptione System out println myIP 2 使用InetAddress getLocalHostTest java 2020 1 27 15 3 使用URL URL是统一资源定位符 UniformResourceLocator 的简称 它表示Internet上某一资源的地址 Internet上的资源包括HTML文件 图象文件 声音文件 动画文件以及其他任何内容 并不完全是文件 也可以是一个对数据库的查询等 通过URL 就可以访问Internet 浏览器或其他程序通过解析给定的URL就可以在网络上查找相应的文件或其他资源 2020 1 27 16 3 使用URL 一个URL包括两部分内容 协议名称和资源名称 中间用冒号隔开 Protocol resourceName如 协议名称指的是获取资源时所使用的应用层协议 如http ftp file等 资源名称则是资源的完整地址 包括主机名 端口号 文件名或文件内部的一个应用 当然 并不是所有的URL都必须包含这些内容 2020 1 27 17 3 使用URL 在Java中构造URL 在包中 提供了类URL来表示URL 类URL提供了很多构造方法来生成一个URL对象 publicURL Stringspec publicURL URLcontext Stringspec publicURL Stringprotocol Stringhost Stringfile publicURL Stringprotocol Stringhost intport Stringfile 以下是一些具体的构造实例 URLurl1 newURL 2020 1 27 18 当创建URL时发生错误 系统会产生例外MalformedURLException 这是非运行时例外 必须在程序中捕获处理 URLurl1 url2 url3 try url1 newURL file D image example gif url2 newURL 3 使用URL 在Java中构造URL 2020 1 27 19 一个URL对象生成后 其属性是不能被改变的 但可以通过它给定的方法来获取这些属性 publicStringgetProtocol 获取该URL的协议名publicStringgetHost 获取该URL的主机名publicStringgetPort 获取该URL的端口号publicStringgetPath 获取该URL的文件路径publicStringgetFile 获取该URL的文件名publicStringgetRef 获取该URL在文件中的相对位置publicStringgetQuery 获取该URL的查询名 3 使用URL URL的基本方法 ParseURL java 2020 1 27 20 3 使用URL URL和InetAddress的联合使用 Applet中的网络通信需要将URL和InetAddress联合使用来得到相关的IP地址 通过类Applet的getCodeBase 方法获得提供它的主机的URL实例利用类URL的getHost 方法得到主机名利用类InetAddress的getByName 得到该主机的IP地址通过IP地址 就可以进行网络通信 TCP UDP URLurl getCodeBase Stringhost url getHost Try InetAddressaddress InetAddress getByName host catch Exceptione Try DatagramSocketsocket newDatagramSocket DatagramPacketpacket newDatagramPacket buf length address port socket send packet catch Exceptione 2020 1 27 21 3 使用URL 通过URL读取www信息 通过URL类提供的方法openStream 就可以读取一个URL对象所指定的资源 publicfinalInputStreamopenStream 方法openStream 与指定的URL建立连接并返回一个InputStream对象 将URL位置的资源转成一个数据流 通过这个InputStream对象 就可以读取资源中的数据 2020 1 27 22 3 使用URL 通过URL读取www信息 importjava io publicclassURLReader publicstaticvoidmain Stringargs try URLgis newURL URLReader java 2020 1 27 23 3 使用URL URL连接 通过URL类提供的方法openConnection 就可以获得一个URL连接 URLConnection 对象 publicURLConnectionopenConnection 通过URL的方法openStream 只能从网络上读取资源中的数据 通过URLConnection类 可以在应用程序和URL资源之间进行交互 既可以从URL中读取数据 也可以向URL中发送数据 URLConnection类表示了应用程序和URL资源之间的通信连接 try URLurl newURL URLConnectionuc url openConnection catch MalformedURLExceptione1 catch IOExceptione2 2020 1 27 24 3 使用URL URL连接 publicclassURLConnectionReader publicstaticvoidmain Stringargs try URLgis newURL URLConnectionReader java 2020 1 27 25 通过URLConnection对象获取的输入流和输出流 可以与现有的CGI程序进行交互 URL和URLConnection的区别在于前者代表一个资源的位置 后者代表一种连接 3 使用URL URL连接 URLurl newURL 2020 1 27 26 3 使用URL 其他URL类 URLConnection类的其他方法以及其他URL类 URLClassLoader URLDecoder URLEncoder URLStreamHandler HttpURLConnection JarURLConnection ContentHandler 的使用 需要大家在以后的实践中去学习 2020 1 27 27 4 Socket通信 在Java中 基于TCP协议实现网络通信的类有两个 在客户端的Socket类和在服务器端的ServerSocket类 1 客户端socket在客户端通过规定一个主机和端口号创建一个socket实例 连到服务器上 2 服务器端ServerSocket在服务器端通过指定一个用来等待的连接的端口号创建一个ServerSocket实例 ServerSocket类的accept方法使服务器处于阻塞状态 等待用户请求 2020 1 27 28 类Socket构造方法 publicSocket Stringhost intport publicSocket InetAddressaddress intport publicSocket Stringhost intport InetAddresslocalAddr intlocalPort publicSocket InetAddressaddress intport InetAddresslocalAddr intlocalPort 这些方法都将抛出例外IOException 程序中需要捕获处理 4 Socket通信 2020 1 27 29 类SocketSocket的输入 输出流管理publicInputStreamgetInputStream publicvoidshutdownInput publicOutputStreamgetOutputStream publicvoidshutdownOutput 这些方法都将抛出例外IOException 程序中需要捕获处理 关闭Socketpublicvoidclose throwsIOException设置 获取Socket数据publicInetAddressgetInetAddress publicintgetPort publicvoidsetSoTimeout inttimeout 这些方法都将抛出例外SocketException 程序中需要捕获处理 4 Socket通信 2020 1 27 30 类ServerSocket构造方法 publicServerSocket intport publicServerSocket intport intbacklog 支持指定数目的连接publicServerSocket intport intbacklog InetAddressbindAddr 这些方法都将抛出例外IOException 程序中需要捕获处理 主要方法publicSocketaccept 等待客户端的连接publicvoidclose 关闭Socket设置 获取Socket数据publicInetAddressgetInetAddress publicintgetLocalPort publicvoidsetSoTimeout inttimeout 这些方法都将抛出例外SocketException 程序中需要捕获处理 4 Socket通信 2020 1 27 31 4 Socket通信 无论一个Socket通信程序的功能多么齐全 程序多么复杂 其基本结构都是一样的 都包括以下四个基本步骤 1 在客户方和服务器方创建Socket ServerSocket 2 打开连接到Socket的输入 输出流 3 利用输入 输出流 按照一定的协议对Socket进行读 写操作 4 关闭输入 输出流和Socket 通常 程序员的主要工作是针对所要完成的功能在第3步进行编程 第1 2 4步对所有的通信程序来说几乎都是一样的 2020 1 27 32 4 Socket通信 2020 1 27 33 4 Socket通信 1 建立Socket在客户端 try Socketclient newSocket host 9000 catch IOExceptione 在服务器端 try ServerSocketserver newServerSocket 9000 catch IOExceptione Socketsocket null try socket server accept 等待客户端连接 catch IOExceptione 2020 1 27 34 2 在客户端和服务器端同时打开输入 输出流类Socket提供了方法getInputStream 和getOutputStream 来得到Socket对应的输入 输出流以进行数据读写操作 它们分别返回InputStream对象和OutputStream对象 为了便于读写数据 应在返回的输入 输出流对象上建立过滤流 如DataInputStram DataOutputStram BufferedInputStream BufferedOutputStream PrintStream InputStreamReader OutputStreamWriter BufferedReader BufferedWriter PrintWriter等 BufferedReader newBufferedReader newInputStreamReader socket getInputStream BufferedWriter newBufferedWriter newInputStreamWriter socket getOutputStream 3 关闭输入 输出流和Socket在客户端和服务器端分别关闭输入 输出流和Socket 先关闭所有相关的输入 输出流 再关闭Socket 4 Socket通信 2020 1 27 35 2020 1 27 36 4 Socket通信 SingleTalkClient java 看看这个谈话程序的运行效果 2 客户端 SingleTalkServer java 1 服务器端 2020 1 27 37 4 Socket通信 简单的Client Server 在本地机器上测试网络程序用回绕地址Socketsocket newSocket 127 0 0 1 4444 建立socket连接后 还应该建立输入输出数据流 要控制好输入 输出流和Socket关闭的时间 如果网络的一端已经关闭 另一端读到null 在运行时 服务器端程序一般应先行启动 2020 1 27 38 解决方案一 在一台计算机上一次启动多个服务器程序 只要端口号不同 myserver1myclient1myserver2myclient2 4 Socket通信 支持多Client 2020 1 27 39 解决方案二 将服务器写成多线程的 不同的处理线程为不同的客户服务 主线程只负责循环等待 处理线程负责网络连接 接收客户输入的信息 主线程while true acceptaconnection createathreadtodealwiththeclient endwhile 4 Socket通信 支持多Client 2020 1 27 40 4 Socket通信 支持多Client serverSocket newServerSocket 4444 while listening Socketsocket socket serverSocket accept 程序将在此等候客户端的连接newMultiTalkServerThread socket clientNumber start clientNumber 记录客户数目 serverSocket close classMultiTalkServerThreadextendsThread publicMultiTalkServerThread Socketsocket intclientNumber this socket socket this clientNumber clientNumber 1 publicvoidrun 2020 1 27 41 4 Socket通信 支持多Client MultiTalkServer java 2020 1 27 42 4 Socket通信 Client之间通过Server通信 可以在服务器端将与各客户进行通信的Socket和线程管理起来 从而各客户之间可以在服务器端的协助下进行通信 2020 1 27 43 UDP协议是无连接的协议 它以数据报作为数据传输的载体 数据报是一个在网络上发送的独立信息 它的到达 到达时间以及内容本身等都不能得到保证 数据报的大小是受限制的 每个数据报的大小限定在64KB以内 UDP协议无需在发送方和接收方建立连接 但也可以先建立连接 数据报在网上可以以任何可能的路径传往目的地 在Java中 基于UDP协议实现网络通信的类有三个 用于表达通信数据的数据报类DatagramPacket用于进行端到端通信的类DatagramSocket用于广播通信的类MulticastSocket 5 数据报通信 2020 1 27 44 类DatagramPacket构造方法publicDatagramPacket byte buf intlength publicDatagramPacket byte buf intoffset intlength 这两个方法用于接收数据publicDatagramPacket byte buf intlength InetAddressaddress intport publicDatagramPacket byte buf intoffset intlength InetAddressaddress intport 这两个方法用于发送数据获取数据 获取接收报中的信息publicInetAddressgetAddress publicbyte getData publicintgetLength publicintgetOffset publicintgetPort 设置数据 设置发送报中的信息setAddress InetAddressiaddr setPort intiport setData byte buf setData byte buf intoffset intlength setLength intlength 5 数据报通信 数据报 2020 1 27 45 类DatagramSocket构造方法publicDatagramSocket publicDatagramSocket intport 在指定的端口通信publicDatagramSocket intport InetAddressladdr 在指定的地点运行这三个方法都将抛出例外SocketException 程序中需要捕获处理 最主要的方法 发送与接收数据报publicvoidreceive DatagramPacketp publicvoidsend DatagramPacketp 这两个方法都将抛出例外IOException 程序中需要捕获处理 其他方法publicvoidconnect InetAddressaddress intport 与指定的机器通信publicvoiddisconnect 关闭与指定机器的连接publicvoidclose 关闭Socket 5 数据报通信 点到点通信 2020 1 27 46 2020 1 27 47 5 数据报通信 点到点通信 发送端发出数据报的标准步骤 1 定义数据成员DatagramSocketsocket DatagramPacketpacket InetAddressaddress 用来存放接收方的地址 intport 用来存放接收方的端口号 2 创建数据报Socket对象try socket newDatagramSocket 4445 catch SocketExceptione socket绑定到一个本地的可用端口 等待接收客户的请求 2020 1 27 48 3 分配并填写数据缓冲区 一个字节类型的数组 byte buf newbyte 256 存放从客户端接收的请求信息 4 创建一个DatagramPacketpacket newDatagramPacket buf 256 用来从socket接收数据 它只需要两个参数 5 服务器阻塞socket receive packet 在客户的请求数据报到来之前一直等待 5 数据报通信 点到点通信 2020 1 27 49 6 从到来的包中得到地址和端口号InetAddressaddress packet getAddress intport packet getPort 7 将数据送入缓冲区或来自文件 或键盘输入8 建立报文包 用来从socket上发送信息packet newDatagramPacket buf buf length address port 9 发送数据包socket send packet 10 关闭socketsocket close 5 数据报通信 点到点通信 2020 1 27 50 5 数据报通信 点到点通信 接收端接收数据报的标准步骤 1 定义数据成员intport InetAddressaddress DatagramSocketsocket DatagramPacketpacket byte sendBuf newbyte 256 2 建立socketsocket newDatagramSocket 2020 1 27 51 5 数据报通信 点到点通信 3 向服务器发出请求报文address InetAddress getByName args 0 port parseInt args 1 packet newDatagramPacket sendBuf 256 address port socket send packet 这个数据报本身带有客户端的信息4 客户机等待应答packet newDatagramPacket sendBuf 256 socket receive packet 如果没有到就一直等待 因此实用程序要设置时间限度5 处理接收到的数据Stringreceived newString packet getData 0 System out println received 2020 1 27 52 5 数据报通信 广播通信 DatagramSocket只允许数据报发往一个目的地址 类包中提供了类MulticastSocket 允许将数据报以广播的方式发送到某个端口的所有客户 类MulticastSocket是在

温馨提示

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

评论

0/150

提交评论