前面在介绍TCP/IP协议的时候我们已经提到,在TCP/IP协议的传输层除了TCP协议外还有一个UDP协议,相比UDP的应用不如TCP广泛,但是随着计算机网络的发展UDP协议正越来越显示出及其威力,尤其是在需要很强的实时交互性的场合,例如网络游戏和视频会议等,UDP更是显示出极强的威力。

UDP采用Datagram(数据报)传输,数据包是一种尽力而为的传送数据的方式,它只是 把数据的目的地记录在数据包中,然后就直接放在网络上,系统不保证数据是否能安全到达,或者什么时候可以送到,它并不保证传送质量。

Datagram(数据报)是网络层数据单元在介质上传输信息的一种逻辑分组格式,它是一种在网络中传播的、独立的、自身包含地址信息的消息,它能够到达目的地、到达时间、到达时内容是否会变化是不能准确知道的。它的通信双方不需要建立连接,对于一些不需要很高质量的应用程序来说,数据报通信是一个非常好的选择。还有就是对实时性很高的情况,比如在实时音频和视频应用中,数据包的丢失和位置是静态的,是可以被人们所忍受的,这时就可以利用UDP协议传输。

DatagramSocket(数据报套接字)工作包含了3个信息类:DatagramPacket、DatagramSocket和MulticastSocket。DatagramPacket对象描绘了数据报地址信息,DatagramSocket表示客户程序和服务程序报套接字,MulticastSocket描绘了能够进行多点传输的数据报套接字。

示例:利用数据报通信的Client/Server程序

(1)首先要建立数据报通信的Socket,我们可以通过创建一个DatagramSocket对象实现它

(2)创建一个数据报包,用来实现无连接的包传送服务。每个数据报包用DatagramPacket类创建,DatagramPacket对象封装了数据报包数据、包长度、目标地址和目标接口

(3)创建完DatagramSocket和DatagramPacket对象,就可以发送数据报包了。发送是通过调用DatagramSocket对象的send()方法实现的,它需要以DatagramPacket对象为参数,将刚才封装进DatagramPacket对象中的数据组成数据报发出。

(4)为了接收从服务器返回的结果数据报包,我们需要创建一个新的DatagramPacket对象,这就需要调用到DatagramPacket的另一个构造方式DatagramPacket(byte[] buffer,int length),即只需指明存放接收的数据报的缓存区和长度。调用DatagramSocket对象的receive()方法完成接收数据报的工作,此时需要将上面创建的DatagramPacket对象作为参数,该方法会一直阻塞,直到收到一个数据报包,

(5)处理接收缓存区内的数据,获取服务结果

(6)当通信完成后,可以使用DatagramSocket对象的close()方法关闭数据报通信Socket。

下面给出一个简单的利用数据报通信的服务器程序和客户端程序,它只能完成与服务器简单的通信。

a、服务器端程序

