




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验七 UDP Socket一本实验目的及要求:1 掌握在TCP/IP体系结构中UDP协议概念和应用领域;学习UDP协议内容,了解单播、广播和组播的概念,掌握什么是D类IP地址及分类;2 掌握在JAVA程序设计中与UDP通信相关的类DatagramSocket和DatagramPacket;3 掌握在JAVA程序设计中利用UDP进行组播的类MulticastSocket。4 完成以下各内容程序,截存运行结果图,并提交实验报告。二基础知识1UDP概念UDP(User Datagram Protocol) 用户数据报协议 (RFC 768)是 OSI 参考模型中一种无连接的传输层协议,提供面向事务
2、的简单不可靠信息传送服务。 UDP 协议基本上是 IP 协议与上层协议的接口。 UDP 协议适用端口分别运行在同一台设备上的多个应用程序。在实际的Internet应用中,UDP占据了半壁江山。UDP常用应用和相关设置端口,如表4-1所示。表4-1 UDP常用应用和相关设置端口2UDP套接字类在JAVA语言中,一个UDP Socket用于处理数据包的发送或接收业务。每一个数据包独立的选择路由进行发送和接收。在两台计算机之间的多个数据包发送会选择不同的路径,并且到达顺序也不同于发送顺序。 在JAVA语言中,DatagramSocket类被用于发送和接收UDP数据包,定义如图4-2所示。 例如: D
3、atagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888); 该语句相当于: DatagramSocket s = new DatagramSocket(8888);这两种情况都在本地创建一个DatagramSocket接收UDP端口8888的数据。其构造方法:DatagramSocket() 在本地端口创建创建一个数据包套接字。 DatagramSocket(int port) 在本地指定端口创建创建一个数据包套接字。 DatagramSocket(int
4、;port, InetAddress laddr) 在本地指定的IP地址和端口创建创建一个数据包套接字。l DatagramPacket该类用于存储数据包,UDP数据包用于实现无连接的数据提交服务。每个信息利用自己包中的信息独立完成在计算机之间的传递。在2台计算机之间传递的多个数据包可能选择不同的路由,并且到达顺序不同于发送顺序。数据包的提交是不可靠的。DatagramPacket(byte buf, int length) 建立一个指定缓冲长度的数据包;DatagramPacket(byte buf, int length, InetAddr
5、ess address, int port) 在指定的IP地址和端口上,建立一个指定缓冲长度的数据包。3. 组播组播(Multicast)传输:在发送者和每一接收者之间实现点对多点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。IP多播通信必须依赖于IP多播地址,在IPv4中它是一个D类IP地址,范围从到55,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。l 局部链接多播地址范围在55,
6、这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;l 预留多播地址为55,可用于全球范围(如Internet)或网络协议;l 管理权限多播地址为55,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。 多播套接字类MulticastSocket这个类用于发送和接收IP多播数据包。该MulticastSocket是一个UDP DatagramSocket, 增加了在internet上加入其它多播主机“组”的功能。UDP广播发送建立在DatagramSocket
7、基础上。用于接收广播数据必须绑定在统配的地址上。一个多播组是建立在一个D类IP地址上和一个UDP端口上。D类IP地址的范围是-55, 注意地址 是保留地址不能使用。在某些实现中,广播数据包可以绑定在多个指定的地址上。一个终端需要加入一个组播组需要在指定的端口上建立一个MulticastSocket / 加入组播组,并在组内发送问候 . String msg = "Hello" InetAddress group = InetAddress.getByName(""); Mu
8、lticastSocket s = new MulticastSocket(8000); s.joinGroup(group); DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), group, 8000); s.send(hi); /获得反馈消息 byte buf = new byte1000; DatagramPacket recv = new DatagramPacket(buf, buf.length); s.receive(recv); . /离开多播组 s.leaveGroup(group);三类
9、及方法:1. DatagramSocket常用方法 InetAddressgetAddress() 获得发送或接收到数据包的IP bytegetData() 获得数据 intgetLength() 获得发送或接收的数据长度 intgetPort() 获得发送或接收的数据来对方的端口号 SocketAddressgetSocketAddress() 获得发送或接收数据的Socket地址 voidsetAddress(InetAddress iaddr) 设置发送数据的目的地址 voidsetData(byte
10、0;buf) 设置发送的数据 voidsetData(byte buf, int offset, int length) 设置发送的数据 voidsetLength(int length) 设置数据包长度 voidsetPort(int iport) 设置数据包的端口号 voidsetSocketAddress(SocketAddress address) 设置数据包的Socket2. DatagramPacket常用方法 voidbind(SocketAddress add
11、r)绑定数据包到指定的Socket voidclose() 关闭该UDP Socket voidconnect(InetAddress address, int port) 连接远端地址 voidconnect(SocketAddress addr) 连接远端地址 voiddisconnect() 断开连接 booleangetBroadcast() 测试能否广播 InetAddressgetInetAddress()获得已连接的IP地址 InetAddressgetLocalAddress()
12、 获得本地的IP地址 intgetLocalPort() 获得本地的端口号 SocketAddressgetLocalSocketAddress()获得本地的Socket地址. intgetPort()获得指定数据包的端口号 SocketAddressgetRemoteSocketAddress()获得远端的Socket地址. intgetSoTimeout() 获得数据包超时时间 booleanisBound() 获得绑定Socket的状态 booleanisClosed() 获得Socket是否关闭 boole
13、anisConnected() 获得Socket是否连接 voidreceive(DatagramPacket p) 接收数据包 voidsend(DatagramPacket p) 发送数据包 voidsetBroadcast(boolean on) 开启/关闭广播 voidsetReceiveBufferSize(int size) 设置接收缓存 voidsetSendBufferSize(int size)设置发送缓存 voidsetSoTimeout(int time
14、out) 设置超时时间,毫秒级3)MulticastPacket常用方法 booleangetLoopbackMode() 获得本地环回测试模式 intgetTimeToLive()获得数据包生命时间 voidjoinGroup(InetAddress mcastaddr) 加入组播组 voidleaveGroup(InetAddress mcastaddr) 离开组播组 voidsetLoopbackMode(boolean disable)设置本地环回测试 voidsetTimeToLive(int&
15、#160;ttl) 设置数据包生命时间4 知识填空1. 在应用层上HTTP协议使用传输层( )协议;应用层DNS协议使用传输层( )协议;应用层FTP协议使用传输层( )协议;应用层IGMP协议使用传输层( )。2. 信息传播的方式有( )、( )和( )。3. 在JAVA语言中,.net类库包中有关于UDP通信的类,包括( ),( )和( )。4. DatagramSocket类中的发送数据包的方法是( ),接收数据包的方法是( )。5. DatagramPacket类中从数据报中获得字节数据的方法是( ),设置数据报的方法是( )。6. IPv4地址,通常由2个部分组成,分别是:网络号 和
16、 主机号,广播地址是( )全为1,如果主机号全为0,则该IP地址表示( )。7. IP组播利用( )类IP地址,在Java语言中有( )类用于定义组播对象,加入组播组的方法是( ),离开组播组的方法是( )。5 程序填空1. 在本地建议一个UDP客户端import java.io.*;import /引用网络类库class exp_6_1a public static void main(String args) DatagramSocket ds = null; try ds = new (); /UDP客户端套接字构造方法 System.out.println(ds.getLocalAdd
17、ress(); System.out.println(ds.getLocalPort(); catch(Exception e) System.err.println(e.getMessage(); 2. 实现一个UDP客户端的数据接收和发送import java.io.*; /引入IO类库import .*; /引入网络类库class exp_6_2 implements Runnable DatagramSocket ds = null;/新建一个DatagramSocket实例 DatagramPacket p = null; InetAddress address = null; in
18、t port = 0; byte buf = byte256; /开辟接收数据缓冲区,256 B public exp_6_2 () try ds = new DatagramSocket(1080);/开启本地UDP 1080端口 System.out.println("本地开启UDP 1080端口"); catch(IOException e) System.err.println(e.toString(); public void run() try p = new DatagramPacket( , buf.length); ds.receive(p); Syste
19、m.out.println("接收的数据:" + new String(p. ); Thread.sleep(2000); address = p.getAddress(); port = p. ; System.out.println("请求端Socket" + address.toString() + ":" + port); buf = "从A端返回信息".getBytes(); p = new DatagramPacket(buf, buf.length, , port); ds. (p); ds.clos
20、e(); catch(Exception e) System.err.println(); public static void main(String args ) exp_6_2 dr = new exp_6_2 (); Thread tdr = new (dr); tdr.start(); 6 实验实例:1) 探测本地UDP端口占用情况import .*;class PortCount /共享资源,计数器count private int port;/共享资源 synchronized public int add() port = port + 1; return port; clas
21、s ScanThread implements Runnable private PortCount pc; private String name = null; public ScanThread(String name, PortCount pc) = name; this.pc = pc; public void run()/必需的重写 int i = 0; DatagramSocket ds = null; while(true) try i = pc.add(); if(i > 100)break; ds = new DatagramSocket(i);
22、System.err.println("本机端口:" + i + "空闲"); Thread.sleep(100); catch(Exception e) System.err.println(e.toString(); class ScanLocalUDPPort public static void main(String args) throws Exception PortCount pc = new PortCount();/代表共享资源的变量 ScanThread st1 = new ScanThread("线程1",pc
23、); /创建子线程 ScanThread st2 = new ScanThread("线程2",pc); ScanThread st3 = new ScanThread("线程3",pc); Thread tst1 = new Thread(st1); Thread tst2 = new Thread(st2); Thread tst3 = new Thread(st3); long begin = System.currentTimeMillis(); tst1.start();tst2.start();tst3.start(); tst1.join(
24、); tst2.join(); tst3.join(); long end = System.currentTimeMillis(); System.out.println("探测localhost的TCP端口,共耗时" + (end - begin)+"毫秒"); 报告内容:实验时分别测试开启1个线程、5个线程和10个线程,探测范围0-65535,查看耗时情况2) 基础的UDP通信/UDP A端import java.io.*; /引入IO类库import .*; /引入网络类库class exp_6_2 implements Runnable Dat
25、agramSocket ds = null;/新建一个DatagramSocket实例 DatagramPacket p = null; InetAddress address = null; int port = 0; byte buf = new byte256; /开辟接收数据缓冲区,256 B public exp_6_2 () try ds = new DatagramSocket(1080);/开启本地UDP 1080端口 System.out.println("本地开启UDP 1080端口"); catch(IOException e) System.err.
26、println(e.toString(); public void run() try p = new DatagramPacket(buf, buf.length); ds.receive(p); System.out.println("接收的数据:" + new String(p.getData(); Thread.sleep(2000); address = p.getAddress(); port = p.getPort(); System.out.println("请求端Socket" + address.toString() + "
27、:" + port); buf = "从A端返回信息".getBytes(); p = new DatagramPacket(buf, buf.length, address, port); ds.send(p); ds.close(); catch(Exception e) System.err.println(); public static void main(String args ) exp_6_2 dr = new exp_6_2 (); Thread tdr = new Thread(dr); tdr.start(); /UDP B端import j
28、ava.io.*; /引入IO类库import .*; /引入网络类库class DatagramSender implements Runnable DatagramSocket ds = null;/新建一个DatagramSocket实例 DatagramPacket p = null; InetAddress address = null; int port = 0; byte buf = new byte256; /开辟发送数据缓冲区,256 B public DatagramSender() try ds = new DatagramSocket(1065);/开启本地UDP 10
29、65端口 System.out.println("本地开启UDP 1065端口"); catch(IOException e) System.err.println(e.toString(); public void run() try address = InetAddress.getByName("localhost"); / 给出接收端地址 port = 1080; / 接收端口号 buf = "从B端发送单播信息".getBytes(); / 构造待发送的数据报 p = new DatagramPacket(buf, buf.
30、length, address, port); ds.send(p); Thread.sleep(2000); p = new DatagramPacket(buf, buf.length); / 接收数据报 ds.receive(p); / 接收数据 System.out.println("接收的数据:" + new String(p.getData(); address = p.getAddress(); port = p.getPort(); System.out.println("请求端Socket" + address.toString() +
31、 ":" + port); ds.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(); /注意接收和发送时缓存buf 中的内容/修改为可循环发送消息的形式3) UDP文件传输import java.io.IOExc
32、eption;import .DatagramPacket;import .DatagramSocket;import .SocketException;public class CudpSocket DatagramPacket dp = null; DatagramSocket dgsocket=null; public CudpSocket() try byte buf = new byte1000; dgsocket = new DatagramSocket(12345); dp = new DatagramPacket(buf,buf.length); catch (SocketEx
33、ception e) System.err.println(e.getMessage(); public static void main(String args) System.out.println("enter the server"); CudpSocket css = new CudpSocket(); try css.dgsocket.receive(css.dp); byte data = css.dp.getData(); System.out.println("datac.length : "+data.length); for(int
34、 i=0;i<data.length;i+) System.out.println(datai); NetFileW nfw = new NetFileW("C:/test/b.txt"); nfw.write(css.dp.getData(); / System.out.println(new String(css.dp.getData(); catch (IOException e) System.err.println(e.getMessage(); /import java.io.DataInputStream;import java.io.File;impo
35、rt java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;public class NetFileR private String filePath; public NetFileR(String filePath) this.filePath = filePath; public byte getData() throws IOException File file = new File(filePath); FileInputStream filein = new F
36、ileInputStream(file); DataInputStream in = new DataInputStream(filein); byte data = new byte8; in.read(data); return data; public String getFilePath() return filePath; public void setFilePath(String filePath) this.filePath = filePath; /import java.io.File;import java.io.FileNotFoundException;import
37、java.io.FileOutputStream;import java.io.IOException;public class NetFileW public NetFileW(String filePath) this.filePath = filePath; private String filePath; public void write(byte data) throws IOException File file = new File(filePath); FileOutputStream out = new FileOutputStream(file); out.write(d
38、ata); public String getFilePath() return filePath; public void setFilePath(String filePath) this.filePath = filePath; /import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .Inet4Address;import .SocketException;import .UnknownHostException;public class SudpSocket private Da
39、tagramSocket dgs = null; private DatagramPacket dgp = null; public SudpSocket(String host,int prot,byte data) try dgs = new DatagramSocket(9999); Inet4Address target=null; try target = (Inet4Address) Inet4Address.getByName(host); catch (UnknownHostException e) System.err.println(e.getMessage(); dgp
40、= new DatagramPacket(data,data.length,target,prot); catch (SocketException e) System.err.println(e.getMessage(); public static void main(String args) NetFileR nf = new NetFileR("C:/test/a.txt"); SudpSocket sps; try byte data = nf.getData(); System.out.println("data.length : "+dat
41、a.length); for(int i=0;i<data.length;i+) System.out.println(datai); sps = new SudpSocket("70",12345,data); catch (IOException e1) System.err.println(e1.getMessage(); sps=null; try sps.dgs.send(sps.dgp); catch (IOException e) System.err.println(e.getMessage(); sps=null; Syst
42、em.out.println("over the sending"); /将该程序简化4)UDP组播/组播接收端import java.io.*; /引入IO类库import .*; /引入网络类库public class DatagramReceiver implements Runnable String GROUP_IP = "" int port = 1080; MulticastSocket multicastSocket = null; DatagramPacket p = null; byte buf = new byte256; /开辟数据缓冲区,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.printl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025办公室租赁合同范本参考
- 2025二手车买卖合同全国正式版
- 2025石油化工管道工程监理安全环保合同
- 2025室内涂料分包合同样本
- 《绿色生活由我启动》课件
- 2025医疗器械采购销售合同模板
- 电子银行承兑合同协议
- 电脑服务外包合同协议
- 电影股权转让合同协议
- 玉林农村建房合同协议
- DB33-1036-2021《公共建筑节能设计标准》
- 岩芯鉴定手册
- 快速排序算法高校试讲PPT
- 甘肃历史与甘肃文化
- 工程勘察设计收费标准
- 高边坡施工危险源辨识及分析
- SAP航空行业数字化转型解决方案(优秀方案集)
- 江苏工业企业较大以上风险目录
- 《村卫生室管理办法(试行)》课件(PPT 49页)
- 监理质量评估报告(主体分部)
- 锅炉爆炸事故演练方案(模板)
评论
0/150
提交评论