已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验七 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 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 UDP 协议基本上是 IP 协议与上层协议的接口。 UDP 协议适用端口分别运行在同一台设备上的多个应用程序。在实际的Internet应用中,UDP占据了半壁江山。UDP常用应用和相关设置端口,如表4-1所示。表4-1 UDP常用应用和相关设置端口2UDP套接字类在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的数据。其构造方法:DatagramSocket() 在本地端口创建创建一个数据包套接字。DatagramSocket(intport) 在本地指定端口创建创建一个数据包套接字。DatagramSocket(intport, InetAddressladdr) 在本地指定的IP地址和端口创建创建一个数据包套接字。l DatagramPacket该类用于存储数据包,UDP数据包用于实现无连接的数据提交服务。每个信息利用自己包中的信息独立完成在计算机之间的传递。在2台计算机之间传递的多个数据包可能选择不同的路由,并且到达顺序不同于发送顺序。数据包的提交是不可靠的。DatagramPacket(bytebuf, intlength) 建立一个指定缓冲长度的数据包;DatagramPacket(bytebuf, intlength, InetAddressaddress, intport) 在指定的IP地址和端口上,建立一个指定缓冲长度的数据包。3. 组播组播(Multicast)传输:在发送者和每一接收者之间实现点对多点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。IP多播通信必须依赖于IP多播地址,在IPv4中它是一个D类IP地址,范围从到55,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。l 局部链接多播地址范围在55,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;l 预留多播地址为55,可用于全球范围(如Internet)或网络协议;l 管理权限多播地址为55,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。 多播套接字类MulticastSocket这个类用于发送和接收IP多播数据包。该MulticastSocket是一个UDP DatagramSocket, 增加了在internet上加入其它多播主机“组”的功能。UDP广播发送建立在DatagramSocket基础上。用于接收广播数据必须绑定在统配的地址上。一个多播组是建立在一个D类IP地址上和一个UDP端口上。D类IP地址的范围是-55, 注意地址 是保留地址不能使用。在某些实现中,广播数据包可以绑定在多个指定的地址上。一个终端需要加入一个组播组需要在指定的端口上建立一个MulticastSocket / 加入组播组,并在组内发送问候 . String msg = Hello; InetAddress group = InetAddress.getByName(); MulticastSocket 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);三类及方法:1. DatagramSocket常用方法InetAddressgetAddress() 获得发送或接收到数据包的IPbytegetData() 获得数据intgetLength() 获得发送或接收的数据长度intgetPort() 获得发送或接收的数据来对方的端口号SocketAddressgetSocketAddress() 获得发送或接收数据的Socket地址voidsetAddress(InetAddressiaddr) 设置发送数据的目的地址voidsetData(bytebuf) 设置发送的数据voidsetData(bytebuf, intoffset, intlength) 设置发送的数据voidsetLength(intlength) 设置数据包长度voidsetPort(intiport) 设置数据包的端口号voidsetSocketAddress(SocketAddressaddress) 设置数据包的Socket2. DatagramPacket常用方法voidbind(SocketAddressaddr)绑定数据包到指定的Socketvoidclose() 关闭该UDP Socketvoidconnect(InetAddressaddress, intport) 连接远端地址voidconnect(SocketAddressaddr) 连接远端地址voiddisconnect() 断开连接booleangetBroadcast() 测试能否广播InetAddressgetInetAddress()获得已连接的IP地址InetAddressgetLocalAddress() 获得本地的IP地址intgetLocalPort() 获得本地的端口号SocketAddressgetLocalSocketAddress()获得本地的Socket地址.intgetPort()获得指定数据包的端口号SocketAddressgetRemoteSocketAddress()获得远端的Socket地址.intgetSoTimeout() 获得数据包超时时间booleanisBound() 获得绑定Socket的状态booleanisClosed() 获得Socket是否关闭booleanisConnected() 获得Socket是否连接voidreceive(DatagramPacketp) 接收数据包voidsend(DatagramPacketp) 发送数据包voidsetBroadcast(booleanon) 开启/关闭广播voidsetReceiveBufferSize(intsize) 设置接收缓存voidsetSendBufferSize(intsize)设置发送缓存voidsetSoTimeout(inttimeout) 设置超时时间,毫秒级3)MulticastPacket常用方法booleangetLoopbackMode() 获得本地环回测试模式intgetTimeToLive()获得数据包生命时间voidjoinGroup(InetAddressmcastaddr) 加入组播组voidleaveGroup(InetAddressmcastaddr) 离开组播组voidsetLoopbackMode(booleandisable)设置本地环回测试voidsetTimeToLive(intttl) 设置数据包生命时间4 知识填空1. 在应用层上HTTP协议使用传输层( )协议;应用层DNS协议使用传输层( )协议;应用层FTP协议使用传输层( )协议;应用层IGMP协议使用传输层( )。2. 信息传播的方式有( )、( )和( )。3. 在JAVA语言中,.net类库包中有关于UDP通信的类,包括( ),( )和( )。4. DatagramSocket类中的发送数据包的方法是( ),接收数据包的方法是( )。5. DatagramPacket类中从数据报中获得字节数据的方法是( ),设置数据报的方法是( )。6. IPv4地址,通常由2个部分组成,分别是:网络号 和 主机号,广播地址是( )全为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.getLocalAddress(); 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; int 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); System.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.close(); 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; class 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); 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); /创建子线程 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(); 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 DatagramSocket 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.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() + : + 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 java.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 1065端口 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.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() + : + 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.IOException;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 (SocketException 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 i=0;idata.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;import 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 FileInputStream(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 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(data); 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 DatagramSocket 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 = 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 : +data.length); for(int i=0;idata.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; System.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.println(Receieve start.); p = new DatagramPac
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 补充采购合同条款的确认函5篇范本
- 浙江省杭州市萧山区2027届中考二模物理试题含解析
- 江西省宜春市高安市达标名校2027届中考二模物理试题含解析
- 2026年环境工程专业职称考试试卷及答案
- 2026年云南迪庆州文物保护工程从业考试(勘察设计通论)模拟题库及答案
- 2026年动画绘制员(二级)动画制作分镜头脚本编写考试试卷及答案
- 游戏设计创新与行业标准绩效评估表
- 2026年燃气安全生产管理人员模拟考试题库试卷(50题,含答案)
- 2026年土地规划师土地利用规划实践试卷与答案
- 2026年事业单位考试(综合管理类A类)综合应用能力试卷及答案指导
- 常见肿瘤急症及并发症的护理课件
- 某乡镇污水厂配套土地复垦方案报告书
- 2025年国企董事会办公室工作人员考试题及答案
- 渗固磨耗层技术在高速公路养护中的应用:实践、效益与展望
- pdf日语专业毕业论文写作指导
- 阳光合法经营承诺书8篇
- GB/T 31897.201-2025灯具性能第2-1部分:特殊要求LED灯具
- 梅毒乙肝艾滋病培训知识课件
- 快递行业交通安全培训课件
- 2025上海高校大学《辅导员》招聘考试题库及答案
- 医疗质量安全核心制度落实情况监测指标(2025 年版)解读
评论
0/150
提交评论