第 12章 Java的网络功能概述
TCP/IP( Transmission Control
Protocol/Internet Protocol,传输控制协议 /网间协议)
包括五个层次:应用层、传输层、网络层、链路层、物理层
ISO/OSI网络参考模型
包括七个层次:应用层、表示层、会话层、传输层、网络层、链路层、物理层概述
IP地址
网络中的硬件资源标识
是一个 32位的整数,通常以,%d.%d.%d.%d”的形式表示,每个 d是一个 8位整数
端口号( port)
标记机器的逻辑通信信道的正整数,不是物理实体
一个 16位的整数表达,其范围为 0~ 65535,其中 0~
1023为系统所保留
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.cn
http://java.sun.com:80/whitePaper/Javawhitepaper_1.html
http://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.close()
OutputStream
InputStream
ServerSocket(port#)
ServerSocket.accept()
Socker()
服务器
Socket.close()
OutputStream
InputStream
Socket(host,port#)
(attempt to connect)
客户机注册服务等待连接
socket通信基本步骤
在服务器端指定一个用来等待连接的端口号,在客户端规定一个主机和端口号,从而在客户端和服务器端创建 Socket/ServerSocket
实例
打开连接到 Socket的输入 /输出流
利用输入 /输出流,按照协议对 Socket进行读 /写操作
关闭输入 /输出流和 Socket
socket通信程序设计
服务器端程序 (程序 12-5)监听客户端应用程序建立连接的请求,并在连接建立后向客户端发送信息
客户端程序 (程序 12-6)用来与服务器端程序建立连接,并将服务器端送来的信息显示在标准输出上
Java编程综合实例
使用它可以进行 BBS站点的登录。同时程序中应用了本章之前的绝大部分知识,包括基本数据操作、图形界面设计以及 Applet程序的编写等
代码如 程序 12-7所示
HTML文件