版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章,网络编程技术,目 录,9.1 网络编程基础知识 9.2 IP地址及URL类 9.3 Socket通信 9.4 数据报通信 9.5 综合应用举例,Java语言提供了丰富的网络编程类库,因此它非常适合用于网络编程,强大快捷的网络编程功能正是Java备受欢迎的主要原因之一。 Java的网络功能由几个不同的包实现,基本的网络功能定义在包中。其中的接口和类可以大致分为三部分:URL、URLConnection和Socket。本章将讨论如何使用这些类和接口进行网络编程,实现网络资源的访问和网络通信。,9.1 网络编程基础知识,TCP/IP采用层次化体系结构,从上至下分为四层:应用层、传输层、网络层
2、和数据链路层,每一层都实现特定的网络功能。 1)应用层 2)传输层 3)网络层 4)数据链路层,这四层结构中比较常见的协议有如下几种: 1)IP协议 2)TCP协议 3)UDP协议 4)HTTP 5)FTP 6)SMTP 7)POP3 8)IMAP,IP地址,连接到Internet中的每台计算机都有唯一的地址,这就是IP地址。一个IP地址由域名、端口号和服务类型组成。,套接字(Socket),套接字(socket)是网络上运行的两个不同主机的进程间进行双向通信的端点,用于建立两个不同应用程序之间通过网络进行通信的信道。一般来说,位于不同主机的应用进程之间要在网络环境下进行通信,必须要在网络的每
3、一端都要建立一个套接字。两个套接字之间可以是有连接的,也可以是无连接的,并通过套接字的读、写操作实现网络通信功能。,套接字由IP地址与端口组成。它既可以接收请求,也可以发送请求,因此利用它可以较为方便地编写网络上数据传输的程序。 根据传输的数据类型不同,套接字可以分为面向连接的数据流套接字(Stream Socket)和无连接的数据报套接字(Datagram Socket)两种类型。其中,TCP套接字是面向连接的套接字的代表,UDP套接字是无连接的数据报套接字的代表。,目 录,9.1 网络编程基础知识 9.2 IP地址及URL类 9.3 Socket通信 9.4 数据报通信 9.5 综合应用举
4、例,9.2 IP地址及URL类,J.InetAddress类是Java的IP地址的封装类,用于实现对IP地址的各种操作。它不需要用户了解如何实现对IP地址操作的细节。 Internet用URL表示各种网络数据资源的地址。通过URL用户可以访问Internet上的各种网络资源。为了处理方便,Java将URL封装为URL类。,9.2.1 InetAddress类,Java提供了InetAddress类,用于实现主机名和IP地址之间的转换。InetAddress类描述了32位或64位的IP地址,并通过它的两个子类Inet4Address 和 Inet6Address来实现。 InetAddress类
5、的定义如下: public final class InetAddress extends object implements Serializable 其中:String类型的hostName和int类型的address,即主机名和IP地址。由于它们是私有成员,因此不能直接访问它们。,由于InetAddress类没有构造方法,所以也不能直接创建InetAddress对象。要创建该类的实例对象,可以通过该类的静态方法获得该对象。找不到本地机器的地址时,这些方法通常会抛出UnknownHostException异常,所以应该在程序中进行异常处理。,.InetAddress类的主要方法,1)pub
6、lic static InetAddress getLocalHost() 该方法返回一个InetAddress对象,这个对象包含了本地机的IP地址。当查找不到本地机的地址时,将会抛出一个UnknownHostException异常。 2)public static InetAddress getByName (String host) 该方法返回一个由host指定的InetAddress对象,参数host可以是一个主机名,也可以是一个IP地址或者一个DNS域名。如果找不到指定的主机的IP地址,那么该方法将抛出一个UnknownHostException异常。 3)public static
7、InetAddress getByAddress(byte addr) 根据给定的IP字节地址创建一个InetAddress对象的引用。如果addr是IPv4地址,则返回一个Inet4Address对象。如果addr是IPv6地址,则返回一个Inet6Address对象。如果返回的既不是4字节的也不是16字节的,那么方法将会抛出一个UnknownHostException异常。,获得一个InetAddress对象后,就可以使用InetAddress类的getAddress()方法获得本机对象的IP地址(存放在字节数组中);使用getHostAddress()方法获得本机对象的IP地址;使用ge
8、tHostName()方法获得主机名。,4)public static InetAddress getAllByName(String host) 在Internet上,可以用相同的名字代表一组计算机,如就可以对应3个不同的地址,在主机被访问时随机选择一个地址。getAllByName(String host)用来获取具有相同名字的主机的地址对象,并存放在一个地址对象数组中。出错了同样会抛出UnknownException异常。 5)public Sring getHostAddress() 该方法将IP地址以网络字节顺序的字节数组的形式返回。由于IPV4只有4个字节, IPV6有16个字节,
9、如果需要知道数组的长度,可以用数组的length字段获得。 6)public Sring getHostName() getHostName()方法返回一个字符串形式的主机名字。如果被查询的机器没有主机名,或者如果使用了Applet,但是它的安全性却禁止查询主机名,则该方法就返回一个具有点分形式的数字IP地址。,例9-1 InetAddress类的getByName()方法的使用示例。 / file name:InetAddressTest.java import .*; public class InetAddressTest public static void main(String a
10、rgs) try InetAddress address_1 = InetAddress.getByName(); System.out.println(address_1.toString(); InetAddress address_2 = InetAddress.getByName(3); System.out.println(address_2.toString(); catch (UnknownHostException e) System.out.println(无法找到 ); ,9.2.2 URL类,通过URL可以访问Internet上的各种网络资源。UR
11、L的基本结构由如下5部分组成: :/:/# 传输协议(protocol):有HTTP、FTP、File等。默认为HTTP协议。 主机名(hostname):指定资源所在的主机名。主机名可以是IP地址,也可以是主机的名字或者域名。 端口号(port):端口号用来区分一个计算机中提供的不同服务,如Web服务、FTP服务等。每一种服务都用一个端口号,范围是065535。在URL中,hostname后面的冒号及端口号是可以省略的, HTTP的默认端口号是80。 文件名(filename):文件名包括该文件的完整路径。在HTTP协议中,有一个默认的文件名是index.html,因此,与 引用(refer
12、ence):是对资源内的某个引用,如,URL类的构造方法,(1)public URL(String spec):使用URL字符串构造一个URL对象 (2)public URL(URL context,String spec): 用已经存在的URL对象contex创建URL对象。Context指事先创建的某个URL对象,spec通常是context上的某个文件或子目录。 (3)public URL(String protocol,String host,String file):用指定的协议、主机名、文件路径及文件名创建一个URL对象; (4)public URL(String protocol
13、,String host,int port,String file):用指定的协议、主机名、端口号、文件路径及文件名创建一个URL对象。第一个String类型的参数是协议的类型,可以是HTTP、FTP等。第二个String类型参数是主机上的某个文件(可以包括目录),int类型参数是指定端口号,最后一个参数给出文件名或路径名。,URL类中的主要方法,例9-3 创建一个URL对象,并输出该URL对象的信息。 / file name:CreateURL.java import .*; import java.io.*; public class CreateURL public static voi
14、d main(String args) try URL url = new URL(:80/downloads/index.htm); System.out.println(the Protocol: + url.getProtocol(); System.out.println(the hostname: + url.getHost(); System.out.println(the Port: + url.getPort(); System.out.println(the file: + url.getFile(); System.out.println(url.toString(); c
15、atch (MalformedURLException e) System.out.println(e); ,9.2.3 URLConnection类,虽然通过URL类的openStream()方法能够读取网络上资源中的数据,但是Java提供的URLConnection类中包含了更加丰富的方法,可以对网络上的资源进行更多的处理。例如,通过URLConnection类,既可以从URL中读取数据,也可以向URL中的资源发送数据。URLConnection类表示在应用程序和URL所标识的资源之间的一个通信连接,它是一个抽象类。,9.2.3 URLConnection类,创建URLConnection
16、对象之前必须先创建一个URL对象,然后通过调用URL类提供的openConnection ()方法,就可以获得一个URLConnection类的对象。URLConnection类的构造方法如下: public URLConnection(URL):用于创建一个指定URL的连接对象。 但是,用URLConnection的构造方法来创建URLConnection类对象时,并未建立与指定URL的连接,还必须调用URLConnection类的connect()方法才能建立连接。 openConnection()方法的定义如下: public URLConnection openConnection()
17、;,9.2.3 URLConnection类,下面是使用URL类的openConnection()方法建立连接的几条语句: 例如:URL url=new URL(“”); URLConnection connectionurl.openConnection();,URLConnection类中的主要方法,/ file name:URLConnection.java import java.io.*; import .*; import java.util.Date; class URLConnection public static void main(String args) throws
18、Exception System.out.println(starting); int c; URL url = new URL(); URLConnection urlcon=url.openConnection(); System.out.println(the data is : + new Date(urlcon.getDate(); System.out.println(content-type: + urlcon.getContentType(); inputStream in = urlcon.getInputStream(); while (c=in.read() != -1)
19、 System.out.print(char) c); in.close(); ,目 录,9.1 网络编程基础知识 9.2 IP地址及URL类 9.3 Socket通信 9.4 数据报通信 9.5 综合应用举例,9.3 Socket通信,根据传输的数据类型不同,套接字可以分为面向连接的数据流套接字(Stream Socket)和无连接的数据报套接字(Datagram Socket)两种类型。 Stream Sockets套接字用于在主机和Internet之间建立可靠的、双向的、持续的、点对点的流式连接。这种流式连接的优点是所有数据都能准确、有序地传送到接收方,缺点是速度较慢。其中,TCP套接字
20、是面向连接的套接字的代表,UDP套接字是无连接的数据报套接字的代表。,9.3.1 Socket的通信机制,由于基于套接字的程序设计涉及到通信的两端,即服务器端和客户端,因此在开发通信程序时,要对服务器端套接字和客户端套接字分别进行设计。这里先讨论TCP通信中与Socket通信相关的两个类,一个是代表服务器端套接字的ServerSocket类,另一个是代表客户端套接字的Socket类。,Socket类,客户端可以通过构造一个Socket类对象来建立 与服务器的连接。基于Socket的连接可以是流连接,也可以是数据报连接,这取决于构造Socket类时使用的构造方法。这里先讨论流式连接。Socket
21、类的构造方法有如下6种: Socket():创建一个套接字对象,该对象不请求任何连接。 Socket(String host, int port) 创建一个Socket对象,请求与host指定的服务器通过port端口建立连接 Socket(String host, int port, boolean type) 创建一个连接指定主机、指定端口的Socket类,boolean类型的参数用来设置是流式Socket还是数据报Socket。,Socket(InetAddress,int) 创建一个连接指定Internet地址、指定端口的流式Socket类对象 Socket(InetAddress, i
22、nt,Boolean stream) 创建一个连接指定Internet地址、指定端口的Socket类 对象,boolean类型的参数用来设置是流式Socket还是 数据报Socket。 Socket(String host,int port,InetAddress localAddr,int localport) 以本地主机localAddr的localport端口创建一个Socket 类对象,并请求和host指定的服务器通过port端口建立 连接。,Socket类的主要方法,2. ServerSocket类,ServerSocket类用在服务器端,用来监听所有来自指定端口的连接,并为每个新的
23、连接创建一个Socket对象。之后客户端便可以与服务器端开始通信了。 ServerSocket类的几个构造方法如下: ServerSocket(int port): 在指定端口上创建一个ServerSocket类对象。 ServerSocket(int port, int backlog): 在指定端口上创建一个ServerSocket类对象,并进入监听状态,第二个int类型的参数backlog是服务器忙时保持连接请求的等待客户数量。 ServerSocket(int port, int backlog, InetAddress bindAddr) 使用指定的端口和和要绑定到的服务器 IP 地
24、址创建一个ServerSocket类对象,并进入监听状态。,例如: Socket client = new Socket(127.0.01., 80); ServerSocket server = new ServerSocket(80,100); 如果运行时无法绑定到 80 端口, 以上代码会抛出 IOException, 更确切地说, 是抛出 BindException, 它是 IOException 的子类。 BindException 一般是由于端口已经被其他服务器进程占用或者在某些操作系统中, 如果没有以超级用户的身份来运行服务器程序, 那么操作系统不允许服务器绑定到 11023 之
25、间的端口。因此需要进行异常捕获。,ServerSocket类的主要方法,首先,在服务器端构造一个ServerSocket类,在指定端口上进行监听,这时服务器的线程处于等待状态。然后在用户端构造Socket类,与服务器上的指定端口进行连接。服务器监听到连接请求后,就可在两者之间建立连接。连接建立之后,还必须进行输入、输出流的连接才能开始进行通信。通信的一般步骤如下: (1)创建服务器ServerSocket,设置建立连接的port。 (2)创建客户端Socket,设置绑定的主机名称或IP地址,指定连接端口号。 (3)客户端Socket发起连接请求。 (4)建立连接(accept)。 (5)获取相
26、应的InputStream和OutputStream。 (6)利用InputStream和OutputStream进行数据通信。,9.3.2 实现Socket通信,从上述程序中可以看到,当创建ServerSocket对象时,需要的只是一个端口号和IP地址。如果服务器就设定在本地,则不需要IP地址。调用accept()方法时,服务器端进阻塞状态,等待客户端的请求,直到有一个客户启动并请求连接到相应的服务器端口。 在通信时,由Socket对象可以得到与之相关联的一个网络输入流和网络输出流。如果一个进程要通过网络向另一个进程发送数据,只需要写入与socket相关联的输出流。同样,如果一个进程要读取另
27、一个进程发送过来的数据,则可以从与socket相关联的输入流中读取。,目 录,9.1 网络编程基础知识 9.2 IP地址及URL类 9.3 Socket通信 9.4 数据报通信 9.5 综合应用举例,9.4 数据报通信,TCP/IP是一种面向连接的协议,而UDP是一种无连接的协议,它只是将数据的目的地写在数据报中,然后直接放在网络上,不保证传输质量。对于一些不需要很高质量的应用程序来说,数据报通信是一个非常好的选择。 另外,就是在对实时性要求很高的情况下,例如在实时音频和视频应用中,数据包的丢失和位置错乱是静态的,可以被人们忍受,但是如果在数据包位置错乱或丢失时要求数据包重传,用户则不能忍受,
28、这时就可以利用UDP协议传输数据包。,在Java的包中定义的两个类DatagramSocket和DatagramPacket,它们为应用程序中采用数据报通信方式进行网络通信提供了支持。,数据报(Datagram)是网络层数据单元在介质上传输信息的一种逻辑分组格式,它是一种在网络中传播的、独立的、自身包含地址信息的消息,它的通信双方是不需要建立连接的。在使用数据报之前,首先需要将数据打包,然后才能使用该数据报。,9.4.1 DatagramPacket类,1将数据打包 J包中的DatagramPacket类用来创建数据报。有两种类型的数据报: 一种是需要被传递的数据报,该数据报中包含要传递到的目
29、的地址; 另一种数据报是用来接收传递过来的数据报中的数据。它们可以分别用DatagramPacket类的几个构造方法来创建。,(1) public DatagramPacket(byte recvBuf,int ilength) : 该构造方法用来创建一个字节数组recvBuf以接收UDP包。ilength为从传递过来的数据包中读取的字节数,它不能超过数组的大小。 (2) public DatagramPacket( byte recvBuf ,int offset,int ilength):该构造方法将接收到的数据从recvBufoffset开始存放。如果数据报长度超出了ilength,则触
30、发IllegalArgument Exception异常。,(3) public DatagramPacket(byte sendBuf,int ilength,InetAddress iaddr,int iport):该构造方法用来创建要传输的数据报。sendBuf为要发送数据的存储区,ilength应小于sendBuf字节数组的大小。iaddr为数据报要传递到的目标地址,iport为接收端接收数据报的端口号。 (4) public DatagramPacket(byte sendBuf ,int offset,int ilength,InetAddress iaddr,int iport)
31、:与上述构造方法不同的是,该方法从sendBuf数组的offset位置开始填充数据报ilength字节,如果没有offset,则从sendBuf数组的0位置开始填充。,2、使用数据报,在创建数据报之后,就可以使用数据报了。接收数据报对象、获取数据报中的信息的主要方法如表9-6所示.,DatagramPacket类的主要方法,9.4.2 DatagramSocket类,仅创建了数据报是不够的,发送和接收数据报时还需要创建用于发送和接收数据报的套接字。DatagramSocket类可以用来定义发送和和接收数据报的套接字。它在本地机器端口监听是否有数据到达或者是否需要将数据报发送出去。 Datagr
32、amSocket的构造方法有如下几种,允许指定要绑定的端口号和Internet地址。,1. 创建DatagramSocket对象,1) public DatagramSocket()。用本地机器上任何一个可用的端口创建一个用于发送的DatagramSocket类对象,这个端口号是由系统随机产生的。 2) public DatagramSocket(int port) 用一个指定的端口号port创建一个DatagramSocket对象,用于发送和接收数据报。当不能创建套接字时就抛出SocketException异常。 3) public DatagramSocket(int port,InetA
33、ddress iaddr) 用绑定指定地址的指定端口创建一个DatagramSocket对象。给出端口号时要保证不发生端口冲突,否则会生成SocketException类异常。,用数据报方式编写客户/服务器模式下的程序时,在接收数据前,应该先创建一个DatagramPacket对象,给出接收数据的缓冲区及其长度,作为传输数据的载体。另外,还需要再创建一个DatagramSocket对象,调用其receive()方法等待数据报的到来。,2. 使用DatagramSocket,receive()方法的定义如下: public void receive(DatagramPacket p) recei
34、ve()方法从网络上接收数据报并将其存储在DatagramPacket类的对象p中。该对象中的数据缓冲区必须足够大,以便receive()把尽可能多的数据存放在其中。如果装不下,就把其余的部分丢弃。接收数据出错时会抛出IOException异常。 例如: DatagramPacket packet=new DatagramPacket(buf,256); Socket.receive (packet);,发送数据前,也要先创建一个新的DatagramPacket对象,它要给出存放发送数据的缓冲区以及完整的目的地址,包括IP和端口号。发送数据是通过DatagramSocket对象的send()方法实现的,send()根据数据报的目的地址来传递数据报。 DatagramPacket packet=new DatagramPacket(buf,length,address,port); Socket.send(packet); ,1) 创建一个用于数据报通信的DatagramSocket类对象; 2) 创建一个DatagramPacket类对象,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 短视频薪酬奖惩制度
- 公司保洁承包奖惩制度
- 县医院职工奖惩制度汇编
- 医务人员医德医风j奖惩制度
- 思政教师奖惩制度
- 施工项目质量奖惩制度范本
- 招生奖惩制度实施细则
- 慢性病报告管理奖惩制度
- 乡村砼道路班组奖惩制度
- 幼儿园职工考核奖惩制度
- 《史记》上册注音版
- 新大象版四年级下册科学第二单元《自然界的水》课件(共4课)
- 彩钢板屋面拆除、更换屋面板施工方案(改)
- 污水处理厂生物除臭技术方案
- GB/T 24245-2009橡胶履带用钢帘线
- GB/T 20671.2-2006非金属垫片材料分类体系及试验方法第2部分:垫片材料压缩率回弹率试验方法
- 门诊医疗质量管理课件
- 初三数学总复习教学策略课件
- 第三讲-就业信息的收集与处理课件
- 天津大学讲义-工程成本管理概述
- 环境与可持续发展ppt课件(完整版)
评论
0/150
提交评论