




已阅读5页,还剩57页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十讲网络通信 1 网络基本概念2 Java与Internet3 使用InetAddress4 使用URL5 Socket通信6 数据报通信 TCP IP TransmissionControlProtocol传输控制协议 InternetProtocol网间协议 是Internet的主要协议 定义了计算机和外设进行通信所使用的规则 TCP IP网络参考模型包括五个层次 应用层 传输层 网络层 链路层 物理层 ISO OSI网络参考模型则包括七个层次 应用层 表示层 会话层 传输层 网络层 链路层 物理层 1 网络基本概念 物理层 大多数基于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 网络基本概念 一台机器通常只通过一条链路连接到网络上 即它只有一个IP地址 但一台机器中往往有很多应用程序需要进行网络通信 如何区分呢 这就要靠网络端口号 port 了 端口号是一个标记机器的逻辑通信信道的正整数 端口号不是物理实体 IP地址和端口号组成了所谓的Socket Socket是网络上运行的程序之间双向通信链路的最后终结点 它是TCP和UDP的基础 IP与端口号组合而得出的Socket 可以完全分辨Internet上运行的程序 1 网络基本概念 端口号是用一个16位的整数来表达的 其范围为0 65535 其中0 1023为系统所保留 专门给那些通用的服务 well knownservices 如http服务的端口号为80 telnet服务的端口号为21 ftp服务的端口为23 因此 当我们编写通信程序时 应选择一个大于1023的数作为端口号 以免发生冲突 1 网络基本概念 传输层通常以TCP和UDP协议来控制端点到端点的通信 用于通信的端点是由Socket来定义的 Socket是由IP地址和端口号组成的 传输控制协议 TCP 是在端点与端点之间建立持续的连接而进行通信 建立连接后 发送端将发送的数据印记了序列号和错误检测代码 并以字节流的方式发送出去 接收端则对数据进行错误检查并按序列顺序将数据整理好 数据在需要时可以重新发送 因此整个字节流到达接收端时完好无缺 这与两个人打电话的情形是相似的 TCP协议具有可靠性和有序性 并且以字节流的方式发送数据 它通常被称为流通信协议 1 网络基本概念 与TCP协议不同 用户数据报协议 UDP 则是一种无连接的传输协议 利用UDP协议进行数据传输时 首先需要将要传输的数据定义成数据报 Datagram 在数据报中指明数据所要达到的端点 Socket 主机地址和端口号 然后再将数据报发送出去 这种传输方式是无序的 也不能确保绝对的安全可靠 但它很简单也具有比较高的效率 这与通过邮局发送邮件的情形非常相似 1 网络基本概念 1 网络基本概念 TCP协议和UDP协议各有各的用处 当对所传输的数据具有时序性和可靠性等要求时 应使用TCP协议 当传输的数据比较简单 对时序等无要求时 UDP协议能发挥更好的作用 如ping 发送时间数据等 1 网络基本概念 2 Java与Internet Java中的网络通信 网络应用是Java语言取得成功的领域之一 它已经成为现在Internet上最流行的一种编程语言 Java语言在网络编程方面提供了许多方便 其他语言往往需要数页代码才能完成的事情 在Java中可能只需要一条语句就可以 Java的网络通信分为三个层次 最高一级的网络通信就是我们上一讲中所涉及到的从网络上下载Applet 客户端浏览器通过HTML文件中的标记来识别Applet 并解析Applet的属性 通过网络获取Applet得字节码文件 由浏览器提供 上一讲中所涉及到的声音播放和图象显示 其中声音文件和图象文件的获取是次一级的通信 通过类URL的对象指明文件所在位置 并从网络上下载声音和图象文件 由Java开发环境提供 最低一级的通信是利用包中提供的类直接在程序中实现网络通信 由Java语言开发包提供 2 Java与Internet Java中的网络支持 针对网络通信的不同层次 Java提供的网络功能有四大类 InetAddress URLs Sockets Datagram InetAddress面向的是网络层 IP层 用于标识网络上的硬件资源 URL面向的应用层 通过URL Java程序可以直接送出或读入网络上的数据 Sockets和Datagram面向的则是传输层 Sockets使用的是TCP协议 这是传统网络程序最常用的方式 可以想象为两个不同的程序通过网络的通信信道进行通信 Datagram则使用UDP协议 是另一种网络传输方式 它把数据的目的地纪录在数据包中 然后直接放在网络上 2 Java与Internet Java中的网络支持 包中的主要的类和可能产生的例外包括 面向IP层的类 InetAddress Inet4Address Inet6Address 面向应用层的类 URL URLConnection面向网络层的类 TCP协议相关类 Socket ServerSocketUDP协议相关类 DatagramPacket DatagramSocket MulticastSocket可能产生的例外 BindException ConnectException MalformedURLException NoRouteToHostException ProtocolException SocketException UnknownHostException UnknownServiceException 类InetAddress可以用于标识网络上的硬件资源 它提供了一系列方法以描述 获取及使用网络资源 InetAddress类没有构造函数 因此不能用new来构造一个InetAddress实例 通常是用它提供的静态方法来获取 publicstaticInetAddressgetByName Stringhost host可以是一个机器名 也可以是一个形如 d d d d 的IP地址或一个DSN域名 publicstaticInetAddressgetLocalHost publicstaticInetAddress getAllByName Stringhost publicstaticInetAddressgetByAddress Stringhost Byte addr 这些方法通常会产生UnknownHostException例外 应在程序中捕获处理 以下是InetAddress类的几个主要方法 通过上述方法获得InetAddress类的实例后就可以使用 publicbyte getAddress 获得本对象的IP地址 存放在字节数组中 publicStringgetHostAddress 获得本对象的IP地址 d d d d publicStringgetHostName 获得本对象的机器名 3 使用InetAddress 下面的例子演示Java如何根据域名自动到DNS 域名服务器 上查找IP地址 与DNS服务器的连接减至一行 publicclassgetIP publicstaticvoidmain Stringargs InetAddresspku null try pku InetAddress getByName catch UnknownHostExceptione System out println pku 3 使用InetAddress getIP java 通过InetAddress 可以获取本机的IP地址 publicclassgetLocalHostTest publicstaticvoidmain InetAddressmyIP null try myIP InetAddress getLocalHost catch UnknownHostExceptione System out println myIP 3 使用InetAddress getLocalHostTest java 4 使用URL URL是统一资源定位符 UniformResourceLocator 的简称 它表示Internet上某一资源的地址 Internet上的资源包括HTML文件 图象文件 声音文件 动画文件以及其他任何内容 并不完全是文件 也可以是一个对数据库的查询等 通过URL 就可以访问Internet 浏览器或其他程序通过解析给定的URL就可以在网络上查找相应的文件或其他资源 4 使用URL 一个URL包括两部分内容 协议名称和资源名称 中间用冒号隔开 Protocol resourceName如 协议名称指的是获取资源时所使用的应用层协议 如http ftp file等 资源名称则是资源的完整地址 包括主机名 端口号 文件名或文件内部的一个应用 当然 并不是所有的URL都必须包含这些内容 4 使用URL 在Java中构造URL 在包中 提供了类URL来表示URL 类URL提供了很多构造方法来生成一个URL对象 publicURL Stringspec publicURL URLcontext Stringspec publicURL Stringprotocol Stringhost Stringfile publicURL Stringprotocol Stringhost intport Stringfile 以下是一些具体的构造实例 URLurl1 newURL 当创建URL时发生错误 系统会产生例外MalformedURLException 这是非运行时例外 必须在程序中捕获处理 URLurl1 url2 url3 try url1 newURL file D image example gif url2 newURL 4 使用URL 在Java中构造URL 一个URL对象生成后 其属性是不能被改变的 与String对象相似 但可以通过它给定的方法来获取这些属性 publicStringgetProtocol 获取该URL的协议名publicStringgetHost 获取该URL的主机名publicStringgetPort 获取该URL的端口号publicStringgetPath 获取该URL的文件路径publicStringgetFile 获取该URL的文件名publicStringgetRef 获取该URL在文件中的相对位置publicStringgetQuery 获取该URL的查询名 4 使用URL URL的基本方法 ParseURL java 4 使用URL 通过URL读取www信息 通过URL类提供的方法openStream 就可以读取一个URL对象所指定的资源 publicfinalInputStreamopenStream 方法openStream 与指定的URL建立连接并返回一个InputStream对象 将URL位置的资源转成一个输入数据流 通过这个InputStream对象 就可以读取资源中的数据 4 使用URL 通过URL读取www信息 importjava io publicclassURLReader publicstaticvoidmain Stringargs try URLgis newURL URLReader java 4 使用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 AppletURLReader java 4 使用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 4 使用URL URL连接 publicclassURLConnectionReader publicstaticvoidmain Stringargs try URLgis newURL URLConnectionReader java 通过URLConnection对象获取的输入流和输出流 不是所有的资源都可以获得有效的输出流 可以与现有的CGI程序进行交互 URL和URLConnection的区别在于前者代表一个资源的位置 后者代表一种连接 4 使用URL URL连接 URLurl newURL 4 使用URL 其他URL类 URLConnection类的其他方法以及其他URL相关的类 URLClassLoader URLDecoder URLEncoder URLStreamHandler HttpURLConnection JarURLConnection ContentHandler 的使用 大家在以后的实践中去学习 5 Socket通信 在Java中 基于TCP协议实现网络通信的类有两个 在客户端的Socket类和在服务器端的ServerSocket类 在服务器端通过指定一个用来等待的连接的端口号创建一个ServerSocket实例 在客户端通过规定一个主机和端口号创建一个Socket实例 连到服务器上 ServerSocket类的accept方法使服务器处于阻塞状态 等待用户请求 构造方法 publicSocket Stringhost intport 远程服务器IP及响应端口publicSocket InetAddressaddress intport publicSocket Stringhost intport InetAddresslocalAddr intlocalPort publicSocket InetAddressaddress intport InetAddresslocalAddr intlocalPort 在指定的机器上的指定端口上运行在JDK1 1以前 Socket类可同时用于TCP UDP通信 publicSocket Stringhost intport booleanstream publicSocket InetAddresshost intport booleanstream 这些方法都将抛出例外IOException 程序中需要捕获处理 5 Socket通信 类Socket Socket的输入 输出流管理publicInputStreamgetInputStream publicvoidshutdownInput publicOutputStreamgetOutputStream publicvoidshutdownOutput 这些方法都将抛出例外IOException 程序中需要捕获处理 关闭Socketpublicvoidclose throwsIOException设置 获取Socket数据publicInetAddressgetInetAddress publicintgetPort publicvoidsetSoTimeout inttimeout 这些方法都将抛出例外SocketException 程序中需要捕获处理 5 Socket通信 类Socket 构造方法 publicServerSocket intport publicServerSocket intport intbacklog 支持指定数目的连接publicServerSocket intport intbacklog InetAddressbindAddr 在指定的机器上运行这些方法都将抛出例外IOException 程序中需要捕获处理 主要方法publicSocketaccept 等待客户端的连接publicvoidclose 关闭Socket设置 获取Socket数据publicInetAddressgetInetAddress publicintgetLocalPort publicvoidsetSoTimeout inttimeout 这些方法都将抛出例外SocketException 程序中需要捕获处理 5 Socket通信 类ServerSocket 5 Socket通信 无论一个Socket通信程序的功能多么齐全 程序多么复杂 其基本结构都是一样的 都包括以下四个基本步骤 1 在客户方和服务器方创建Socket ServerSocket实例 2 打开连接到Socket的输入 输出流 3 利用输入 输出流 按照一定的协议对Socket进行读 写操作 4 关闭输入 输出流和Socket 通常 程序员的主要工作是针对所要完成的功能在第3步进行编程 第1 2 4步对所有的通信程序来说几乎都是一样的 5 Socket通信 5 Socket通信 1 建立Socket在客户端 try Socketclient newSocket host 4444 catch IOExceptione 在服务器端 try ServerSocketserver newServerSocket 4444 catch IOExceptione Socketsocket null try socket server accept 等待客户端连接 catch IOExceptione BufferedReader newBufferedReader newInputStreamReader socket getInputStream BufferedWriter newBufferedWriter newInputStreamWriter socket getOutputStream 2 在客户端和服务器端同时打开输入 输出流类Socket提供了方法getInputStream 和getOutputStream 来得到Socket对应的输入 输出流以进行数据读写 传输 操作 它们分别返回InputStream对象和OutputStream对象 为了便于读写数据 应在返回的输入 输出流对象上建立过滤流 如DataInputStram DataOutputStram BufferedInputStream BufferedOutputStream PrintStream InputStreamReader OutputStreamWriter BufferedReader BufferedWriter PrintWriter等 5 Socket通信 3 关闭输入 输出流和Socket在客户端和服务器端分别关闭输入 输出流和Socket 先关闭所有相关的输入 输出流 再关闭Socket 5 Socket通信 5 Socket通信 SingleTalkClient java 看看这个谈话程序的运行效果 2 客户端 SingleTalkServer java 1 服务器端 5 Socket通信 简单的Client Server 在本地机器上测试网络程序用回绕地址Socketsocket newSocket 127 0 0 1 4444 建立socket连接后 还应该建立输入输出数据流 要控制好输入 输出流和Socket关闭的时间 如果网络的一端已经关闭 另一端读到null 在运行时 服务器端程序一般应先行启动 解决方案一 在一台计算机上一次启动多个服务器程序 只要端口号不同 myserver1myclient1myserver2myclient2 5 Socket通信 支持多Client 解决方案二 将服务器写成多线程的 不同的处理线程为不同的客户服务 主线程只负责循环等待 处理线程负责网络连接 接收客户输入的信息 主线程while true acceptaconnection createathreadtodealwiththeclient endwhile 5 Socket通信 支持多Client 5 Socket通信 支持多Client serverSocket newServerSocket 4444 while listening Socketsocket socket serverSocket accept 程序将在此等候客户端的连接clientNumber 记录客户数目newMultiTalkServerThread socket clientNumber start 创建一个新线程处理此客户请求 serverSocket close classMultiTalkServerThreadextendsThread publicMultiTalkServerThread Socketsocket intclientNumber this socket socket this clientNumber clientNumber publicvoidrun 5 Socket通信 支持多Client MultiTalkServer java 5 Socket通信 Client之间通过Server通信 可以在服务器端将与各客户进行通信的Socket和线程管理起来 从而各客户之间可以在服务器端的协助下进行通信 UDP协议是无连接的协议 它以数据报作为数据传输的载体 数据报是一个在网络上发送的独立信息 它的到达 到达时间以及内容本身等都不能得到保证 数据报的大小是受限制的 每个数据报的大小限定在64KB以内 UDP协议无需在发送方和接收方建立连接 但也可以先建立连接 数据报在网上可以以任何可能的路径传往目的地 在Java中 基于UDP协议实现网络通信的类有三个 用于表达通信数据的数据报类DatagramPacket用于进行端到端通信的类DatagramSocket用于广播通信的类MulticastSocket 6 数据报通信 构造方法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 6 数据报通信 数据报 类DatagramPacket 构造方法publicDatagramSocket publicDatagramSocket intport 在指定的端口通信publicDatagramSocket intport InetAddressladdr 在指定的地点运行这三个方法都将抛出例外SocketException 程序中需要捕获处理 最主要的方法 发送与接收数据报publicvoidreceive DatagramPacketp publicvoidsend DatagramPacketp 这两个方法都将抛出例外IOException 程序中需要捕获处理 其他方法publicvoidconnect InetAddressaddress intport 与指定的机器通信 有连接publicvoiddisconnect 关闭与指定机器的连接publicvoidclose 关闭Socket 6 数据报通信 点到点通信 类DatagramSocket 6 数据报通信 点到点通信 SingleUDPClient java 看看这个点到点通信程序的运行效果 2 客户端 接收端 SingleUDPServer java 1 服务器端 发送端 6 数据报通信 点到点通信 发送端 服务器端 发出数据报的标准步骤 1 定义数据成员DatagramSocketsocket DatagramPacketpacket InetAddressaddress 用来存放接收方的地址 intport 用来存放接收方的端口号 2 创建数据报Socket对象try socket newDatagramSocket 4445 catch SocketExceptione socket绑定到一个本地的可用端口 等待接收客户端的请求 3 分配并填写数据缓冲区 一个字节类型的数组 byte buf newbyte 256 存放从客户端接收的请求信息 4 创建一个接收数据报DatagramPacketpacket newDatagramPacket buf 256 用来从socket接收数据 它只需要两个参数 5 服务器阻塞 等待接收数据 socket receive packet 在客户的请求数据报到来之前一直等待 6 数据报通信 点到点通信 6 从到来的接收数据报中得到客户端的地址和端口号InetAddressaddress packet getAddress intport packet getPort 7 准备需要发送的数据 将数据送入缓冲区buf或来自文件 或键盘输入8 建立发送数据报 用来从socket向客户端发送信息packet newDatagramPacket buf buf length address port 9 发送数据包socket send packet 10 关闭socketsocket close 6 数据报通信 点到点通信 6 数据报通信 点到点通信 接收端 客户端 接收数据报的标准步骤 1 定义数据成员intport InetAddressaddress DatagramSocketsocket DatagramPacketpacket byte sendBuf newbyte 256 2 建立socketsocket newDatagramSocket 无须指定端口号 它会自动获得一个可用的端口号 6 数据报通信 点到点通信 3 向服务器端发出请求数据报 发送数据报 address InetAddress getByName args 0 port parseInt args 1 获得服务器端的IP和端口号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 6 数据报通信 广播通信 DatagramSocket只允许数据报发往一个目的地址 类包中提供了类MulticastSocket 允许将数据报以广播的方式发送到某个端口的所有客户 类MulticastSocket是在客户端 接收端 使用 监听服务器端广播来的数据 而服务器端仍然使用DatagramSocket来发送数据 只是发送的数据报的目的地址有所变化 类MulticastSocket 从DatagramSocket继承而来构造方法publicMulticastSocket publicMulticastSocket intport 在指定的端口通信这两个方法都将抛出例外IOException 程序中需要捕获处理 主要方法publicvoidj
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年成都市武侯区公开选调事业单位工作人员10人模拟试卷及答案详解(有一套)
- 2025甘肃天水市第四人民医院编外人员招聘3人模拟试卷及答案详解(考点梳理)
- 2025福建厦门市集美区灌口镇双岭村职业经理人招聘1人模拟试卷及答案详解一套
- 2025广东广佛产业园区运营管理有限公司招聘模拟试卷及答案详解(全优)
- 2025企业购销合同
- 2025年光纤通信器材购销合同
- 2025企业合同终止与解除劳动合同协议书范本
- 建设工程服务合同范本
- 2025-2026学年安徽省无为三中九年级(上)月考语文试卷(9月份)(含答案)
- 2025年药店店员专业基础知识测试题及答案
- 2025年未来就业报告
- 安检流程课件
- 邮储银行存款课件
- 2024国家公务员考试地市级申论第2题(带标准答案)
- 药品追溯管理培训试题(附答案)
- 2025年校招:财务岗试题及答案
- 羽毛球讲解课件
- 质量意识题目及答案
- 带状疱疹后神经痛护理查房
- 急性女性盆腔炎个案护理
- 工程建设施工项目管理人员职业标准
评论
0/150
提交评论