精品课件-JAVA语言程序设计教程(张席)-第11章
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
15
第11章 Java网络编程 数据报套接字收发的是数据报包裹(DatagramPacket),发送
包裹时,需要填写包裹的接收方地址,也即接收方的数据报套接 字。此时常用的数据报包裹构造函数是:
DatagramPacket(byte[ ] data, int length, InetAddressremoteAddr, intremotePort);
其中,remoteAddr和remotePort指明了接收方的地址。接收 包裹时,通常只关注包裹的内容,此时常用的构造函数则是: DatagramPacket(byte[ ] data, int length);
下面我们通过两个例子来说明UDP数据报的发送和接受。
16
第11章 Java网络编程 11.2.2 发送UDP数据报
17
第11章 Java网络编程
//需要发送的数据 String str = "send UDP"; //指定需要发送的数据内容,数据长度,目的 IP 和目的端口号 datagrampacket = new DatagramPacket(str.getBytes(),str.length(),
InetAddress.getByName("127.0.0.1"),8000); //发送数据 datagramsocket.send(datagrampacket); //关闭 datagramsocket.close(); } }
25
第11章 Java网络编程
try { //获取此服务器地址的精准时间而创建的套接字
Socket s=new Socket("",13); try{
InputStream is=s.getInputStream(); Scanner in=new Scanner(is); while (in.hasNextLine()) {
3
第11章 Java网络编程 2. 获取本机地址 在Java中,使用InetAddress类的静态方法getLocalHost()
来获取本机地址。若IP地址获取失败,则抛出 UnknowHostException异常。
4
第11章 Java网络编程 【例11-1】 用InetAddress类的静态方法getLocalHost()
13
第11章 Java网络编程 换句话说,上层应用程序通过UDP协议、IP地址和端口来与
网络中的其他上层应用程序通信。UDP协议、IP地址和端口则成 为上层应用程序间通信的窗口,这个窗口,我们称之为套接字 (Socket)。更具体的,对UDP协议来说,我们称这个套接字为数 据报套接字(DatagramSocket)。
String line=in.nextLine(); System.out.println(line); } }
26
第11章 Java网络编程
finally {
s.close(); } } catch (IOException e) { e.printStackTrace(); } } }
27
第11章 Java网络编程 程序运行结果如图11.4所示。
getByName(String host),其中host可以是型如 “”的主机名,也可以是具体的如 “210.39.3.164”的IP地址。
8
第11章 Java网络编程 【例11-2】 用InetAddress类的静态方法
getByName(String host)来获取主机IP地址。 import .*; public class RemoteAddressTest{ public static void main(String[] args){ try{ //获得互联网主机的 IP 地址 InetAddress remoteAddress = InetAddress.getByName("");
18
第11章 Java网络编程 11.2.3 接收UDP数据报
【例11-4】 UDP数据报接收实例。
import .*; public class ReceiveUDP {
public static void main(String args[]) throws Exception{ //声明 UDP 相关的变量 DatagramSocket datagramsocket = null; DatagramPacket datagrampacket = null; //定义接收空间大小 byte [] data = new byte[1024];
9
第11章 Java网络编程 System.out.println(remoteAddress); } catch(UnknownHostException e){ System.out.println(“获取不到主机地
址”); }
} } 程序运行结果如图11.2所示。
10
第11章 Java网络编程 图11.2 例11-2运行结果
第11章 Java网络编程 第 11.4
网络地址InetAddress UDP数据报 TCP连接 URL链接
1
第11章 Java网络编程 11.1 网络地址InetAddress
在计算机网络中,我们通过IP地址来标识、区分网络上每台 设备。在Java语言中,我们使用InetAddress来表示IP地址。 InetAddress及其他Java网络编程常见工具类位于包中, 在使用这些类之前,我们需要先导入这个包,具体方法如下:
19
第11章 Java网络编程
//实例化套接字,绑定 8000 端口 datagramsocket = new DatagramSocket(8000); //实例化套接字数据存放空间 datagrampacket = new DatagramPacket(data,data.length); System.out.println("正在等待客户端的数据…"); //将 UDP 收到的消息存放在 datagrampacket 当中 datagramsocket.receive(datagrampacket); //打印获取到的消息 System.out.println("收到客户端发来的:"+new String(data)); datagramsocket.close(); } }
11
第11章 Java网络编程 11.2 UDP数据报
有了IP地址之后,网络上两台主机就可以通过UDP数据报的 形式来进行通信。UDP数据报协议是一种面向无连接的、不可靠 的传输层协议。它不需要在通信双方间建立连接,而采用“尽最 大努力投递”的方式提供通信服务。由于其协议开销小,传输延 时短,对传输环境要求高,通常用于局域网内不需要高可靠性传 输的通信,例如局域网内的视频点播等应用。
图11.4 例11-5运行结果
28
第11章 Java网络编程 11.3.4 ServerSocket实现服务器
客户端使用Socket类来创建socket并连接到服务器端。 服务器端监听socket的类则是ServerSocket类。在C/S通信模 式中,服务器端需要创建监听特定端口的ServerSocket来负 责接收客户的连接请求。
2
第11章 Java网络编程 1. 网络地址的表示 IPv4(Internet Protocol Version 4)使用4个字节(32比特)
来表示一个IP地址。为了阅读方便,我们通常将每个字节表示成 一个十进制数,字节间用“.”隔开。例如IP地址:
11001101 10110001 00001011 11001011 我们通常表示为 205 . 177 . 11 . 203
14
第11章 Java网络编程 数据报套接字DatagramSocket有两个常用的构造函数,分别
是不带参数的DatagramSocket()和指定端口号的 DatagramSocket(int port)。由于UDP协议是面向无连接的,数 据报的接收方不关注数据报是由哪个端口发出的,因此无参数的 数据报套接字通常用于发送数据报,此时发送端口号由系统分配。 指定端口号的数据报套接字则常用于监听、接收数据报。
12
第11章 Java网络编程 11.2.1 端口与数据报套接字
UDP数据报协议提供16比特长的端口号(0~65 535)来区分收、 发数据报的上层应用程序。当我们发送UDP数据报时,除了指定 IP地址外,还需要指定数据报的发送端口(源端口)和接收端口 (目的端口)。数据报的接收方(上层应用程序)需要监听相应的目 的端口,当数据报送达时,上层应用程序即可收到具体的数据报 内容。
获取主机IP地址。
import .*; public class LocalAddressTest{
public static void main(String[] args){ try{ //获得本机的 IP 地址 InetAddress localAddress = InetAddress.getLocalHost(); System.out.println(localAddress);
20
第11章 Java网络编程 上述代码运行后,将监听本机的“UDP 8000”端口,在收到
发往该端口的数据报后,将数据报内容打印到控制台。 先运行接受数据报实例的代码并且不要关闭它,再运行发送
数据报的实例代码,则在接受数据报例子的控制台上,可以看到 接收到的消息内容,具体如图11.3所示。
21
第11章 Java网络编程 图11.3 例11-4运行结果
22
第11章 Java网络编程 11.3 TCP连接
11.3.1 连接 TCP是面向连接的,在通信双方进行数据交换之前,双方要
建立逻辑连接。连接建立之后,双方的通信就在该连接中进行。
23
第11章 Java网络编程 11.3.2 套接字Socket
与数据报套接字类似,TCP也存在套接字的概念,而且,由 于TCP比UDP更常见,通常说的套接字Socket是指TCP的套接字。
5
第11章 Java网络编程
} catch(UnknownHostException e){
System.out.println("获取不到本机地址"); } } }
程序运行结果如图 11.1 所示。
6
第11章 Java网络编程 图11.1 例11-1运行结果
7
第11章 Java网络编程 3. 获取互联网主机地址 获取互联网主机地址使用的是InetAddress类的静态方法
29
第11章 Java网络编程 【例11-6】 实现时间服务器的服务端和客户端,客户端连
接服务端时,显示时间。 服务端代码:
import .*; import java.io.*; public class DaytimeServer {
public static final int SERVICE_PORT = 13; public static void main(String args[]) {
【例11-3】 UDP数据报发送实例。
import .*; public class SendUDP{
public static void main(String args[]) throws Exception{ DatagramSocket datagramsocket = null; DatagramPacket datagrampacket = null; //实例化 UDP 的套接字,端口号为 2345 datagramsocket = new DatagramSocket(2345);
24
第11章 Java网络编程 11.3.3 Socket连接到服务器
【例11-5】 Socket连接到服务器的实例。
import java.io.*; import .*; import java.util.*; public class sttest {
public static void main(String[]args) {
第11章 Java网络编程 数据报套接字收发的是数据报包裹(DatagramPacket),发送
包裹时,需要填写包裹的接收方地址,也即接收方的数据报套接 字。此时常用的数据报包裹构造函数是:
DatagramPacket(byte[ ] data, int length, InetAddressremoteAddr, intremotePort);
其中,remoteAddr和remotePort指明了接收方的地址。接收 包裹时,通常只关注包裹的内容,此时常用的构造函数则是: DatagramPacket(byte[ ] data, int length);
下面我们通过两个例子来说明UDP数据报的发送和接受。
16
第11章 Java网络编程 11.2.2 发送UDP数据报
17
第11章 Java网络编程
//需要发送的数据 String str = "send UDP"; //指定需要发送的数据内容,数据长度,目的 IP 和目的端口号 datagrampacket = new DatagramPacket(str.getBytes(),str.length(),
InetAddress.getByName("127.0.0.1"),8000); //发送数据 datagramsocket.send(datagrampacket); //关闭 datagramsocket.close(); } }
25
第11章 Java网络编程
try { //获取此服务器地址的精准时间而创建的套接字
Socket s=new Socket("",13); try{
InputStream is=s.getInputStream(); Scanner in=new Scanner(is); while (in.hasNextLine()) {
3
第11章 Java网络编程 2. 获取本机地址 在Java中,使用InetAddress类的静态方法getLocalHost()
来获取本机地址。若IP地址获取失败,则抛出 UnknowHostException异常。
4
第11章 Java网络编程 【例11-1】 用InetAddress类的静态方法getLocalHost()
13
第11章 Java网络编程 换句话说,上层应用程序通过UDP协议、IP地址和端口来与
网络中的其他上层应用程序通信。UDP协议、IP地址和端口则成 为上层应用程序间通信的窗口,这个窗口,我们称之为套接字 (Socket)。更具体的,对UDP协议来说,我们称这个套接字为数 据报套接字(DatagramSocket)。
String line=in.nextLine(); System.out.println(line); } }
26
第11章 Java网络编程
finally {
s.close(); } } catch (IOException e) { e.printStackTrace(); } } }
27
第11章 Java网络编程 程序运行结果如图11.4所示。
getByName(String host),其中host可以是型如 “”的主机名,也可以是具体的如 “210.39.3.164”的IP地址。
8
第11章 Java网络编程 【例11-2】 用InetAddress类的静态方法
getByName(String host)来获取主机IP地址。 import .*; public class RemoteAddressTest{ public static void main(String[] args){ try{ //获得互联网主机的 IP 地址 InetAddress remoteAddress = InetAddress.getByName("");
18
第11章 Java网络编程 11.2.3 接收UDP数据报
【例11-4】 UDP数据报接收实例。
import .*; public class ReceiveUDP {
public static void main(String args[]) throws Exception{ //声明 UDP 相关的变量 DatagramSocket datagramsocket = null; DatagramPacket datagrampacket = null; //定义接收空间大小 byte [] data = new byte[1024];
9
第11章 Java网络编程 System.out.println(remoteAddress); } catch(UnknownHostException e){ System.out.println(“获取不到主机地
址”); }
} } 程序运行结果如图11.2所示。
10
第11章 Java网络编程 图11.2 例11-2运行结果
第11章 Java网络编程 第 11.4
网络地址InetAddress UDP数据报 TCP连接 URL链接
1
第11章 Java网络编程 11.1 网络地址InetAddress
在计算机网络中,我们通过IP地址来标识、区分网络上每台 设备。在Java语言中,我们使用InetAddress来表示IP地址。 InetAddress及其他Java网络编程常见工具类位于包中, 在使用这些类之前,我们需要先导入这个包,具体方法如下:
19
第11章 Java网络编程
//实例化套接字,绑定 8000 端口 datagramsocket = new DatagramSocket(8000); //实例化套接字数据存放空间 datagrampacket = new DatagramPacket(data,data.length); System.out.println("正在等待客户端的数据…"); //将 UDP 收到的消息存放在 datagrampacket 当中 datagramsocket.receive(datagrampacket); //打印获取到的消息 System.out.println("收到客户端发来的:"+new String(data)); datagramsocket.close(); } }
11
第11章 Java网络编程 11.2 UDP数据报
有了IP地址之后,网络上两台主机就可以通过UDP数据报的 形式来进行通信。UDP数据报协议是一种面向无连接的、不可靠 的传输层协议。它不需要在通信双方间建立连接,而采用“尽最 大努力投递”的方式提供通信服务。由于其协议开销小,传输延 时短,对传输环境要求高,通常用于局域网内不需要高可靠性传 输的通信,例如局域网内的视频点播等应用。
图11.4 例11-5运行结果
28
第11章 Java网络编程 11.3.4 ServerSocket实现服务器
客户端使用Socket类来创建socket并连接到服务器端。 服务器端监听socket的类则是ServerSocket类。在C/S通信模 式中,服务器端需要创建监听特定端口的ServerSocket来负 责接收客户的连接请求。
2
第11章 Java网络编程 1. 网络地址的表示 IPv4(Internet Protocol Version 4)使用4个字节(32比特)
来表示一个IP地址。为了阅读方便,我们通常将每个字节表示成 一个十进制数,字节间用“.”隔开。例如IP地址:
11001101 10110001 00001011 11001011 我们通常表示为 205 . 177 . 11 . 203
14
第11章 Java网络编程 数据报套接字DatagramSocket有两个常用的构造函数,分别
是不带参数的DatagramSocket()和指定端口号的 DatagramSocket(int port)。由于UDP协议是面向无连接的,数 据报的接收方不关注数据报是由哪个端口发出的,因此无参数的 数据报套接字通常用于发送数据报,此时发送端口号由系统分配。 指定端口号的数据报套接字则常用于监听、接收数据报。
12
第11章 Java网络编程 11.2.1 端口与数据报套接字
UDP数据报协议提供16比特长的端口号(0~65 535)来区分收、 发数据报的上层应用程序。当我们发送UDP数据报时,除了指定 IP地址外,还需要指定数据报的发送端口(源端口)和接收端口 (目的端口)。数据报的接收方(上层应用程序)需要监听相应的目 的端口,当数据报送达时,上层应用程序即可收到具体的数据报 内容。
获取主机IP地址。
import .*; public class LocalAddressTest{
public static void main(String[] args){ try{ //获得本机的 IP 地址 InetAddress localAddress = InetAddress.getLocalHost(); System.out.println(localAddress);
20
第11章 Java网络编程 上述代码运行后,将监听本机的“UDP 8000”端口,在收到
发往该端口的数据报后,将数据报内容打印到控制台。 先运行接受数据报实例的代码并且不要关闭它,再运行发送
数据报的实例代码,则在接受数据报例子的控制台上,可以看到 接收到的消息内容,具体如图11.3所示。
21
第11章 Java网络编程 图11.3 例11-4运行结果
22
第11章 Java网络编程 11.3 TCP连接
11.3.1 连接 TCP是面向连接的,在通信双方进行数据交换之前,双方要
建立逻辑连接。连接建立之后,双方的通信就在该连接中进行。
23
第11章 Java网络编程 11.3.2 套接字Socket
与数据报套接字类似,TCP也存在套接字的概念,而且,由 于TCP比UDP更常见,通常说的套接字Socket是指TCP的套接字。
5
第11章 Java网络编程
} catch(UnknownHostException e){
System.out.println("获取不到本机地址"); } } }
程序运行结果如图 11.1 所示。
6
第11章 Java网络编程 图11.1 例11-1运行结果
7
第11章 Java网络编程 3. 获取互联网主机地址 获取互联网主机地址使用的是InetAddress类的静态方法
29
第11章 Java网络编程 【例11-6】 实现时间服务器的服务端和客户端,客户端连
接服务端时,显示时间。 服务端代码:
import .*; import java.io.*; public class DaytimeServer {
public static final int SERVICE_PORT = 13; public static void main(String args[]) {
【例11-3】 UDP数据报发送实例。
import .*; public class SendUDP{
public static void main(String args[]) throws Exception{ DatagramSocket datagramsocket = null; DatagramPacket datagrampacket = null; //实例化 UDP 的套接字,端口号为 2345 datagramsocket = new DatagramSocket(2345);
24
第11章 Java网络编程 11.3.3 Socket连接到服务器
【例11-5】 Socket连接到服务器的实例。
import java.io.*; import .*; import java.util.*; public class sttest {
public static void main(String[]args) {