当前课程知识点:JAVA程序设计进阶 > 第五章 网络编程(下) > 5.2 数据报通信 > Video
这一节我们将介绍
数据报通信的原理
也就是不需要
面向连线的通信方式
数据报通信方式
采用的是UDP协议
也就是User Datagram Protocol
那这种通信协议
它是非面向连接的
提供不可靠的数据包式的
数据传输协议
那这种传输过程的话
就类似我们平常从邮局里
发送信件的过程
因为我们发送信件的话
是通过邮局的系统
一站一站的进行传递
中间也有可能有所丢失
那在java当中有这么几个类
是基于UDP协议
来进行网络通讯的
分别是DatagramPacket
DatagramSocket
和MulticastSocket
那和UDP这个协议对比的
就是我们刚才
前面刚刚介绍过的TCP协议
那TCP协议
它是面向连接的这种传输方式
那相对应的类包括URL
URLConnection Socket
和ServerSocket等等
那这两种通讯方式
有什么最基本的区别
首先TCP的话
它是有建立时间的
而UDP的话并没有建立时间
但是UDP的话
它的传输有一些
基本的大小的限制
也就是说你每一个这个数据包
它在64k以内
那TCP的话我们常见的一些
记忆连接的应用
就比如说Telnet
就是远程登录
或者ftp 就是文件的传输
那UDP的一个
非常典型的应用
就是ping指令
那ping指令就是我们用来去检测
网络上的某台服务器
是否还在提供服务
那通过ping指令
相当于就给这个服务器
发送了一封邮件
说你那边还能够正常工作吗
如果我们这台服务器
能正常工作
它就会给这个我们的客户端
写一个回信
说我这还能够正常的工作
那怎么在java当中
构造这个数据报的通信呢
我们可以用到这么几个类
第一个叫DatagramSocket
那实际上它也是一种Socket
只不过是数据报通信的
一种Socket
那在构造它的时候
可以指定这个端口号
那我们在通信过程中
要发送的数据存在哪呢
保存在DatagramPacket
这个对象当中
那构造它的时候
可以有两个参数
第一个是这个一个字节数组
那字节数组是用来这个
接收我们能够
接收到的数据报
那另外一个参数是长度
就是int ilength
那这里面就是标识了
我们所要接收到的数据报
它的长度是多少
那最下面一行
这个DatagramPacket
构造方法的话它是有四个参数
那前两个参数
分别是我们这个字节数组
以及字节的这个长度
那后两个参数
是我们想把这个数据报
发送到的目标地址
以及相对应的端口
那我们怎么去进行
数据报的发送和接收呢
首先看一下接收
我们构造的一个
DatagramPacket
然后用它的构造方法
new DatagramPacket
然后里面的两个参数
一个是buf 一个是256
buf的话就是
我们的一个字节数组
那256就指明说
我们要接收到的数据报
那个长度是这么长
那怎么收这个数据报呢
Socket.receive packet
当然必须指明这个Socket对象
是一个DatagramSocket
这个类的对象
然后调动它的receive方法
然后它要接收到了数据报
就放在我们Packet这个对象当中
这是接收
那如果是发送数据报呢
那我们构造一个
DatagramPacket
这个类的一个对象
名字叫Packet
然后调用构造方法的时候
我们有四个参数
分别是我们要发送的数据的
这个字节数字buf
然后这个它的要发送的
这个数组的这个长度
buf.length
然后address和port
就是我们要发送的
目标的这个地址和端口号
那最后怎么发送呢
那就通过Packet.send方法
然后把这个Packet给发送出去
那必须指出来Socket这个对象
它就是DatagramSocket
它这个类的对象
那我们打一个比方
利用数据报来进行通讯的话
实际上你就像在写一封
我们真正的平信一样
比如说我们要发送的时候
我们那个要构造一个
DatagramPacket这个类的对象
那这里面的话
它有构造方法四个参数
前两个参数相当于
是你写信的信的内容
后两个参数address和port
就是我们要寄信的目标的地址
只不过这个地址
它还有端口号来描述
那最后通过Socket对象
send一下 发送一下
就把它寄出去了
下面我们看一个例子吧
现在我们有一个程序
叫QuoteClient
这个程序主要目的
就是想向我们的一个服务器
询问一下某些股票的信息
到底有哪些股票信息呢
我们服务器端会保留 会模拟
那我们看一下我们这个例子
public class QuoteClient
然后主方法
主方法里面第一行
if args.length等于1
也就是说我们的这个
要求我们在执行的时候
必须跟一个参数
如果你没跟一个参数的话
命令行跟一个参数
它就会打印出来
Usage java QuoteClient
hostname
那实际上是希望说你执行的时候
跟一个这个目标服务器的主机名
那如果带着这个主机名
我们接着往下
它就会构造一个
DatagramSocket Socket
等于new DatagramSocket
构造了一个数据报的Socket对象
这个对象名字就叫Socket
那下面的话我们要开始
去构造一个数据报了
我们看一下这个字节数组
byte buf等于new byte256
那我们要构造数据报
我想知道一下这个目标地址
目标地址怎么得到呢
我们这是InetAddress address
然后等于InetAddress
getByName args0
args0就是我们刚才
在命令行中敲入的
这个目标服务器的这个地址
那这个目标服务器
它是一个字符串
那我们现在通过把这个字符串
转换成为InetAddres
这个类的对象
然后我们要构造一个数据报包
DatagramPacket
那在调用它的构造方法里面
我们把要发送的内容buf
以及它的长度buf.length
以及它的目标地址address
目标端口号4445
都写在里面了
那构造完了以后
我们就给它发送了
怎么发送呢
Socket.send packet
就把它发送出去
然后发送完了
相当于寄信寄出去了
肯定我们想希望收到回信对不对
这个回信实际上从服务端
给我们发回的回信
而且这个回信里面
包含了我们所想要的股票信息
那这个时候怎么接收回信
我们又构造了一个Packet对象
Packet等于new DatagramPacket
然后调用构造方法
然后buf buf.lenght
然后怎么接收呢
Socket.receive packet
通过Packet receive方法
我们收到这个Packet对象了
那Packet对象
实际上从服务端
给我们发回来的
是服务端给我们写的回信
那里面包含了我们想要的信息
那我怎么把这个信息给显示出来
我们看一下下面的代码
Srting received
等于new String
Packet.getData
通过Packet对象
它的getData方法
我们会得到一个这个数组
而通过这个数组
又把它转换成一个字符串
得到这个字符串了以后
我们就把它打印出来
System.out.println
Quote of the Moment
加上received
那客户端收到信了以后
那个显示出来
就把Socket关闭
所以我们看这个客户端的程序
其实道理也很简单
也就是说它首先构造了一个
DatagramSocket
这么一个Socket对象
用它来发信和收信
那你要发的信的内容
你就要构造一个
DatagramPacket对象
把你要写的信的内容
以及目标地址
都放在它的构造方法上
然后最后通过我们的Socket对象
它的send方法
就把它发出去了
发出去实际上
就相当于发给服务端
那发给服务端了以后
这个时候就是
它会服务端给你写回信
写回信的话
我们通过Socket received方法
就能够收到这个回信
然后把它内容提取出来
并显示出来
那下面我们看一下
这个服务器端的这个程序
publlc class QuoteServer
那主方法里面就是
new QuoteServerThread.start
构造了一个QuoteServr线程启动
那我们看一下Quote Thread
到底都有哪些内容
我们看看publlc class
QuoteServer Thread
extends Thread
那它在里面构造了一个
DatagramSocket
也就构造了一个
Bufferedreader
又构造了一个boolean变量
moreQuotes
然后最初置的值是true
然后它的构造方法
第一个构造方法是没有参数的
因为它调用的是public QuoteServerThread
那我们看一下第二个构造方法
publicQuoteServerThread
String name throws
IOException
然后它首先调用的
傅里叶的构造方法
super name
Socket等于
new DatagramSocket
三个4一个5
然后try in等于new
BufferedReader
new FileReader
one.liners txt
这个是构造了一个文件输入流
因为我们做了一个
非常简单的模拟
也就是说把一些股票信息
就写到这个文件里面了
写到这个文件里面了以后
就是每次有客户端发过来请求
说咨询一下股票的价格的时候
我们就从这个文件里
读出某一股票的价格
在返还给我们的客户端
然后我们看一下这个run方法
run方法里面
是whhile moreQuotes
也就是说我们这个
服务端的文件中
还有好些股票信息
没有读完的话
那我们是要读出来了
那怎么读呢
try 然后byte buf
等于new byte256
然后DatagramPacket packet
等于new DatagramPacket
buf buf.length
我们构造一个数据报包对象
紧接着Socket.receive Packet
这时候Socket
接收这个数据报包
那它接收的数据报包
是从客户端发过来的
收到这个数据报包了以后
它马上要想办法构造
这个返回的数据报包了
也就是要写回信了
那怎么写呢 我们看一下
String dString等于空
然后if in等于等于空
in就是我们那个文件输入流
就是说我们要从那个里面
保存了一些
要输入的一些股票信息
我们如果这个文件输入流是空的话
那我们就dStrting
等于new Date.toString
构造一个这个日期
如果它这个不空的话
我们就读这个股票信息呗
那就dStrting
等于getNextQuote
这个获得下一个
这个一条股票信息
然后buf等于dStrting.getBytes
那我们把我们读到的信息
把它转化成字节数组
注意 因为你读到的信息
是个字符串
但这个字符串它可以调用
它的getBytes方法
把它转换成一个字节数组
好了 读到这些信息了以后
我们下一步的话就要想
把这些信息要返回给我们客户端
那怎么返回呢
返回的前提说是
你要构造一个数据报包
但是你要构造一个数据报包的时候
你必须知道客户端的地址
和端口号
那我们怎么得到
客户端的地址和端口号呢
那就是InetAddress address
等于packet.getAddress
通过发过来的
客户端发过来的这个
DatagramPacket对象
我调用它的getAddress方法
我就得到它这个客户端的地址了
那我调用它的getPort方法
我就得到它的端口地址了
然后紧接着我就要构造
我的这个服务端的回信了
那我实际上Packet
等于new DatagramPacket
buf buf.length
这些是刚才
我们从那个股票文件里面
读出来的股票信息
然后再加上address和port
address和port
是我们客户端的这地址和端口号
所以我们就构造完
这么一个一封回信了
那怎么把这封回信给寄回去呢
那就Socket.send packet
通过我们DatagramSocket对象
它的send方法
把我们的Packet发送回去了
那这个在我们服务端的话
最后还要把这个Socket对象给关闭
那接下来这个方法
就是如何从我们的这个文件中
去读取出每行这个股票信息的
这个代码
那刚才这个程序当中
我们可以看到
就是客户端 服务端各一个程序
那客户端和服务端之间的通讯
是通过数据报这个Socket
来进行通讯的
然后整个过程就非常类似于
我们这个人类进行平信
这个通讯的方式
也就是说我客户端
通过构造一个
DatagramPacket这个对象
向它写一封信
然后通过DatagramSocket
它的send方法把它发出去了
那这时候我们的服务端
收到了这封来信以后
通过这个来信知道了
我们客户端的地址和端口号
然后服务端它自己也写一封信
说白了写信就是构造一个
DatagramPacket对象
写好了以后它又把它
通过它的DatagramSocket
它的这个对象
在它的send方法
把这个信再发出去
又发还给我们的客户端
所以这个数据报包总结起来
就非常类似于
我们人类写平信的这个过程
在这一节当中
我们通过两个例子来介绍了
数据报通讯的原理和方式
-1.0 导学
--Video
-1.1 线程的基本概念
--Video
-1.1 线程的基本概念--作业
-1.2 通过Thread类创建线程
--Video
-1.2 通过Thread类创建线程--作业
-1.3 线程的休眠
--Video
-1.3 线程的休眠--作业
-1.4 Thread类详解
--Video
-1.5 通过Runnable接口创建线程
--Video
-1.5 通过Runnable接口创建线程--作业
-1.6 线程内部的数据共享
--Video
-2.0 导学
--Video
-2.1 线程同步的思路
--Video
-2.2 线程同步的实现方式—Synchronization
--Video
-2.3 线程的等待与唤醒
--Video
-2.4 后台进程
--Video
-2.5 线程的生命周期与死锁
--Video
-2.6 线程的调度
--Video
-3.0 导学
--Video
-3.1 线程安全与线程兼容与对立
--Video
-3.2 线程的安全实现-互斥同步
--Video
-3.3 线程的安全实现-非阻塞同步
--Video
-3.4 线程的安全实现-无同步方案
--Video
-3.5 锁优化
--Video
-4.0 导学
--Video
-4.1 URL对象
--Video
-4.2 URLConnection对象
--Video
-4.3 Get请求与Post请求
--Video
-4.4 Socket通信原理
--Video
-4.5 Socket通信实现
--Video
-5.0 导学
--Video
-5.1 Socket 多客户端通信实现
--Video
-5.2 数据报通信
--Video
-5.3 使用数据报进行广播通信
--Video
-5.4 网络聊天程序
--Video
-6.0 导学
--Video
-6.1 Java虚拟机概念
--Video
-6.2 Java虚拟机内存划分
--Video
-6.3 Java虚拟机类加载机制
--Video
-6.4 判断对象是否存活算法及对象引用
--Video
-6.5 分代垃圾回收
--Video
-6.6 典型的垃圾收集算法
--Video
-6.7典型的垃圾收集器
--Video
-7.0 导学
--Video
-7.1 集合框架与ArrayList
--Video
-7.2 LinkedList
--Video
-7.3 HashMap与HashTable
--Video
-7.4 TreeMap与LinkedHashMap
--Video
-7.5 HashSet
--Video
-8.0 导学
--Video
-8.1 Java反射机制
--Video
-8.2 Java静态代理
--Video
-8.3 Java动态代理
--Video
-8.4 Java 反射扩展-jvm加载类原理
--Video
-8.5 Java进阶课程总结
--Video