Download presentation
Presentation is loading. Please wait.
1
第11章 Java网络编程 本章要点 11.1 网络基础 11.2 InetAddress编程 11.3 URL编程
在Internet(互联网)被广泛使用的今天,网络编程显得日益重要。网络应用是Java语言取得成功的领域之一,它已经成为现在Internet上最流行的一种编程语言。 Java语言的网络功能非常强大,其网络类库不仅使我们可以开发访问Internet应用层程序,还可以实现网络底层的通信。 本章要点 11.1 网络基础 11.2 InetAddress编程 11.3 URL编程 11.4 Socket编程 11.5 数据报通信 思考与练习11
2
11.1 网络基础 TCP/IP协议 网络通信协议是计算机间进行通信所要遵循的各种规则的集合。Internet的主要协议有:网络层的IP协议,传输层的TCP、UDP协议,应用层的FTP、HTTP、SMTP等协议。 其中,TCP/IP(传输控制协议/网间协议)是Internet的主要协议,定义了计算机和外设进行通信所使用的规则。TCP/IP网络参考模型包括四个层次:应用层、传输层、网络层、链路层。 连接到TCP/IP网络中的每台计算机(或其他设备)都有唯一的地址,这就是IP地址。IP地址实质上是一个32位的整数,通常以“%d.%d.%d.%d”的形式表示,其中每个d是一个8位整数。 在TCP/IP网络中,不同的机器之间进行通信时,数据的传输是由传输层控制的,这包括数据要发往的目标机器及应用程序、数据的质量控制等。 TCP/IP网络中最常用的传输协议-TCP(Transport Control Protocol)和UDP(User Datagram Protocol)就属于这一层。
3
11.1 网络基础 TCP/IP协议 传输层通常以TCP和UDP协议来控制端点到端点的通信。用于通信的端点是由Socket来定义的,而Socket是由IP地址和端口号组成的。 TCP是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
4
11.1 网络基础 通信端口 一台机器只通过一条链路连接到网络上,但一台机器中往往有很多应用程序需要进行网络通信,如何区分呢?这就要靠网络端口号(port)了。 端口号是一个标记机器的逻辑通信信道的正整数,端口号不是物理实体。IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的最后终结点,它是TCP和UDP的基础。 IP协议使用IP地址使数据投递到正确的计算机上,TCP和UDP协议使用端口号(port)将数据投递给正确的应用程序。 端口号是用一个16位的整数来表达的,其范围为0~65535,其中0~1023为系统所保留,专门给那些通用的服务(well-known services),常见的有:http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口为23等等。因此,当我们编写通信程序时,应选择一个大于1023的数作为端口号,以免发生冲突。
5
11.1 网络基础 URL URL是统一资源定位符(Uniform Resource Locator)的简称,它表示Internet上某一资源的地址。Internet上的资源包括HTML文件、图像文件、声音文件、动画文件以及其他任何内容(并不完全是文件,也可以是一个对数据库的查询等)。通过URL,就可以访问Internet。浏览器或其他程序通过解析给定的URL就可以在网络上查找相应的文件或其他资源。 一个URL包括两部分内容:协议名称和资源名称,中间用冒号隔开: 协议名://资源名 如: 协议名称指的就是获取资源时所使用的应用层协议,如http,ftp,file等;资源名称则是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。当然,并不是所有的URL都必须包含这些内容。 一个完整的URL如下: 协议 主机域名(IP地址)端口号 目录文件名 HTML参考点
6
11.1 网络基础 客户机/服务器模式 目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。
7
11.1 网络基础 Java网络编程 Java 通过前面介绍的流式输入/输出接口和增加在网络上建立输入/输出对象特性这两个方法支持TCP/IP。Java支持TCP和UDP协议族。TCP用于网络的可靠的流式输入/输出。UDP支持更简单的、快速的、点对点的数据报模式。 Java的网络编程分为三个层次: 1.最高一级的网络通信就是我们前面章节中讲的从网络上下载Applet。客户端浏览器通过HTML文件中的<applet>标记来识别Applet,并解析Applet的属性,通过网络获取Applet的字节码文件。 2.前面我们介绍了声音播放和图像显示,其中声音文件和图像文件的获取是次一级的通信。通过类URL的对象指明文件所在位置,并从网络上下载声音和图像文件。
8
11.1 网络基础 11.1.5 Java网络编程 3.最低一级的通信是利用java.net包中提供的类直接在程序中实现网络通信。
11.1 网络基础 Java网络编程 3.最低一级的通信是利用java.net包中提供的类直接在程序中实现网络通信。 针对网络通信的不同层次,Java提供的网络功能有四大类:InetAddress 、URLs、Sockets、Datagram。 (1)URLs:面向应用层。通过URL,Java程序可以直接送出或读入网络上的数据。 (2)InetAddress:面向的是IP层。用于标识网络上的硬件资源。 (3)Sockets和Datagram:面向的则是传输层。Sockets使用的是TCP协议,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道进行通信。Datagram则使用UDP协议,是另一种网络传输方式,它把数据的目的地记录在数据包中,然后直接放在网络上。
9
11.1 网络基础 11.1.5 Java网络编程 Java网络编程中主要使用的java.net包中的类有:
11.1 网络基础 Java网络编程 Java网络编程中主要使用的java.net包中的类有: 面向IP层的类:InetAddress 面向应用层的类:URL、URLConnection TCP协议相关类:Socket、ServerSocket UDP协议相关类:DatagramPacket、DatagramSocket、MulticastSocket 可能产生的异常: BindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownServiceException
10
11.2 InetAddress编程 无论你是在打电话、发送邮件或建立与Internet的连接,地址是基础。InetAddress 类用来封装IP地址和该地址的域名。 InetAddress类可以用于标识网络上的硬件资源,它提供了一系列方法以描述、获取及使用网络资源。每个InetAddress对象包含了IP地址、主机名等信息。 InetAddress类没有构造方法,因此不能用new来构造一个InetAddress实例。通常是用它提供的静态方法来获取: public static InetAddress getByName(String host) host可以是一个机器名,也可以是一个形如“%d.%d.%d.%d”的四个十进制数的IP地址或一个DSN域名。 public static InetAddress getLocalHost() public static InetAddress[] getAllByName(String host) 这三个方法通常会产生UnknownHostException异常,应在程序中捕获处理。 InetAddress 类也有一些非静态的方法,如本书表11-1所示。
11
11.3 URL编程 11.2.1 创建URL对象 URL类有以下几种方式创建URL对象:
1.URL(String, String, int, String): 构造一个URL类,第一个String类型的参数是协议的类型,可以是http,ftp,file等。第二个String类型参数是主机名,int类型参数是指定端口号,最后一个参数是给出文件名或路径名。 2.URL(String, String, String): 构造一个URL类,参数含义与上相同,使用缺省端口号。 3.URL(URL, String): 构造一个URL类,使用给出的URL和相对路径,String类型参数是相对路径。 4.URL(String): 使用URL字符串构造一个URL类。 当创建URL时发生错误,系统会产生异常MalformedURLException,这是非运行时异常,必须在程序中捕获处理。
12
11.3 URL编程 11.2.2 获取URL对象的属性 一个URL对象生成后,其属性是不能被改变的,但可以通过它给定的方法来获取这些属性:
public String getProtocol():获取该URL的协议名 public String getHost() :获取该URL的主机名 public String getPort() :获取该URL的端口号 public String getPath() :获取该URL的文件路径 public String getFile() :获取该URL的文件名 public String getRef() :获取该URL在文件中的相对位置 public String getQuery() :获取该URL的查询名 public String toExternalForm():获取代表URL的字符串
13
11.4 Socket编程 Socket(插座)通信属于网络底层通信。Socket最先应用于Unix操作系统,如果了解Unix系统的输入/输出(I/O)的话,就很容易掌握Socket,因为Socket数据传输其实就是一种特殊的I/O。 在传统的UNIX环境下可以操作TCP/IP协议的接口不止Socket一个,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。 在Java中可以将Socket类和ServerSocket类分别用于Client端和Server端,在任意两台机器间建立连接。
14
11.4 Socket编程 11.4.1 Socket与ServerSocket类
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。 尽管Socket编程是低层次网络编程但并不等于它功能不强大,恰恰相反,正因为层次低,Socket编程比基于URL的网络编程提供了更强大的功能和更灵活的控制,但是却要更复杂一些。 java在包java.net中提供了两个类:Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。这是两个封装得非常好的类,使用很方便。
15
11.4 Socket编程 Socket通信 Socket通常用来实现C/S结构。使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息,一个连接就建立起来了。Server端和Client端都可以通过Send,Write等方法与对方通信。 进行Socket通信,需要完成三个部分的工作: 1.建立服务器类 在服务器端,用Java中的服务器类-ServerSocket,使用端口号作为参数来创建服务器对象。 例如: ServerSocket server = new ServerSocket(2000) 这条语句创建了一个服务器对象,这个服务器使用2000号端口。当一个客户端程序建立一个Socket连接,所连接的端口号为2000时,服务器对象server便响应这个连接。
16
11.4 Socket编程 Socket通信 接下来用server.accept()方法创建一个Socket对象。服务器端便可以利用这个Socket对象与客户端进行通讯。 例如: Socket incoming = server.accept() 紧接着用下面语句得到输入流和输出流,并进行封装: BufferedReader in =new BufferedReader(new InputStreamReader(incoming.getInputStream())); PrintWriter out = new PrintWriter(incoming.getOutputStream(),true); 随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。
17
11.4 Socket编程 Socket通信 每一个Socket存在时,都将占用一定的资源,在Socket对象使用完毕时,要其关闭。关闭Socket可以调用Socket的Close()方法。在关闭Socket之前,应将与Socket相关的所有的输入/输出流全部关闭,以释放所有的资源。而且要注意关闭的顺序,与Socket相关的所有的输入/输出该首先关闭,然后再关闭Socket。 例如:in.close(); out.close(); socket.close();
18
11.4 Socket编程 11.4.2 Socket通信 2.建立客户端代码
相比服务器端,客户端要简单一些,客户端只需用服务器所在机器的IP以及服务器的端口作为参数创建一个Socket对象。得到这个对象后,就可以用前面介绍的方法实现数据的输入和输出。 例如: Socket socket = new Socket(" ",2000); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(),true); 以上的程序代码建立了一个Socket对象,这个对象连接到IP地址为 的主机上、端口为2000的服务器对象,并且建立了输入流和输出流,分别对应服务器的输出和客户端的写入。
19
11.4 Socket编程 11.4.2 Socket通信 3.建立用户界面 大家可以利用前面讲解的知识,根据自己的喜好建立自己的用户界面。
经过以上三个步骤,就可以建立一个比较简单的对话程序。但是,为了使这个程序更加完善,应将服务器端的程序变为多线程。这样可以使服务器为多个客户端服务。
20
11.5 数据报通信 数据报是一种无连接的通信方式,它的速度比较快,但是由于不建立连接,不能保证所有数据都能送到目的地,所以一般用于传送非关键性的数据。 发送和接收数据报需要使用Java类库中的DatagramPacket类和DatagramSocket类。 下面分别介绍: 1.DatagramPacket类 它是进行数据报通信的基本单位,它包含了需要传送的数据、数据报的长度、IP地址和端口等。 DatagramPacket类的构造方法有两种: (1)DatagramPacket(byte [], int):构造一个用于接收数据报的DatagramPacket类。 byte []类型的参数是接收数据报的缓冲,int类型的参数是接收的字节数。 (2)DatagramPacket(byte [], int, InetAddress, int):构造一个用于发送数据的DatagramPackte类。 byte []类型参数是发送数据的缓冲区,int类型参数是发送的字节数,InetAddress类型参数是接收机器的Internet地址,最后一个参数是接收的端口号。
21
11.5 数据报通信 2.DatagramSocket类 DatagramSocket类是用来发送数据报的Socket,它的构造方法有两种:
11.5 数据报通信 2.DatagramSocket类 DatagramSocket类是用来发送数据报的Socket,它的构造方法有两种: (1)DatagramSocket():构造一个用于发送的DatagramSocket类。 (2)DatagramSocket(int):构造一个用于接收的DatagramSocket类。 构造完DatagramSocket类后,就可以发送和接收数据报。 3.发送和接收过程 发送数据报,需要在接收端先建立一个接收的DatagramSocket。在指定端口上监听,构造一个DatagramPacket类指定接收的缓冲区(DatagramSocket的监听将阻塞线程)。 在发送端需要首先构造DatagramPacket类,指定要发送的数据、数据长度、接收主机地址及端口号,然后使用DatagramSocket类来发送数据报。接收端接收到后,将数据保存到缓冲区,发送方的主机地址和端口号一并保存。随后将接收到的数据报返回给发送方,并附上接收缓冲区地址、缓冲长度、发送方地址和端口号等信息,等待新的数据。
Similar presentations