Java程序设计教程课件_第1页
Java程序设计教程课件_第2页
Java程序设计教程课件_第3页
Java程序设计教程课件_第4页
Java程序设计教程课件_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

人民邮电出版社14网络编程Java程序设计第章导读Introduction网络编程是Java编程技术中一个重要的组成部分,本章将学习Java语言中专门用于网络编程的基础类,通过这些类可以很方便地实现网络通信。C目录ONTENTS14.2基于URL的网络编程14.3InetAddress类14.4套接字14.5UDP数据报14.6广播数据报14.1网络基础14.7基于NIO的编程14.1.1

网络基本概念计算机网络就是指将地理位置不同的计算机通过通信线路连接起来,实现资源共享和信息传递。网络编程就是通过程序实现两台(或多台)主机之间的数据通信。要想实现这一目标,首先要建立连接,然后按照事先规定好的格式进行数据传输,从而完成主机之间的信息传输。14.1.1网络基本概念1.IP地址和域名IP地址是识别网络主机的唯一身份标识。IP地址是由32位二进制数组成(IPv4为例),通常写成4个0~255之间的数字。域名可看做是IP地址的别称,用字符进行描述,便于理解和记忆。在网络通信过程中只能使用IP地址。DNS是地址解析系统,实现域名与IP地址的自动转换工作。14.1.1网络基本概念端口是用于识别主机进程的标识。Socket是主机IP地址+端口号。网络编程也称为基于Socket的编程。2.端口和SocketClient是发起请求的一方,被称作客户端;Server是接受请求的另一方,被称作服务器端。C/S模式称为客户端/服务器端模式,简称C/S模式。B/S模式:特殊的C/S模式。Browser是浏览器,不需要安装额外的客户端程序就能访问服务器端。3.C/S模式14.1.2TCP和UDP协议1.TCP协议2.UDP协议TCP(TransmissionControlProtocol——传输控制协议)是一种面向连接的可靠的传输协议。采用通信双方相互应答的方式来保证数据传送的可靠性。网络的通信开销增加,协议也更为复杂。大部分网络通信都采用TCP协议。UDP(UserDatagramProtocol——用户数据报协议)是一种面向无连接的传输协议。不需要通信双方事先建立连接和应答就进行传输。协议简单,效率更高,但不保证通信的可靠性。适用一些简单的网络应用。C目录ONTENTS14.2基于URL的网络编程14.3InetAddress类14.4套接字14.5UDP数据报14.6广播数据报14.1网络基础14.7基于NIO的编程

14.2.1URL基础URL(UniformResourceLocation),称为统一资源定位符,它是指向互联网“资源”的指针。URL格式:协议名://主机地址[:端口号][/资源路径][/资源对象]其中:协议名表示访问该网络资源所采用的协议。端口号指连接主机服务的进程端口。资源路径表示资源对象所在的路径。资源对象指的是待访问的资源。

14.2.1URL基础.URL类的构造方法:publicURL(String

spec)throwsMalformedURLException

另外一个常用的构造方法:publicURL(String

protocol,String

host,int

port,String

file)throwsMalformedURLException该构造方法分别给出了访问的协议、主机地址、,端口和资源对象等参数。

14.2.2网络资源访问URL中的方法:publicfinalInputStreamopenStream()throwsIOException可以获得输入流,用于客户端从服务器端读取数据。【例14.1】编程序从命令窗口读取一个网络资源(网页),并显示该资源的内容。Example14_01.javaC目录ONTENTS14.2基于URL的网络编程14.3InetAddress类14.4套接字14.5UDP数据报14.6广播数据报14.1网络基础14.7基于NIO的编程

14.3.1地址的表示表示主机地址主要有两种形式:IP地址形式和主机名形式。以百度为例,其主机名形式为:,IP地址形式为1/2。百度的主机名只有一个,而IP地址却有两个,这是为了实现网络访问的负载均衡。

