Java程序设计技术第12章 Java的网络功能(第二版)
第12章 Java的网络功能,概述,TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网间协议)包括五个层次:应用层、传输层、网络层、链路层、物理层 ISO/OSI网络参考模型包括七个层次:应用层、表示层、会话层、传输层、网络层、链路层、物理层,概述,IP地址 网络中的硬件资源标识 是一个32位的整数,通常以“%d.%d.%d.%d”的形式表示,每个d是一个8位整数 端口号(port)标记机器的逻辑通信信道的正整数,不是物理实体一个16位的整数表达,其范围为065535,其中01023为系统所保留 Socket(套接字) 网络上运行的程序之间双向通信链路的最后终结点,是TCP和UDP的基础,概述,TCP协议具有可靠性和有序性,并且以字节流的方式发送数据,它通常被称为流通信协议。端点与端点之间建立持续的连接 当对所传输的数据具有时序性和可靠性等要求时,应使用TCP协议 用户数据报协议UDP 一种无连接的传输协议 需要将传输的数据定义成数据报(Datagram),在数据报中指明数据所要达到的端点(Socket,主机地址和端口号),再将数据报发送出去当传输的数据比较简单、对时序等无要求时应使用UDP协议,Java的网络功能,按层次及使用方法分为四大类 InetAddress面向IP层,用于标识网络上的硬件资源URL 面向应用层,可以通过URL的网络资源表达形式确定数据在网络中的位置Socket 面向传输层,使用的是TCP协议 Datagram 面向传输层,使用的是UDP协议,是另一种网络传输方式,它把数据的目的地记录在数据包中,然后直接放在网络上,java.net主要的类及例外,使用InetAddress,构造一个InetAddress实例没有构造函数,因此不能用new来构造,public static InetAddress getByName(String host); public static InetAddress getLocalHost(); public static InetAddress getAllByName(String host),host可以是一台机器名,也可以是一个形如“%d.%d.%d.%d”的IP地址或一个DSN域名。,InetAddress类主要方法,public byte getAddress()获得本对象的IP地址(存放在字节数组中)public String getHostAddress()获得本对象的IP地址“%d.%d.%d.%d”public String getHostName()获得本对象的机器名,程序12-1,演示Java如何根据域名自动到DNS(域名服务)上查找IP地址 程序12-1 执行GetIP后,可以得到下列信息: www.nankai.edu.cn/202.113.16.33 获取本机的IP地址 例12-1,本机名称和地址,统一资源定位器,URL是Uniform Resource Locator(统一资源定位器)的缩写,它表示Internet上某一资源的地址 nternet上的资源包括HTML文件、图象文件、声音文件、动画文件以及其他任何内容URL包括两部分内容 协议名称和资源名称,中间用冒号隔开,Protocol: resourceName,URL的具体结构,protocol:/host_name:port_number/file_name/reference,protocol:用来指示所要获取资源的传输协议,如:http、ftp、gopher、file等host_name:用来指示资源所在的主机port_number:用来指示连接时所使用的通信端口号file_name:用来指示该资源在主机的完整文件名reference:指示资源中的某个特定位置,http:/www.nankai.edu.cnhttp:/java.sun.com:80/whitePaper/Javawhitepaper_1.htmlhttp:/www.abc.com:8080/java/network.html#UDP http:/www.neca.com/vmis/java.html,URL的构造方法,public URL(String spec) 将整个URL的名称直接以字符串的形式作为参数传入即可 public URL(URL context, String spec) 可以表示相对URL位置的定义 第一个参数设为null,那么它的作用就和第一种方式相同了,URL url1= new URL("http:/www.nankai.edu.cn");,URL host = new URL("file:/export/home/Java/image/"); URL aImage = new URL(host, getParameter("FILENAME");,URL的构造方法,public URL(String protocol, String host, String file) public URL(String protocol, String host, int port, String file) 直接指定每个域的内容,而不是直接给出一个字符串来表示。必须给出确定的传输协议、机器名称、文件名,或者加上端口号,比如以:http:/java.sun.com:80/whitePaper/Javawhitepaper_1.html为例,构造方式为:URL url3 = new URL("http","java.sun.com",80,"/whitePaper/Javawhitepaper_1.html");,与URL相关的异常,类URL的构造方法中都声明抛出非运行时异常MalformedURLException 查看示例12-1,获取URL对象属性,String getProtocol()获取传输协议String getHost()获取机器名称String getPort()获取通信端口号String getFile()获取资源文件名称String getRef()获取参考点下面的两个方法将URL对象的内容以字符串的形式来表示,它们的作用是相同的String toString()String toExternalForm(),程序12-2,程序12-2中创建了一个URL对象,然后输出其属性,读入URL数据,openStream()方法 读取一个URL对象所指定的资源。与指定的URL建立连接并返回一个InputStream对象程序 12-3 在命令行中指定一个合理的文件名,便可以显示出文件的内容,其功能类似于DOS中的type命令,Applet中网络通讯,在Applet中将URL和InetAddress联合使用来得到相关的IP地址1)通过类Applet的getCodeBase()方法获得提供它的主机的URL实例 2)利用类URL的getHost()方法得到主机名 3)利用类InetAddress的getByName()得到该主机的IP地址4)通过IP地址,就可以进行网络通信了,使用的协议包括TCP或是UDP。见例12-2,应用程序和URL资源之间进行交互,通过URLConnection类,可以在应用程序和URL资源之间进行交互,既可以从URL中读取数据,也可以向URL中发送数据 openStream()只能从网络上读取资源中的数据URLConnection中方法public URLConnection openConnection() public InputStream getInputStream() public OutputStream getOutputStream()例12-3 程序12-4,socket接口,在Java中,基于TCP协议实现网络通信的类有两个:在客户端的Socket类和在服务器端的ServerSocket类。SeverSocket类的功能是建立一个Sever,并通过accept()方法随时监听客户端的连接请求,类Socket方法,构造方法Socket的输入/输出流管理方法,Socket(InetAddress address,int port);Socket(InetAddress address,int port,boolean stream);Socket(String host,int port); Socket(String host,int port,boolean stream);,stream则表示该socket是否是支持流的socket,public InputStream getInputStream()public void shutdownInput() public OutputStream getOutputStream() public void shutdownOutput(),Socket的方法,关闭Socket的方法 设置/获取Socket数据的方法为,public void close() throws IOException,public InetAddress getInetAddress()public int getPort() public void setSoTimeout(int timeout),类ServerSocket方法,类ServerSocket的构造方法 其他方法,public ServerSocket(int port)public ServerSocket(int port, int backlog):支持指定数目的连接public ServerSocket(int port, int backlog, InetAddress bindAddr),public Socket accept():等待客户端的连接,socket的基本概念,建立连接当程序需要建立网络连接时,必须有一台机器运行一个程序,随时等候连接,而另一端的程序则对其发出连接请求,同电话系统类似 建立连接的过程 服务器端生成一个ServerSocket实例对象,随时监听客户端的连接请求 客户端生成一个Socket实例对象,并发出连接请求服务器端通过accept()方法接收到客户端的请求后,开辟一个接口与之进行连接,并生成所需的I/O数据流。通信都是通过一对InputStream和OutputStream进行的。通信结束后,两端分别关闭对应的Socket接口,socket的基本概念,连接地址当程序建立网络连接时,需要知道地址或主机名称。另外,网络连接还需要一个端口号 端口号 在两个程序连接之前,彼此之间必须达成一致,只有客户端和服务器端指定端口号一致时连接才会建立,网络连接模式,socket通信基本步骤,在服务器端指定一个用来等待连接的端口号,在客户端规定一个主机和端口号,从而在客户端和服务器端创建Socket/ServerSocket实例打开连接到Socket的输入/输出流利用输入/输出流,按照协议对Socket进行读/写操作关闭输入/输出流和Socket,socket通信程序设计,服务器端程序(程序 12-5)监听客户端应用程序建立连接的请求,并在连接建立后向客户端发送信息客户端程序 (程序12-6)用来与服务器端程序建立连接,并将服务器端送来的信息显示在标准输出上,Java编程综合实例,使用它可以进行BBS站点的登录。同时程序中应用了本章之前的绝大部分知识,包括基本数据操作、图形界面设计以及Applet程序的编写等代码如程序12-7所示 HTML文件,