已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章网络编程 Java号称Internet上的语言 它从语言级上提供了对网络应用程序的支持 程序员能够很容易的开发常见的网络应用程序 Java提供的网络类库 可以实现无痛苦的网络连接 连网的底层细节被隐藏在Java的本机安装系统里 由JVM进行控制 并且Java实现了一个跨平台的网络库 程序员面对的是一个统一的网络编程环境 7 1 1网络基础 网络编程的目的就是指直接或间接地通过网络协议与其它计算机进行通讯 网络编程中有两个主要的问题 一个是如何准确地定位网络上一台或多台主机 另一个就是找到主机后如何可靠高效地进行数据传输 要想让处于网络中的主机互相通信 只是知道通信双方地址还是不够的 还必须遵循一定的规则 有两套参考模型 OSI参考模型 TCP IP参考模型 或TCP IP协议 由于OSI参考模型过于理想化 未能在因特网上进行广泛推广 这样 TCP IP协议就成为事实上的国际标准 7 1 2TCP IP协议簇 TCP IP以其两个主要协议 传输控制协议 TCP 和网络互联协议 IP 而得名 实际上是一组协议 包括多个具有不同功能且互为关联的协议 TCP IP协议模型从更实用的角度出发 形成了高效的四层体系结构 即网络接口层 IP层 传输层和应用层 下图表示了TCP IP的分层结构和与OSI参考模型的对应关系 7 1 3TCP和UDP 这里只重点介绍TCP IP协议的运输层协议 运输层协议中有两个非常重要的协议 传输控制协议TCP TransmissionControlProtocol 用户数据报协议UDP UserDatagramProtocol 传输控制协议TCP是面向连接的运输层协议 即应用进程 或程序 在使用TCP协议之前 必须先建立TCP连接 在传输完毕后 释放已经建立的连接 利用TCP协议进行通信的两个应用进程 一个是服务器进程 另一个是客户进程 用户数据报协议UDP是面向无连接的运输层协议 即应用进程 或程序 在使用UDP协议之前 不必先建立连接 自然 发送数据结束时也没有连接需要释放 因此 减少了开销和发送数据之前的时延 7 2InetAdress类 Internet上的主机有两种方式表示地址 1 域名例如 2 IP地址例如 包中的InetAddress类对象含有一个Internet主机地址的域名和IP地址 7 2InetAdress类 1 获取Internet上主机的地址我们可以使用InetAddress类的静态方法 getByName Strings 将一个域名或IP地址传递给该方法的参数s 获得一个InetAddress对象 该对象含有主机地址的域名和IP地址 该对象用如下格式表示它包含的信息 publicclassInetAddressTest publicstaticvoidmain Stringargs try InetAddressaddress 1 InetAddress getByName InetAddress类需处理异常System out println address 1 toString System out println address 1 getHostName 取InetAddress对象所含的域名 System out println address 1 getHostAddress 获取InetAddress对象所含的IP地址 InetAddressaddress 2 InetAddress getLocalHost 对象含有本地机的域名和IP地址 System out println address 2 toString catch UnknownHostExceptione System out println 使用InetAddress 调用上述方法获取InetAddress对象时 如果指定的主机名或IP地址不能被解析 将抛出UnknownHostException异常 例 try InetAddressaddress InetAddress getByName catch UnknownHostExceptionex System out println C 为了创建InetAddress对象 Java需要执行主机名和IP地址之间的相互解析工作 这对系统来说可能是一个耗时的开销 为了避免一些重复的解析工作 Java虚拟机内部采取了缓存机制 7 2InetAdress类 另外 InetAddress类中含有两个实例方法 publicStringgetHostName 取InetAddress对象所含的域名 publicStringgetHostAddress 获取InetAddress对象所含的IP地址 2 获取本地机的地址我们可以使用InetAddress类的静态方法 getLocalHost 获得一个InetAddress对象 该对象含有本地机的域名和IP地址 例如 InetAddressaddress 2 InetAddress getLocalHost System out println address 2 toString 7 3TCP程序设计 客户端 服务器模型是最常见的网络应用程序模型 当我们上网冲浪时 我们所使用的浏览器 例如IE 就是一个客户端软件 而提供网页的站点必需运行一个WEB服务器 一般而言 主动发起通信的应用程序属于客户端 而服务器则是等待通信请求 当服务器收到客户端的请求 执行需要的运算然后向客户端返回结果 套接字Socket IP地址标识Internet上的计算机 端口号标识正在计算机上运行的进程 程序 端口号与IP地址的组合得出一个网络套接字 端口号被规定为一个16位的整数0 65535 其中 0 1023被预先定义的服务通信占用 如telnet占用端口23 http占用端口80等 除非我们需要访问这些特定服务 否则 就应该使用1024 65535这些端口中的某一个进行通信 以免发生端口冲突 7 3TCP程序设计 利用套接字 socket 接口开发网络应用程序早已被广泛的采用 以至于成为事实上的标准 套接字能执行7种基本操作 连接到远程机器 绑定到端口 接收从远程机器来的连接请求 监听到达的数据 发送数据 接收数据 关闭连接 7 3TCP网络编程 两个Java应用程序可通过一个双向的网络通信连接实现数据交换 这个双向链路的一段称为一个Socket 套接字 Socket通常用来实现Client Server连接 Java语言的基于套接字编程分为服务器编程和客户端编程 其通信模型如图7 3 1所示 图7 3 1基于TCP的Socket通信 7 3基于Socket的C S程序 客户端Socket的工作过程包含以下四个基本的步骤 1 创建Socket 根据指定的IP地址或端口号构造Socket类对象 如服务器端响应 则建立客户端到服务器的通信线路 2 打开连接到Socket的输入 出流 使用getInputStream 方法获得输入流 使用getOutputStream 方法获得输出流 3 按照一定的协议对Socket进行读 写操作 通过输入流读取服务器放入线路的信息 但不能读取自己放入线路的信息 通过输出流将信息写入线程 4 关闭Socket 断开客户端到服务器的连接 释放线路 对于服务器和客户机而言 将上述第一步改为构造ServerSocket类对象 监听客户端的请求并进行响应 1 调用ServerSocket intport 创建一个服务器端套接字 并绑定到指定端口上 2 调用accept 监听连接请求 如果客户端请求连接 则接受连接 返回通信套接字 3 调用Socket类的getOutputStream和getInputStream获取输出流和输入流 开始网络数据的发送和接收 4 最后关闭通信套接字 服务器程序的工作过程包含以下四个基本的步骤 图7 1基于Socket的C S通信 7 3TCP网络编程 1 服务器建立ServerSocket对象ServerSocket对象负责等待客户端请求建立套接字连接 类似邮局某个窗口中的业务员 也就是说 服务器必须事先建立一个等待客户请求建立套接字连接的ServerSocket对象 当建立服务器套接字时可能发生IOException异常 因此要象下面那样建立接收客户的服务器套接字 try ServerSocketss newServerSocket 1880 SocketsocketAtServer ss accept catch IOExceptione 注意 接收客户的套接字也可能发生IOException异常 所谓 接收 客户的套接字请求 就是accept 方法会返回一个Socket对象 socketAtServer 称作服务器端的套接字对象 7 3TCP网络编程 ServerSocket类的构造方法如下 ServerSocket intport throwsIOException 功能 创建绑定到特定端口的服务器套接字 ServerSocket intport intbacklog throwsIOException功能 利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号 backlog表示队列的最大长度 ServerSocket intport intbacklog InetAddressbindAddr throwsIOException功能 使用指定的端口 侦听backlog和要绑定到的本地IP地址创建服务器 bindAddr表示要将服务器绑定到的InetAddress 2 客户端创建Socke对象 客户端程序可以使用Socket类创建对象 创建的同时会自动向服务器方发起连接 Socket的构造方法是 Socket Stringhost intport throwsUnknownHostException IOException功能 向服务器 域名是host 端口号为port 发起TCP连接 若成功 则创建Socket对象 否则抛出异常 Socket InetAddressaddress intport throwsIOException功能 同上 只是根据InetAddress对象所表示的IP地址以及端口号port发起连接 创建Socket对象可能发生IOException异常 因此要象下面那样建立到服务器的套接字连接 try SocketsocketAtClient newSocket http 192 168 0 78 1880 catch IOExceptione 客户端建立socketAtClient对象的过程就是向服务器发出套接字连接请求 如果服务器端相应的端口上有ServerSocket对象正在使用accept方法等待客户 那么双方的套接字对象socketAtClient和socketAtServer就都诞生了 3 流连接客户端和服务器端的套接字对象诞生以后 还必须进行输入 输出流的连接 服务器端的这个Socket对象socketAtServer使用方法getOutputStream 获得的输出流将指向客户端Socket对象socketAtClient使用方法getInputStream 获得的那个输入流 同样 服务器端的这个Socket对象socketAtServer使用方法getInputStream 获得的输入流将指向客户端Socket对象socketAtClient使用方法getOutputStream 获得的那个输出流 因此 当服务器向这个输出流写入信息时 客户端通过相应的输入流就能读取 反之亦然 客户机向服务器发送信息的简单代码PrintWriterout newPrintWriter clientSocket getOutputStream Stringstr 来自客户机的信息 out println str 将要发送的信息写入out中out flush 强制将out中的数据送出clientSocket close 关闭连接端口 C S之间通讯代码 服务器接收客户机信息的简单代码BufferedReaderin newBufferedReader newInputStreamReader serverSocket getInputStream 从Socket端口读入信息Stringstr in readLine System out println str serverSocket close 套接字调用close 可以关闭双方的套接字连接 只要一方关闭连接 就会导致对方发生IOException异常 下面我们通过一个简单的例子说明上面讲的概念 7 3TCP通信程序 例1 一个简单TCP通信程序 客户端程序向服务器程序发送任意的字符串 服务器程序收到后 显示收到的字符串 首先建立一个TCP服务器程序 在这个程序中 创建一个在8866端口上等待连接的ServerSocket对象 当接收到一个客户端的连接请求后 程序从与这个客户建立连接的Socket对象中获得输入流对象 通过输入流读取客户端程序发送的字符串 再建立TCP客户端程序 由于是本地连接 TCP服务器的IP地址是127 0 0 1 客户端需要与通过服务器的8866端口建立连接完成通信 所以在客户端指定要与服务器连接的端口号为8866 同样 客户端利用创建的Socket对象来获得输出流对象 通过输出流向服务器端发送字符串 7 3TCP通信程序 运行上面的TCP客户服务器程序 首先在客户端文本框中输入字符串 按下回车键 这些字符串将显示在客户端的窗口上 并且 这些数据将发送给服务器端 服务器端接受到从客户端发送的字符串 将显示在窗口上 如图7 3 3 图7 3 4所示 图7 3 3服务器端图7 3 4客户端 7 3TCP网络编程 Socket类的常用方法如表13 1所示 表7 3 1Socket类的常用方法 7 3TCP网络编程 ServerSocket类的常用方法如表7 3 2所示 表7 3 2ServerSocket类的常用方法 7 3TCP通信程序 例1 一个简单TCP通信程序 客户端程序向服务器程序发送任意的字符串 服务器程序收到后 显示收到的字符串 首先建立一个TCP服务器程序 在这个程序中 创建一个在8866端口上等待连接的ServerSocket对象 当接收到一个客户端的连接请求后 程序从与这个客户建立连接的Socket对象中获得输入流对象 通过输入流读取客户端程序发送的字符串 再建立TCP客户端程序 由于是本地连接 TCP服务器的IP地址是127 0 0 1 客户端需要与通过服务器的8866端口建立连接完成通信 所以在客户端指定要与服务器连接的端口号为8866 同样 客户端利用创建的Socket对象来获得输出流对象 通过输出流向服务器端发送字符串 7 3TCP通信程序 运行上面的TCP客户服务器程序 首先在客户端文本框中输入字符串 按下回车键 这些字符串将显示在客户端的窗口上 并且 这些数据将发送给服务器端 服务器端接受到从客户端发送的字符串 将显示在窗口上 如图7 3 3 图7 3 4所示 图7 3 3服务器端图7 3 4客户端 Server和一个客户的对话 例12 3 基于Socket的单客户端程序 客户端程序importjava awt importjava awt event importjavax swing importjava io publicclassClientDemo publicstaticvoidmain Stringargs try Socketclient newSocket 127 0 0 1 4000 BufferedReadersin newBufferedReader newInputStreamReader System in BufferedReaderis newBufferedReader newInputStreamReader client getInputStream PrintWriteros newPrintWriter client getOutputStream Stringmsg msg sin readLine while msg equals bye os println msg os flush System out println ISAY msg System out println ServerSAY is readLine msg sin readLine System out println TheTalkEnd os close is close client close catch IOExceptione System out println Error e Server和多个客户的对话 例12 4 基于Socket的多客户端程序 多个客户服务端程序importjava awt importjava awt event importjavax swing importjava io publicclassServerToMultiDemo staticintintClient 1 publicstaticvoidmain Stringargs throwsIOException ServerSocketserversocket null try serversocket newServerSocket 4000 System out println Serverisstarting catch IOExceptione System out println Error e while true ServerThreadst newServerThread serversocket accept intClient st start intClient classServerThreadextendsThread Socketserver intintCounter publicServerThread Socketsocket intnum server socket intCounter num publicvoidrun try Stringmsg BufferedReadersin newBufferedReader newInputStreamReader System in BufferedReaderis newBufferedReader newInputStreamReader server getInputStream PrintWriteros newPrintWriter server getOutputStream System out println Client intCounter is readLine msg sin readLine while msg equals bye os println msg os flush System out println I msg System out println Client intCounter is readLine msg sin readLine System out println TheTalkEnd os close is close server close catch IOExceptione System out println Error e 7 6小结 计算机网络是指计算机通过通信介质相互连接的集合 网络由硬件和软件共同组成以提供各种服务 位于网络中的计算机具有唯一的IP地址 这样不同的主机可以互相区分 为了便于人的记忆 为计算机赋予了不同主机名 在应用程序中 可以通过主机名指定计算机 而在网络层必须通过IP地址来指定计算机 客户端 服务器是一种最常见的网络应用程序模型 服务器是一个为其客户端提供某种特定服务的硬件或软件 客户机是一个用户应用程序 用于访问某台服务器提供的服务 端口号是对一个服务的访问场所 它用于区分同一物理计算机上的多个服务 套接字用于连接客户端和服务器 客户端和服务器之间的每个通信会话使用一个不同的套接字 TCP协议用于实现面向连接的会话 UDP协议用于实现无连接的会话 Java中有关网络方面的功能都定义在程序包中 Java用InetAddress对象表示IP地址 该对象里有两个字段 主机名 String 和IP地址 int 类Socket和ServerSocket实现了基于TCP协议的客户端 服务器程序 Socket是客户端和服务器之间的一个连接 连接创建的细节被隐藏了 这个连接提供了一个安全的数据传输通道 这是因为TCP协议可以解决数据在传送过程中的丢失 损坏 重复 乱序以及网络拥挤等问题 它保证数据可靠的传送 类DatagramSocket和DatagramPacket实现了基于UDP协议网络程序 DatagramPacket对象封装了UDP数据报 在数据报中包含了客户端的IP地址和端口号以及服务器的IP地址和端口号 UDP数据报通过数据报套接字DatagramSocket发送和接收 系统不保证UDP数据报一定能够安全送到目的地 也不能确定什么时候可以抵达 类URL和URLCo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 八年级道德与法治外研版期中阶段第一单元同步测试卷基础版A卷
- 第3轮小红书探店内容策划与商家合作资料包
- 血糖控制健康指导
- 化疗后饮食记录
- 时尚产业AI应用
- AI中医大脑应用
- 公司安全文化管理制度范本
- 康体设施周检表
- 生态保护岗年度履职报告
- 计算机科学概论(微课版)课件 第6-10章 数据结构- 人工智能
- 2026年厂区消防应急器材使用试题库及答案
- 2026年楚雄州州级机关统一遴选公务员笔试真题及答案解析
- 2026年驾驶理论测试题及答案
- 2026年核能质保监查员考试题及答案
- 医患沟通礼仪课件
- 江苏省低空空域协同管理办法(试行)
- 言语吞咽障碍康复治疗讲课件
- 延长石油校招试题及答案
- 高三物理电磁学综合练习题
- 广东省农作物植保员职业技能竞赛考试题库(含答案)
- 受限空间作业安全技术措施
评论
0/150
提交评论