14.3.2获取地址.InetAddress类通过若干个静态方法来获取表示主机IP地址的InetAddress对象。静态方法:publicstaticInetAddressgetByName(String

host)throwsUnknownHostException参数host是一个字符串形式的域名或IP地址。【例14.2】InetAddress类的使用示例。Example14_02.javaC目录ONTENTS14.2基于URL的网络编程14.3InetAddress类14.4套接字14.5UDP数据报14.6广播数据报14.1网络基础14.7基于NIO的编程14.4.1套接字概述

套接字,即socket,由IP地址+端口构成。计算机网络中规定端口号由16位二进制数表示,即十进制数范围为0~65535。0~1023端口为公认端口或熟知端口,被系统进程或常用服务所占用。选择端口时要选择1024以后的端口。套接字根据连接端的不同可分为客户端套接字和服务器端套接字。.Socket类和.ServerSocket类用于客户机与服务器端的网络编程。14.4.2客户端套接字

客户端是发起连接请求的程序。首先建立网络连接,在建立连接时需要指出服务器端的IP地址和端口号。连接建立成功,就可以实现数据交互。数据交互时按照请求-响应模型由客户端向服务器端发送请求,服务器端根据请求内容进行处理,并将响应结果返回给客户端。数据的交互过程可以进行多次,每次均按照请求-响应模型进行。在数据交互结束后,关闭网络连接,释放占用的端口、内存等资源,结束客户端程序。1、客户端编程步骤14.4.2客户端套接字

.Socket类代表客户端连接。最常用的构造方法有两个:2、客户端套接字publicSocket(String

host,int

port)throwsUnknownHostException,IOExceptionpublicSocket(InetAddress

address,int

port)throwsIOException交互操作是通过输入流/输出流完成的。获取输出流的方法:

publicOutputStreamgetOutputStream()throwsIOException获取输入流的方法:

publicInputStreamgetInputStream()throwsIOException14.4.2客户端套接字2、客户端套接字

例:OutputStreamout=socket1.getOutputStream();//建立socket1的输出流对象InputStreamin=socket2.getInputStream();//建立socket2的输入流对象建立好输入输出流对象,就可以按照第12章的I/O流方式进行数据交互。数据交互完成后,关闭网络连接,释放占用的资源:socket1.close();14.4.2客户端套接字2、客户端套接字【例14.3】客户机与服务器通信示例,该程序向服务器端发送一个问候字符串:“你好,我是客户机A”,并显示服务器端响应的字符串信息:“你好,我是服务器B”。(配合例14.4)客户端程序:Example14_03.java14.4.3服务器端套接字

服务器端程序监听固定的端口。当服务器端监听到客户端的连接请求后,与客户端建立一个网络连接。连接建立成功后,双方进行数据交互。数据交互结束,关闭服务器端,释放占用的资源。在实际编程中,为解决多用户响应问题,通常采用多线程机制。1、服务器端编程步骤14.4.3服务器端套接字

服务器端使用.ServerSocket类的对象来表示服务器套接字。ServerSocket类的常用构造方法:2、服务器端套接字publicServerSocket(intport)throwsIOExceptionport为连接指定的端口,如果为0,表示使用任何空闲的端口。在建立连接时,会创建一个连接请求队列,表示可以连接的最大请求数,默认为50。如果队列满时再收到连接请求,则拒绝该连接。另一个构造方法可以指定请求队列的长度:

publicServerSocket(intport,intbacklog)throwsIOException参数backlog为大于0的正整数,表示队列的最大长度。如果该值小于等于0,则使用默认值。

