什么是UDP协议:

UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket 但这两个 Socket之间并没有虚拟链路,这两个Socket只是发送、接收数据报的对象。Java 提供了DatagramSocket对象作为基于UDP协议的Socket。使用DatagramPacket代表 DatagramSocket发送、接收的数据包。
 
UDP协议从问世至今已经被使用了很多年,虽然UDP协议目前应用不如TCP协议广泛,但 UDP协议依然是一个非常实用和可行的网络传输层协议。尤其是在一些实时性很强的应用场景中,比如网络游戏、视频会议等,UDP协议的快速更具有独特的魅力。
 
UDP协议是一种面向非连接的协议,面向非连接指的是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。至于对方是否可以接收到这些数据内容,UDP协议无法控制,因此说UDP议是一种不可靠的协议UDP协议适用于一次只传送少量数据、对可靠性要求不高的应用环境。因为UDP协议是面向非连接的协议,没有建立连接的过程,因此它的通信效率很高。但也正因为如此,它的可靠性不如TCP协议。
 
UDP 协议和 TCP 协议简单对比如下
(1),TCP协议: 可靠,传输大小无限制,但是需要连接建立时间,差错控制开销大。
(2),UDP协议: 不可靠,差错控制开销较小,传输大小限制在64K以下,不需要建立连接。

Java简单使用UDP:

DatagramSocket udpClient = new DatagramSocket() 端口随机  客户端
DatagramSocket udpSocket = new DatagramSocket(port) 指定端口 :服务端
 
客户端向服务器端发送一个数据,服务端原样返回
client端代码:
package tcpandudp.udpexample;

