实验07UDPSocket课件资料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验七UDP Socket
一.本实验目的及要求:
1.掌握在TCP/IP体系结构中UDP协议概念和应用领域;学习UDP协议内容,了解单播、广播和组播的概念,掌握什么是D类IP地址及分类;
2.掌握在JA V A程序设计中与UDP通信相关的类DatagramSocket和DatagramPacket;3.掌握在JA V A程序设计中利用UDP进行组播的类MulticastSocket。

4.完成以下各内容程序,截存运行结果图,并提交实验报告。

二.基础知识
1.UDP概念
UDP(User Datagram Protocol)用户数据报协议(RFC 768)是OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

UDP 协议基本上是IP 协议与上层协议的接口。

UDP 协议适用端口分别运行在同一台设备上的多个应用程序。

在实际的Internet应用中,UDP占据了半壁江山。

UDP常用应用和相关设置端口,如表4-1所示。

表4-1 UDP常用应用和相关设置端口
2.UDP套接字类
在JAVA语言中,一个UDP Socket用于处理数据包的发送或接收业务。

每一个数据包独立的选择路由进行发送和接收。

在两台计算机之间的多个数据包发送会选择不同的路径,并且到达顺序也不同于发送顺序。

在JAVA语言中,DatagramSocket类被用于发送和接收UDP数据包,定义如图4-2所示。

例如:
DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress(8888));
该语句相当于:
DatagramSocket s = new DatagramSocket(8888);
这两种情况都在本地创建一个DatagramSocket接收UDP端口8888的数据。

其构造方法:
DatagramPacket
该类用于存储数据包,UDP数据包用于实现无连接的数据提交服务。

每个信息利用自己包中的信息独立完成在计算机之间的传递。

在2台计算机之间传递的多个数据包可能选择不同的路由,并且到达顺序不同于发送顺序。

数据包的提交是不可靠的。

3. 组播
发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。

它提高了数据传送效率。

减少了骨干网络出现拥塞的可能性。

IP多播通信必须依赖于IP多播地址,在IPv4中它是一个D类IP地址,范围从224.0.0.0到239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。

●局部链接多播地址范围在224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留
的地址,路由器并不转发属于此范围的IP包;
●预留多播地址为224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络
协议;
●管理权限多播地址为239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有
IP地址,不能用于Internet,可限制多播范围。

多播套接字类MulticastSocket
这个类用于发送和接收IP多播数据包。

该MulticastSocket是一个UDP DatagramSocket, 增加了在internet上加入其它多播主机“组”的功能。

UDP广播发送建立在DatagramSocket基础上。

用于接收广播数据必须绑定在统配的地
址上。

一个多播组是建立在一个D类IP地址上和一个UDP端口上。

D类IP地址的范围是224.0.0.0----239.255.255.255, 注意地址 224.0.0.0 是保留地址不能使用。

在某些实现中,广播数据包可以绑定在多个指定的地址上。

一个终端需要加入一个组播组需要在指定的端口上建立一个MulticastSocket
// 加入组播组,并在组内发送问候
...
String msg = "Hello";
InetAddress group = InetAddress.getByName("228.5.6.7");
MulticastSocket s = new MulticastSocket(8000);
s.joinGroup(group);
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),
group, 8000);
s.send(hi);
//获得反馈消息
byte[] buf = new byte[1000];
DatagramPacket recv = new DatagramPacket(buf, buf.length);
s.receive(recv);
...
//离开多播组
s.leaveGroup(group);
三.类及方法:
1. DatagramSocket常用方法
2. DatagramPacket常用方法
3)MulticastPacket常用方法
四.知识填空
1.在应用层上HTTP协议使用传输层()协议;应用层DNS协议使用传输层()协议;应用层FTP协议使用传输层()协议;应用层IGMP 协议使用传输层()。

2.信息传播的方式有()、()和()。

3.在JA VA语言中,.net类库包中有关于UDP通信的类,包括(),()和()。

4.DatagramSocket类中的发送数据包的方法是(),接收数据包的方法是()。

5.DatagramPacket类中从数据报中获得字节数据的方法是(),设置数据报的方法是()。

6.IPv4地址,通常由2个部分组成,分别是:网络号和主机号,广播地址是()全为1,如果主机号全为0,则该IP地址表示()。

7.IP组播利用()类IP地址,在Java语言中有( )类用于定义组播对象,加入组播组的方法是(),离开组播组的方法是()。

五.程序填空
1. 在本地建议一个UDP客户端
2. 实现一个UDP客户端的数据接收和发送
六.实验实例:
1)探测本地UDP端口占用情况
2)基础的UDP通信
3)UDP文件传输
4)UDP组播
//组播接收端
import java.io.*; //引入IO类库
import .*; //引入网络类库
public class DatagramReceiver implements Runnable{
String GROUP_IP = "224.0.0.1";
int port = 1080;
MulticastSocket multicastSocket = null;
DatagramPacket p = null;
byte [] buf = new byte[256]; //开辟数据缓冲区,256 B用于接收和发送数据public DatagramReceiver (){
try{
multicastSocket = new MulticastSocket(port);
InetAddress group = InetAddress.getByName(GROUP_IP);
multicastSocket.joinGroup(group); //加入组播组
}catch(Exception e){
System.err.println(e.toString());
}
}
public void run(){
try{
System.out.println("Receieve start.......");
p = new DatagramPacket(buf, buf.length);
while (true) {
multicastSocket.receive(p);
System.out.println(new String(buf) + p.getAddress());
}
}catch(Exception e){
System.err.println(e.toString());
}
}
public static void main(String args[ ]) throws IOException{
DatagramReceiver ds = new DatagramReceiver ();
Thread tds = new Thread(ds);
tds.start();
}
}
//组播发送端
import java.io.*; //引入IO类库
import .*; //引入网络类库
class DatagramSender implements Runnable{
String GROUP_IP = "224.0.0.1";
int port = 1080;
MulticastSocket ms = null;
DatagramPacket p = null;
InetAddress address = null;
byte [] buf = new byte[256]; //开辟数据缓冲区,256 B用于接收和发送数据public DatagramSender(){
try{
ms = new MulticastSocket(port); //开启本地的UDP端口
InetAddress group = InetAddress.getByName(GROUP_IP);
ms.joinGroup(group); //加入组播组
}catch(IOException e){
System.err.println(e.toString());
}
}
public void run(){
try{
int i=1;
address = InetAddress.getByName(GROUP_IP); //给出接收方地址
while(true){
//组播发送端,可以不加入组播组,也可以向组播组发送数据
buf = ("第"+i+"次从发送端送出到组播组的信息").getBytes();
p = new DatagramPacket(buf, buf.length, address, port);
ms.send(p);
Thread.sleep(2000);
i++;
}
ms.close(); // 关闭连接
}catch(Exception e){
System.err.println(e.toString());
}
}
public static void main(String args[ ]) throws IOException{
DatagramSender ds = new DatagramSender ();
Thread tds = new Thread(ds);
tds.start();
}
}
报告内容:设计一个UDP接收程序,该程序可以同时从3个地址(分别是:主机地址、广播地址、组播地址)接收数据。

5)练习并分析电子白板,理解解析客户端之间传递消息的格式“主体:动作:客体:内容”。

相关文档
最新文档