14.4.3服务器端套接字【例14.4】客户机与服务器通信示例,服务器端。Example14_04.java创建好服务器套接字后,就可以进行连接监听了。连接监听的方法为:publicSocketaccept()throwsIOException此方法监听并接受到此套接字的连接。其在连接传入之前一直阻塞。例如:Socketsocket=server_socket.accept();一旦监听到请求并建立了socket连接后,就可以进行数据交互了。14.4.4多线程网络编程【例14.5】多线程通信示例。实现一个简单的四则运算过程:客户端从键盘输入四则运算表达式,但不进行运算,而是将该表达式传送给服务器端。服务器端接收到表达式后进行处理和计算,将运算结果返回给客户端进行显示。本例由三个类组成,Example14_05_ClientExample14_05_ServerExample14_05_LogicThreadC目录ONTENTS14.2基于URL的网络编程14.3InetAddress类14.4套接字14.5UDP数据报14.6广播数据报14.1网络基础14.7基于NIO的编程14.5.1发送数据包

.DatagramPacket类用于将数据打包,即封装成一个数据包对象。常用的构造方法有两个:publicDatagramPacket(byte[]buf,intlength,InetAddressaddress,intport)publicDatagramPacket(byte[]buf,intoffset,intlength,InetAddressaddress,intport)参数buf表示包数据,length是包长度,length参数必须小于或等于buf.length,address是发送的目的地址,port是目的端口号。参数offset指的是从buf的offset处开始的数据。14.5.1发送数据包例如:bytedata[]=”hello”.getByte();//字节数组InetAddressaddr=InetAddress.getByName(“”);DatagramPacketdata_send=newDatagramPacket(data,data.length,addr,5151);封装好数据包后,再用.DatagramSocket类创建一个连接对象,这个连接对象将数据包发送出去。例如:

DatagramSocketsend_socket=newDatagramSocket();send_socket.send(data_send);14.5.2接收数据包接收端需要创建DatagramSocket对象和DatagramPacket对象。DatagramSocket对象是用于监听接收端口,并将接收到的数据存到DatagramPacket对象中。DatagramSocket类的构造方法:

publicDatagramSocket(intport)throwsSocketException参数port为要使用的端口号。DatagramPacket对象的作用是保存接收到的DatagramPacket数据包。接收端DatagramPacket类的构造方法为:

publicDatagramPacket(byte[]buf,intlength)其中的参数buf就保存传入数据报的缓冲区,len是要读取的字节数。14.5.2接收数据包其他常用方法。读取发送端的InetAddress地址:InetAddressgetAddress()获得发送端的端口号:intgetPort()获得收到的数据字节长度:intgetLength()例如:byte[]data=newbyte[1024];intlength=512;DatagramPacketpacket=newDatagramPacket(data,length);最后使用receive_socket对象的receive(DatagramPacketpacket)方法就可以接收数据包了。14.5.2接收数据包【例14.6】基于UDP的通信示例,客户端向服务器端发送问候信息“你好,我是客户机A”,服务器端接收到后回送响应信息:“你好,我是服务器B”。本例程序由两个类组成,分别是客户端类Example14_06_Client_UDP和服务器端类Example14_06_Server_UDP。Example14_06_Client_UDP.javaExample14_06_Server_UDP.javaC目录ONTENTS14.2基于URL的网络编程14.3InetAddress类14.4套接字14.5UDP数据报14.6广播数据报14.1网络基础14.7小结14.6广播数据报

这种通信类似于收音机的广播,用户只要调到指定的频道上就能收听到广播的内容。要想实现这个功能需要使用特殊的IP地址。要想实现多播或广播通信的主机都必须要加入到同一个D类地址中。D类地址的十进制表示范围是:~55。14.6广播数据报