package org.test.socket.server;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;/*** @author Administrator**/
public class UDPServer {public static void main(String[] args) {try {//创建SocketDatagramSocket socket = new DatagramSocket(12345);//创建接收包byte[] buf = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);System.out.println("开始接收包....");//循环监听while(true){socket.receive(receivePacket);String name = receivePacket.getAddress().toString();System.out.println("来自主机:"+ name + "\n端口:"+receivePacket.getPort());String s = new String(receivePacket.getData(),0,receivePacket.getLength());System.out.println("接收到数据:"+s);}} catch (SocketException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

b、客户端程序

package org.test.socket;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;public class UDPClient {public static void main(String[] args) {try {// 创建SocketDatagramSocket socket = new DatagramSocket();//创建发送包InetAddress host = InetAddress.getByName("localhost");String msg = "hello,I'm client";DatagramPacket sendPacket = new DatagramPacket(msg.getBytes(), msg.length(),host,12345);//发送数据socket.send(sendPacket);} catch (SocketException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

c、运行结果:

开始接收包....
来自主机:/127.0.0.1
端口:51240
接收到数据:hello,I'm client

d、这只是演示udp通信方式,以上方式也可改为双方通信

组播套接字MulticastSocket

DatagramSocket只允许数据报发送一个目的地址,MulticastSocket允许数据报以广播的形式发送到该端口的所有客户。

多播数据报套接字用于发送和接收IP多播包。MulticastSocket是一种DatagramSocket,它具有加入Internet上其他多播主机的组的附加功能。

组播套接字和Client/Server程序

服务器端程序。

package org.test.socket.server;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;public class MultiServer {public static void main(String[] args) {try {// TODO 创建SocketMulticastSocket socket = new MulticastSocket(12345);InetAddress group = InetAddress.getByName("231.0.0.0");socket.joinGroup(group);//接收数据报for(int i = 0;i<100;i++){byte[] buf = new byte[256];DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);socket.receive(receivePacket);//去除空格byte[] buf2 = new byte[receivePacket.getLength()];System.arraycopy(receivePacket.getData(), 0, buf2, 0, receivePacket.getLength());System.out.println(new String(buf2));}//删除组播地址socket.leaveGroup(group);socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

客户端程序

package org.test.socket;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;public class MultiClient {public static void main(String[] args) {try {// 创建SocketMulticastSocket socket = new MulticastSocket();InetAddress group = InetAddress.getByName("231.0.0.0");//创建发送数据包byte[] buf = new byte[0];DatagramPacket sendPacket = new DatagramPacket(buf, 0, group, 12345);//发送数据for(int i = 0;i < 5;i ++){byte[] buf1 = ("Data line" + i).getBytes();sendPacket.setData(buf1);sendPacket.setLength(buf1.length);socket.send(sendPacket);}socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

转载于:https://blog.51cto.com/aku28907/1782137

Java网络编程基础(三)---基于UDP编程相关推荐

  1. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

  2. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...

  3. Java网络爬虫基础概述

    Java网络爬虫基础 Http基础 网络资源一般是Web服务器上的一些各种格式的文件,通过Http协议传输互联网上的数据. 在Java中,通常通过URL标出网络资源的位置和Web服务器建立链接,获取网 ...

  4. Java网络编程,使用Java实现UDP和TCP网络通信协议,以及基于UDP的在线聊天室。

    文章目录 前言 一.网络编程概念 1.网络 2. 网络编程的目的 3.想要达到这个效果需要什么 4.网络分层 二.网络编程Java类 1.IP地址:InetAddress 2.端口 3.TCP连接 3 ...

  5. python的基础网络编程是下列_Python入门基础之网络编程、socket编程、TCP、UDP编程...

    忙了两天,继续更文!希望多多支持. 套接字 套接字是一种具有之前所说的"通讯端点"概念的计算机网络数据结构.网络化的应用程序在开始任何通讯之前都必需要创建套接字. 套接字有三种: ...

  6. linux下java基于UDP编程聊天_基于Linux下的UDP编程

    一. Linux下UDP编程框架 使用UDP进行程序设计可以分为客户端和服务器端两部分. 1.服务器端程序包括: ? 建立套接字 ? 将套接字地址结构进行绑定 ? 读写数据 ? 关闭套接字 2.客户端 ...

  7. 网络编程应用:基于UDP协议【实现文件下载】--练习

    要求: 基于UDP协议实现文件下载 发送方–请求–接收方发送文件–发送方接收文件 代码: 发送方: package Homework1;import java.io.File; import java ...

  8. Python学习笔记(四十六)网络编程(2)— UDP编程

    摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014320049779 ...

  9. 编程基础 垃圾回收_编程中的垃圾回收指南

    编程基础 垃圾回收 什么是垃圾回收? (What is Garbage Collection?) In general layman's terms, Garbage collection (GC) ...

  10. 网络与通信程序设计-基于UDP的广播通信实例

    目录 实验内容和设计思想 实验的内容 UDP的设计思想 UDP的协议头部 UDP通信编程思想 UDP的工作流程 UDP编程收发函数 广播通信 广播模式设置 广播套接字 UDP Socket的使用过程 ...

最新文章

  1. spring访问oracle数据库表,Spring访问oracle数据库配置步骤
  2. supervisor守护进程的安装配置使用
  3. 第十期 华为拓扑-OSPF配置
  4. Android WebView 和 javaScript的互相调用(一)
  5. mysql命令:为mysql命令指定字符集
  6. 牛客13592 武藏牌牛奶促销
  7. sync.Map 源码学习
  8. Defining custom settings in Odoo
  9. mysql awr 上海用户组_AWR-mysql教程-PHP中文网
  10. 地铁bas服务器系统,地铁BAS系统构成及工作原理
  11. App的暗黑颜色搭配
  12. 对马的幽灵是关于人的
  13. 阿里云数据工厂DataWorks
  14. Linux下的图片编辑软件和画图软件
  15. 高级安全Windows防火墙管理单元无法加载。请重新启动正在管理的计算机上的Windows防火墙服务,报错代码:0x6D9
  16. 家长们,居家网课这样做
  17. 什么叫单模光纤_酒店工程之监控安防工程光纤如何使用
  18. 马云装神弄鬼拜见过被通缉的气功大师王林, 歪门邪道的人还办教育,用淘宝支付宝真的不放心
  19. 我用维权失败经历告诉你,在淘宝上买到假货只能忍气吞声
  20. tensorflow.keras入门1

热门文章

  1. 如何通过.reg文件来修改注册表键和子键以及键值
  2. NAnt学习笔记(2) -- 节点的含义解释
  3. Windows Azure 架构指南 – 第 1卷 发布
  4. 发布一个验证码生成组件
  5. 洛谷P3960 列队(Splay)
  6. [JSOI2018]军训列队
  7. (转)线程安全的CopyOnWriteArrayList介绍
  8. QTableView中使用Delegate方式来实现对特定列的文本进行换行
  9. Node.js制作图片下载爬虫的一般步骤
  10. 《中国人工智能学会通讯》——3.15 社交媒体中的谣言识别研究及其发展趋势...