Logo2020年2月24日2时54分1第二十三讲Java网络编程LogoJava2Java语言提供了丰富的网络编程类库,因此它非常适合用于网络编程,强大快捷的网络编程功能正是Java备受欢迎的主要原因之一。Java的网络功能由几个不同的包实现,基本的网络功能定义在java.net包中。其中的接口和类可以大致分为三部分:URL、URLConnection和Socket。1、引言LogoJava32、IP(InternetProtocol)地址连接到Internet中的每台计算机都有唯一的地址,这就是IP地址。IP地址的表示:IP地址使用32位长度二进制数据表示,一般在实际中看到的大部分IP地址都是以十进制数据表示的。如:172.19.9.68。IP地址分类:IP地址分五类,A类留给政府机构;B类分配给中等规模的公司;C类分配给任何需要的人;D类用于组播;E类用于实验用。LogoJava4NO地址分类地址范围1A类地址1.0.0.1-126.255.255.2542B类地址128.0.0.1-191.255.255.2543C类地址192.0.0.1-223.255.255.2544D类地址224.0.0.1-239.255.255.2545E类地址240.0.0.1-255.255.255.254在实际中可以用127.0.0.1或Localhost表示本机LogoJava53、InetAddress类在Java中通过InetAddress类表示IP地址,用于实现主机名和IP地址之间的转换。InetAddress类描述了32位或64位的IP地址,并通过它的两个子类Inet4Address和Inet6Address来实现。之前的IP地址,实际上使用四个十进制数字表示,相当于32位,把这样的IP地址称为IPV4。但是随着网络上主机越来越多,发现IPV4地址不够使用,所以又进行了改进产生了IPV6(64位)。注意InetAddress类的构造方法被私有化了,所以不能通过构造方法对其产生实例对象,只能通过其静态方法对其产生实例对象。找不到本地机器的地址时,这些方法通常会抛出UnknownHostException异常,所以应该在程序中进行异常处理。LogoJava6java.net.InetAddress类的主要方法方法名功能说明staticInetAddressgetLocalHost()获得本地主机的InetAddress对象staticInetAddressgetByName(Stringhost)获得通过主机名host指定的InetAddress对象StringgetHostAddress()以带圆点的字符串形式获取IP地址StringgetHostName()获取主机名字LogoJava71)publicstaticInetAddressgetLocalHost()该方法返回一个InetAddress对象,这个对象包含了本地机的IP地址。当查找不到本地机的地址时,将会抛出一个UnknownHostException异常。2)publicstaticInetAddressgetByName(Stringhost)该方法返回一个由host指定的InetAddress对象,参数host可以是一个主机名,也可以是一个IP地址或者一个DNS域名。如果找不到指定的主机的IP地址,那么该方法将抛出一个UnknownHostException异常。获得一个InetAddress对象后,就可以使用InetAddress类的getAddress()方法获得本机对象的IP地址(存放在字节数组中);使用getHostAddress()方法获得本机对象的IP地址;使用getHostName()方法获得主机名。LogoJava83)publicSringgetHostAddress()该方法将IP地址以网络字节顺序的字节数组的形式返回。由于IPV4只有4个字节,IPV6有16个字节,如果需要知道数组的长度,可以用数组的length字段获得。4)publicSringgetHostName()getHostName()方法返回一个字符串形式的主机名字。如果被查询的机器没有主机名,或者如果使用了Applet,但是它的安全性却禁止查询主机名,则该方法就返回一个具有点分形式的数字IP地址。LogoJava9importjava.net.InetAddress;publicclassInetAddressTest{publicstaticvoidmain(Stringargs[])throwsException{InetAddresslocAdd=null;InetAddressremAdd=null;locAdd=InetAddress.getLocalHost();//得到本机remAdd=InetAddress.getByName();System.out.println(本机的IP地址:+locAdd.getHostAddress());System.out.println(黄淮学院主机的IP地址:+remAdd.getHostAddress());}};LogoJava10教材第218页例2程序运行结果如下:LogoJava114、TCP/IP层次结构TCP/IP采用层次化体系结构,从上至下分为四层:应用层、传输层、网络层和数据链路层,每一层都实现特定的网络功能。这四层结构中比较常见的协议有如下几种:1)IP协议(网络层)2)TCP协议(传输层)3)UDP协议(传输层)4)HTTP(应用层)5)FTP(应用层)LogoJava12Application(http、ftp、telnet、„„)Transport(TCP、UDP)Network(IP)Link(devicedriver)LogoJava135、URL类URL(Uniform/UniversalResourceLocator)统一资源定位符号。通过URL可以访问Internet上的各种网络资源。URL的基本结构由如下5部分组成:传输协议://主机名:端口号/文件名#引用传输协议(protocol):有HTTP、FTP、File等。默认为HTTP协议。主机名(hostname):指定资源所在的主机名。主机名可以是IP地址,也可以是主机的名字或者域名。端口号(port):端口号用来区分一个计算机中提供的不同服务,如Web服务、FTP服务等。每一种服务都用一个端口号,范围是0~65535。在URL中,hostname后面的冒号及端口号是可以省略的,HTTP的默认端口号是80。LogoJava14文件名(filename):文件名包括该文件的完整路径。在HTTP协议中,有一个默认的文件名是index.html,因此,两者等价。引用(reference):是对资源内的某个引用,如。URL类的构造方法1、publicURL(Stringspec):使用URL字符串构造一个URL对象URLu1=newURL();LogoJava15URL类的构造方法2、publicURL(Stringprotocol,Stringhost,Stringfile):用指定的协议、主机名、文件路径及文件名创建一个URL对象;URLu2=newURL(http,~xyx/doc/manhua.html);3、publicURL(Stringprotocol,Stringhost,intport,Stringfile):用指定的协议、主机名、端口号、文件路径及文件名创建一个URL对象。第一个String类型的参数是协议的类型,可以是HTTP、FTP等。第二个String类型参数是主机上的某个文件(可以包括目录),int类型参数是指定端口号,最后一个参数给出文件名或路径名。URLu3=newURL(http,~xyx/doc/manhua.html);LogoJava16URL类中的主要方法方法名功能说明publicStringgetProtocol()获取该URL的协议名publicStringgetHost()获取该URL的主机名publicintgetPort()获取该URL的端口号。若无端口,返回-1publicStringgetFile()获取该URL中的文件名publicStringgetContent()获取传输协议publicStringtoString()将URL转化为字符串InputStreamopenStream()打开该URL的输入流publicStringgetPath()获取该URL的路径URLConnectionopenConnection()打开由该URL标识的位置的连接voidset(stringprotocol,stringhost,intprot,stringfile,stringref)设置该URL的各域的值LogoJava17利用URL获取网络资源利用URL获取网络资源步骤如下:(1)创建URL对象;(2)使用URL对象的openStream()方法,返回一个InputStream;(3)从InputStream读入即可。课本第22页例题:importjava.net.*;importjava.io.*;publicclassURLReader{LogoJava18publicstaticvoidmain(String[]args)throwsException{URLu=newURL();InputStreamin=u.openStream();byte[]b=newbyte[in.available()];in.read(b);System.out.println(newString(b));in.close();}}LogoJava196、URLConnection类虽然通过URL类的openStream()方法能够读取网络上资源中的数据,但是Java提供的URLConnection类中包含了更加丰富的方法,可以对网络上的资源进行更多的处理。例如,通过URLConnection类,既可以从URL中读取数据,也可以向URL中的资源发送数据。URLConnection类表示在应用程序和URL所标识的资源之间的一个通信连接,它是一个抽象类。LogoJava20URLConnection类创建URLConnection对象之前必须先创建一个URL对象,然后通过调用URL类提供的openConnection()方法,就可以获得一个URLConnection类的对象。URLConnection类中的主要方法方法名功能说明voidconnect()建立URL连接ObjectgetContent()获取该URL的内容intgetContentLength()获取响应数据的内容长度StringgetContentType()获取响应数据的内容类型longgetDate()获取响应数据的创建时间longgetExpiration()获取响应数据的终止时间InputStreamgetInputStream()获取该连接的输入流longgetLastModified()获取响应数据的最后修改时间OutputStreamgetOutputStream()获取该连接的输出流LogoJava21importjava.io.*;importjava.net.*;importjava.util.D