(1)MulticastSocket(intport)throwsIOException创建一个多播套接字,并将其绑定到指定端口上。(2)MulticastSocket(SocketAddressbindaddr)throwsIOException创建一个多播套接字,并将其绑定到一个指定套接字地址上。实现广播,需要使用.MulticastSocket类。该类是一种基于UDP的DatagramSocket,用于发送和接收IP多播包。该类的对象可以加入Internet上其他多播主机的“组”中。类DatagramSocket的常用方法:14.6广播数据报(3)publicvoidjoinGroup(InetAddressmcastaddr)throwsIOException//将多播套接字加入到指定多播组中。(4)publicvoidleaveGroup(InetAddressmcastaddr)throwsIOException//将多播套接字移出多播组。(5)publicvoidsetTimeToLive(intttl)throwsIOException//设置在此MulticastSocket上发出的多播数据包的默认生存时间,1为本地网络。【例14.7】广播数据报发送端示例。Example14_07.java【例14.8】广播数据报接收端示例。Example14_08.javaC目录ONTENTS14.2基于URL的网络编程14.3InetAddress类14.4套接字14.5UDP数据报14.6广播数据报14.1网络基础14.7基于NIO的编程14.7.1SocketChannel类java.nio.channels.SocketChannel类用于创建面向缓冲区的套接字通道,通过该类的对象实现双向通信。返回类型方法名方法功能SocketChannelopen()打开套接字通道SocketChannelopen(SocketAddressremote)打开通道并连接到远程地址booleanconnect(SocketAddressremote)连接此通道的远程套接字booleanisConnected()判断是否已连接网络套接字booleanisConnectionPending判断是否正在进行连接booleanfinishConnect()完成套接字通道的连接过程Socketsocket()获取与此通道关联的套接字SelectionKeyregister(Selectorsel,intops)向给定的选择器注册此通道,返回一个选择键intread(ByteBufferdst)从通道读数据到给定缓冲区中,返回读取的字节数intwrite(ByteBuffersrc)将给定缓冲区中数据写入通道,返回写入的字节数表14.1SocketChannel类的常用方法14.7.2ServerSocketChannel类java.nio.channels.ServerSocketChannel类用于创建服务器端监听套接字通道,该类对象主要用于接受此套接字的连接。返回类型方法名方法功能staticServerSocketChannelopen()打开服务器套接字通道ServerSocketsocket()获取与此通道关联的服务器套接字SocketChannelaccept()接受到此通道套接字的连接表14.2ServerSocketChannel类的常用方法14.7.3Selector类

通过选择器,一个线程可以监控和处理多个通道的通信,大大提高资源利用率。Selector类,也称之为选择器,用于实现Channel通道的多路复用。选择器的工作原理:首先把通道注册到选择器上,并指出待监控类型:连接、读操作、写操作等。注册成功,选择器会分配给该通道一个键值key,并存入选择器的键集合中。然后就可以遍历键集合,获取各键对应的通道,根据当前通道的状态完成相关的读/写等操作。14.7.3Selector类返回类型方法名方法功能staticSelectoropen()创建一个选择器booleanisOpen()判断选择器是否已打开Set<SelectionKey>keys()获取选择器的键集合intselect()选择一组准备就绪通道的键Set<SelectionKey>selectedKeys()获得选择器的已选择键集合voidclose()关闭此选择器表14.3Selector类的常用方法键集合:注册到此选择器上的通道键集合;已选择键集合:至少为一个操作准备就绪的通道键集合;已取消键集合:已被取消,但通道尚未注销的键的集合。在新创建的选择器中,这三个集合都是空集合。选择器维护3个选择键集合:键集合;已选择键集合;已取消键集合。14.7.4SelectionKey类java.nio.channels.SelectionKey类用于表示通道在选择器中注册的选择键。

每次向选择器注册通道时就会创建一个选择键。选择键包括两个操作集:表示下一次调用选择器的选择方法时,测试哪类操作的准备就绪信息。创建该键时使用给定的值初始化interest集合;以后也可通过interestOps(int)方法对其进行更改。指示其通道对该操作类别已准备就绪。该集合外部不能修改。interest集合:ready集合:14.7.4SelectionKey类SelectionKey类的操作类别属性有:OP_ACCEPT:连接可接受操作,

温馨提示

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

评论

0/150

提交评论