什么是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. win10 如何查看本地连接的WIFI密码

    1 在状态栏右侧找到WIFI图标,右键WIFI图标,打开"网路和 Internet"设置 2 切换到 "状态"或"WLAN",找到" ...

  2. clickhouse使用的一点总结

    clickhouse据说是用在大数据量的olap场景列式存储数据库,也有幸能够用到它在实际场景中落地.本篇就来说说简单的使用心得吧. 1. 整体说明 架构啥的,就不多说了,列式存储.大数据量.高性能. ...

  3. admixture 群体结构分析

    tructure是与PCA.进化树相似的方法,就是利用分子标记的基因型信息对一组样本进行分类,分子标记可以是SNP.indel.SSR.相比于PCA,进化树,群体结构分析可明确各个群之间是否存在交流及 ...

  4. Bedtools genomecov 计算覆盖度

    简单说明: 从2.28.0版开始,bedtools使用htslib库支持CRAM格式 除了BAM文件,bedtools默认所有的输入文件都以TAB键分割 除非使用-sorted选项,bedtools默 ...

  5. 关于vim复制剪贴粘贴命令的总结-转

    最近在使用vim,感觉很好很强大,但是在使用复制剪切粘贴命令是,碰到了一些小困惑,网上找了一些资料感觉很不全,讲的也不好,遂自己进行实践并总结了. 首先是剪切(删除): 剪切其实也就顺带删除了所选择的 ...

  6. 宏GENERATED_BODY做了什么?

    Version:4.26.2 UE4 C++工程名:MyProject \ 一般语境下,我们说c++源码的编译大体分为:预处理.编译.链接; cppreference-translation_phas ...

  7. C# js获取buttonid

    var id= document.getElementById('<%=控件的ID.ClientID %>');

  8. 一劳永逸,使用 PicGo + GitHub 搭建个人图床工具

    原文链接: 一劳永逸,使用 PicGo + GitHub 搭建个人图床工具 经常写博客的同学都知道,有一个稳定又好用的图床是多么重要.我之前用过七牛云 + Mpic 和微博图床,但总感觉配置起来比较麻 ...

  9. 日常Java 2021/10/17

    今天开始Javaweb编译环境调试,从tomcat容器开始,然后mysql的下载,连接工具datagrip,navicat for mysql,然后就是编写自己的sql,安装jdbc,eclipse连 ...

  10. day06 HTTP协议

    day06 HTTP协议 HTTP协议 什么是http? HTTP 全称:Hyper Text Transfer Protocol 中文名:超文本传输协议 是一种按照URL指示,将超文本文档从一台主机 ...