什么是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. nginx反向代理出错:proxy_pass

    问题描述: 一台服务器代理访问另一台服务器,代码如下图所示: 重新加载nginx后不会跳到该域名,而是出现error的页面. 查看error.log日志为以下报错: 2021/03/09 23:07: ...

  2. [ARC101C] Ribbons on Tree

    神仙的容斥题与神仙的树形DP题. 首先搞一个指数级的做法:求总的.能够覆盖每一条边的方案数,通过容斥可以得到\(\text{ans}=\sum\limits_E{(-1)^{|E|}F(E)}\).其 ...

  3. Matlab混合编程

    Matlab混合编程 混合编程目的 在Matlab中采用混合编程目的主要包括 利用已有的函数库,避免重复工作 加速计算,特别是减少循环所用时间 利用GPU等进行异构编程 混合编程方法-mex函数 目前 ...

  4. 23-Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  5. c语言转义字符如下

    #define MQTT_EVENT_REPORT_BOX_STATUS_FORMAT "{"\                                           ...

  6. 码上来战!探索“智”感生活,HMS Core线上Codelabs挑战赛第4期开始!

    HMS Core线上Codelabs挑战赛第4期正式开始!我们向所有实践力超强.创新力满满的开发者发出邀请,用你的超级"码"力,解锁更多应用价值! 生活里,我们被手机"秒 ...

  7. Mybatis批量添加、更新小结

    虽然是很基础的东西,不过难免会忘记,所以写个笔记巩固一下,顺便分享. 实体类: @Data public class EventOrder { ​ private Long id; ​ private ...

  8. SpringBoot 整合 MyBatis,实现 CRUD 示例

    目录 前言 创建项目/模块 SpringBoot Console Application CommandLineRunner SpringBoot 集成 MyBatis 创建数据库/表 配置数据源/连 ...

  9. 动态滑动登陆框-Html+Css+Js

    动态滑动登陆框 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  10. JS控制元素的显示和隐藏

    利用来JS控制页面控件显示和隐藏有两种方法,两种方法分别利用HTML的style中的两个属性,两种方法的不同之处在于控件隐藏后是否还在页面上占空位. 方法一: document.getElementB ...