import java.io.IOException;
import java.net.*;
import java.util.Scanner; /**
* @ClassName UdpClient
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/5/12.
*/
public class UdpClient {
public static void main(String[] args) {
/**
* 键盘输入
*/
Scanner scanner = new Scanner(System.in); /**
* 构建客户端UDP Socket 端口随机 从键盘获取数据发送
* 初始化要发给服务端的数据包
*/
try (DatagramSocket udpClient = new DatagramSocket()){
/**
* 初始化要发给服务端的数据包
*/
DatagramPacket outputPacket = new DatagramPacket(new byte[0],0, InetAddress.getByName("127.0.0.1"),2233);
//返回数据的字节数组
byte[] inBuffer = new byte[4096];
/**
* 循环发送并获取返回数据
*/
while (scanner.hasNextLine()){
//获取键盘输入
String line = scanner.nextLine();
//将初始化的数据包加入数据
outputPacket.setData(line.getBytes());
// 使用socket 发送数据
udpClient.send(outputPacket); //返回数据包构建
DatagramPacket inputPacket = new DatagramPacket(inBuffer,inBuffer.length);
//返回数据写入inputPacket包
udpClient.receive(inputPacket);
System.out.println("收到返回数据:" + new String(inputPacket.getData(),0,inputPacket.getLength()));
}
} catch (SocketException | UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
server端代码:
package tcpandudp.udpexample;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException; /**
* @ClassName UDPServer
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/5/12.
*/
public class UDPServer {
public static void main(String[] args) {
/**
* 定义UDP服务端监听的端口
*/
int port = 2233;
/**
* 构造一个接受UDP数据的包
*/
byte[] inBuffer = new byte[4096];
DatagramPacket inPacket = new DatagramPacket(inBuffer,inBuffer.length);
/**
* 构建socket 接受数据放到UDP包中解析,
* udpSocket 实例放到try()语句中自动管理,报错后自动close()
*/
try (DatagramSocket udpSocket = new DatagramSocket(port)){
/**
* 获取客户端数据
*/
while (true){
//获取客户端数据,装到inPacket包中
udpSocket.receive(inPacket);
System.out.println(inBuffer == inPacket.getData()); //测试包中的数组和定义的inBuffer数组是否是同一个对象
/**
* 将收到的包中字节(inPacket.getData())转换为字符串
*/
System.out.println("收到:" + new String(inPacket.getData(),0,inBuffer.length));
/**
* 构建发送包
*/
DatagramPacket outPacket = new DatagramPacket(inPacket.getData(),inPacket.getLength(),inPacket.getSocketAddress());
//发送数据
udpSocket.send(outPacket);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

MulticastSocket基于UDP协议实现多点广播:

DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播方式发送到多个客户端。若要使用多点广播,需要让一个数据报标有一组目标主地址,当数据报发出后,整个组的所有主机都能收到该数据报文,多点广播(或多点发送)实现了将单一信息发送到多个接收者的广播。思想是设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看做一个组,当客户端需要发送、接收广播信息时,加入到该组即可。
IP协议为多点广播提供了这批特殊的IP地址,这些IP地址的范围是 224.0.0.0 到 239.255.255.255
多点广播的示意图如下:
0
客户端控制台输入内容,所有的加入本组的客户端都能收到消息:
package tcpandudp.udpexample;

import java.io.IOException;
import java.io.PipedReader;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Scanner; /**
* @ClassName MulticastSocketServerAndClient
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/5/12.
*/
public class MulticastSocketClient {
/**
* 多点广播的IP:224.0.0.0 到 239.255.255.255
*/
private static final String BROAD_CAST_IP = "230.1.1.1";
/**
* 多点广播的端口任意
*/
private static final int BROAD_CAST_PORT = 30000;
private void start(){
/**
* 创建广播socket
*/
try (MulticastSocket multicastSocket = new MulticastSocket(BROAD_CAST_PORT);
Scanner scanner = new Scanner(System.in);
){
/**
* 构建IP地址实例
* 初始化Socket 加入监听广播组地址(接收组内消息,向组内发送消息)
*/
InetAddress broadcastAddr = InetAddress.getByName(BROAD_CAST_IP);
multicastSocket.joinGroup(broadcastAddr);
/**
* 启动一个线程接收广播数据
*/
new Thread(){
@Override
public void run() {
/**
* 构建接收数据的UDP包
*/
byte[] inBuffer = new byte[4096];
DatagramPacket inPacket = new DatagramPacket(inBuffer,0,inBuffer.length);
/**
* 获取到数据输出
*/
while (true){
try {
multicastSocket.receive(inPacket);
System.out.println("收到:" + new String(inPacket.getData(),0,inPacket.getLength()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
/**
* 构建要发送的UDP数据包
* 主线程获取命令行输入,发送广播
*/
DatagramPacket outPacket = new DatagramPacket(new byte[0],0, broadcastAddr,BROAD_CAST_PORT);
while (scanner.hasNextLine()){
/**
* 获取输入内容字节,加到包中
* 然后发送出去
*/
outPacket.setData(scanner.nextLine().getBytes());
multicastSocket.send(outPacket);
}
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 程序入口
*/
public static void main(String[] args) {
new MulticastSocketClient().start();
}
}

java 网络编程基础 UDP协议的Socket:DatagramSocket;广播Socket:MulticastSocket的更多相关文章

  1. java 网络编程基础 UDP协议DatagramSocket,MulticastSocket 实现局域网聊天软件(Server + Client模式)

      开发思路: 服务端两个Socket: UDP的DatagramSocket接收客户端消息. 广播multicastSocket 发送广播消息 客户端一个Socket: multicastSocke ...

  2. Java网络编程和NIO详解开篇:Java网络编程基础

    Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...

  3. Java网络编程基础(Netty预备知识)

    今天在家休息,闲来无事,写篇博客,陶冶下情操~~~ =================我是分割线================ 最近在重新学习Java网络编程基础,以便后续进行Netty的学习. 整 ...

  4. java网络编程基础——TCP网络编程一

    基于TCP协议的网络编程 TCP/IP协议是一种可靠的网络协议,它的通信的两端各自建立一个Socket,从而在通信的两端之间形成网络虚拟链路. Java使用Socket对象来代表两端的通信端口,并通过 ...

  5. java网络编程基础——网络基础

    java网络编程 网络编程基础 1.常用的网络拓扑结构: 星型网络.总线网络.环线网络.树形网络.星型环线网络 2.通信协议的组成 通信协议通常由3部分组成: 语义部分:用于决定通信双方对话类型 语法 ...

  6. JAVA基础知识之网络编程——-基于UDP协议的通信例子

    UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramS ...

  7. java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求

    1.Java中客户端和服务器端通信的简单实例 Java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一 ...

  8. Java学习笔记52(网络编程:UDP协议案例)

    InetAddress类: 表示互联网中的IP地址,示例: package demo; import java.net.InetAddress; import java.net.UnknownHost ...

  9. 网络编程: 基于UDP协议的socket

    udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 服务端 import socket sk = socket ...

随机推荐

  1. mybatis新增账号并且返回主键id

    <!--新增账号和权限的关联关系--><insert id="save" useGeneratedKeys="true" keyPropert ...

  2. springboot增加多端口管理

    目标是这样的: 方法 方法还是比较简单的1.点击菜单栏:Views -> Tool Windows -> Services:中文对应:视图 -> 工具窗口 -> 服务:快捷键是 ...

  3. 论文翻译:2021_Decoupling magnitude and phase optimization with a two-stage deep network

    论文地址:两阶段深度网络的解耦幅度和相位优化 论文代码: 引用格式:Li A, Liu W, Luo X, et al. ICASSP 2021 deep noise suppression chal ...

  4. P6604 [HNOI2016]序列 加强版

    *I. P6604 [HNOI2016]序列 加强版 摘自学习笔记 简单树论 笛卡尔树部分例题 I. 和 P6503 比较类似.我们设 \(f_i\) 表示全局以 \(i\) 结尾的子区间的最小值之和 ...

  5. nohup使用

    nohup:不挂断运行 在忽略挂起信号的情况下运行给定的命令,以便在注销后命令可以在后台继续运行. 可以这么理解:不挂断的运行,注意并没有后台运行的功能,就是指,用nohup 运行命令可以是命令永远运 ...

  6. MariaDB——在Linux中查找数据库路径,并进入数据库

    1.直接在命令行运营mysql,如果出现下图,说明数据库路径没有设置到环境变量里. 2.找出数据库路径,可以用ps -ef | grep my 命令,查找后台正在执行的命令任务中,包含my字母开头的所 ...

  7. lsof之列出已打开的文件

    lsof命令常用解析 Linux中常用 lsof 来查看文件调用进程等相关信息,也可用来查看活跃的进程信息和端口监听进程信息等 1. lsof 命令介绍 NAME lsof - list open f ...

  8. 学习java的第六天

    一.今日收获 1.开始了学习手册第二章的学习 2.了解了java里的常量与变量以及数据类型,与c语言的内容类似 二.今日难题 1.都是基础知识,没有什么难题 三.明日目标 1.继续学习java学习手册 ...

  9. 基于MQTT协议实现远程控制的"智能"车

    智能,但不完全智能 虽然我不觉得这玩意儿有啥智能的,但都这么叫就跟着叫喽. 时隔好几天才写的 其实在写这篇博文的时候我已经在做升级了,并且已经到了中后期阶段了. 主要是业余时间做着玩,看时间了. 规格 ...

  10. spring boot 之监听器ApplicationListener

    监听器ApplicationListener 就是spring的监听器,能够用来监听事件,典型的观察者模式.ApplicationListener和ContextRefreshedEvent一般都是成 ...