当前课程知识点:JAVA程序设计进阶 >  第五章 网络编程(下) >  5.2 数据报通信 >  Video

返回《JAVA程序设计进阶》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《JAVA程序设计进阶》慕课在线视频列表

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方法

把这个信再发出去

又发还给我们的客户端

所以这个数据报包总结起来

就非常类似于

我们人类写平信的这个过程

在这一节当中

我们通过两个例子来介绍了

数据报通讯的原理和方式

JAVA程序设计进阶课程列表:

第一章 线程(上)

-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

第六章 Java虚拟机

-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

第七章 深入集合Collection

-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

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。