前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java中的UDP通信

Java中的UDP通信

作者头像
头发还在
发布于 2023-10-16 03:01:14
发布于 2023-10-16 03:01:14
20200
代码可运行
举报
文章被收录于专栏:桃花源桃花源
运行总次数:0
代码可运行

1 UDP通信机制

Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。与TCP协议不同,UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。在发送数据前,需要进行封包操作(使用 DatagramPacket 类),才能发送和接收数据(使用 DatagramSocket 类)。

使用UDP传输数据时,可能存在的问题有:

丢失包;

乱序;

错误包;

数据包的重复发送。

通常需要使用UDP的场景主要是对数据流要求不高时,如视频流、音频流等。

2 UDP 通信编程的一般步骤

  • 创建客户端的 DatagramSocket 并定义客户端用来接收报文的端口;
  • 创建服务器端的 DatagramSocket 并定义服务端用来接收报文的端口;
  • 在服务器端创建 DatagramPacket 对象,封装待发送的数据包;
  • 客户端发送报文;
  • 服务器端接收报文。

3 服务端

服务端接收数据使用 DatagramSocket对象,创建对象时,需要指定一个用于接收请求的端口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpServer {
    public static void main(String[] args) {
        try {
            //创建服务端接收数据的 DatagramSocket 对象
            DatagramSocket datagramSocket = new DatagramSocket(5555);
            //创建数据缓冲区
            byte[] buff = new byte[1024];
            //创建数据报的包对象
            DatagramPacket packet = new DatagramPacket(buff, buff.length);
            //等待接收客户端发送的数据
            datagramSocket.receive(packet);
            //获取数据
            String input = new String(packet.getData(), 0, packet.getLength());

            System.out.println("接收到客户端的请求: " + input);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在接收客户端发来的请求时,使用了字节缓冲区,可以一次性接收 1024 个字节的数据,可以减少网络IO的操作。

在服务端和客户端之间的数据流使用 DatagramPacket 封装,因此在接收数据时,应使用该对象进行接收。

datagramSocket.receive(packet);方法是一个阻塞式方法,当没有接收到数据时,程序将在这里等待,接收到数据后,才会继续执行下边的代码。

在接收到字节数据后,如果不想直接使用二进制数据,需要对数据进行转换。

在获取接收到的数据时,使用的是 new String(packet.getData(), 0, packet.getLength()) ,并没有读取缓冲区的所有内容,因为当从网卡中读取的实际数据,若长度小于缓冲区长度时,其数据对于服务端来说是没有意义的。我们仅需要拿走实际接收到的数据报即可。

4 客户端

创建客户端时,也需要创建一个 DatagramSocket 对象,同时指定发送数据的端口,如果和服务端在同一台机器上时,该端口应与服务端不同。

在客户端发送数据时,需要将数据封装到 DatagramPacket 对象中,同时需要指定接收数据的服务端IP及端口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Scanner;

public class UdpClient {
    public static void main(String[] args) {
        try {
            //创建数据发送对象,并指定要发送数据的端口
            DatagramSocket socket = new DatagramSocket(5556);
            //将要发送的数据转换为字节数组
            Scanner scanner = new Scanner(System.in);
            String output = scanner.next();
            byte[] bytes = output.getBytes();
            //创建数据报的包对象
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length, new InetSocketAddress("127.0.0.1", 5555));
            //发送消息
            socket.send(packet);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5 通信

5.1 不启动服务端

当没有启动服务端,只启动客户端发送数据时,客户端将数据正常发出而没有报错。

可见客户端在发送数据时,并没有对服务端进行检查。

5.2 启动服务端

这是一次通信,如果想要建立多次通信,可以在服务端加上循环,方法同 TCP 通信类似。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java-网络编程
哈喽!大家好,我是小简。今天开始学习《Java-网络编程》,此系列是我做的一个 “Java 从 0 到 1 ” 实验,给自己一年左右时间,按照我自己总结的 Java-学习路线,从 0 开始学 Java 知识,并不定期更新所学笔记,期待一年后的蜕变吧!
小简
2023/01/04
4720
Java-网络编程
在Java中实现UDP协议编程(DatagramSocket/DatagramPacket)「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。1.什么是UDP协议? UDP( User Datagram Protocol )协议是用户数据报,在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。 UDP是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。 2.为什么要使用UDP?
全栈程序员站长
2022/09/06
1.5K1
网络编程——UDP编程
计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信,因为所有计算机都需要遵循同一种网络协议。因此,为了把计算机网络接入互联网,就必须使用TCP/IP协议。
全栈程序员站长
2022/10/05
1.1K0
网络编程——UDP编程
UDP网络编程
进行数据传输时,首先将传输的数据定义成数据报(Datagram),在数据报中指明数据将要到达的Socket(主机地址和端口号),然后再将数据发送出去。
拾点阳光
2018/09/28
6750
Java 网络编程详解
TCP/IP (Transmission Control Protocol/Internet Protocol) 的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是lnternet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
timerring
2023/05/11
8610
Java 网络编程详解
Java UDP的简单实例以及知识点简述
  Java中实现UDP协议的两个类,分别是DatagramPacket数据包类以及DatagramSocket套接字类。
Rekent
2018/09/04
7410
Java UDP的简单实例以及知识点简述
JAVA网络编程之UDP通信
UDP协议是一种对等通信的实现,发送方只需要接受方的IP(地址)和Port(端口),就可以直接向它发送数据,不需要线连接。每个程序都可以作为服务器,也可以作为客户端。UDP是一种无连接的传输协议,每个数据报的大小限定在64KB以内。数据报是一个在网络上发送的独立信息,它的到达。到达时间以及内容本身等都不能得到保证。这种传输方式是无序的,也不能确保绝对的安全可靠,但它很简单也具有较高的效率。 使用UDP协议进行数据传输是,需要将需要传输数据定义为数据报(DatagramPaket),在数据报中指明数据所要到达Socket(主机地址和端口号),然后再将数据报发送出去。实例化DatagramPacket时使用参数port和没有使用参数port的区别在与,提供port的一方可以让别人主动发送消息过来,而没有参数port的则会在发送消息时自动绑定一个本地没有使用的端口。在接收到发送的数据报(DatagramPaket)时,不仅可以获取数据,还可以获得发送方的IP和Port,这样就可以向发送方发送数据,因此,本质上二者是对等的。
用户8785253
2021/08/23
1.3K0
【Netty】UDP协议使用学习
TCP协议已经尽可能的支持了并发 所以大部分还是使用的TCP协议 除非网络很差的情况下使用UDP
冷环渊
2022/05/01
1.4K0
通过UDP广播实现Android局域网Peer Discovering
本文将介绍以下知识点: 1、TCP与UDP的区别; 2、单播、多播、广播; 3、Java中实现UDP的重要的类; 4、Peer Discovering方案 01 TCP vs UDP TCP:Transmission Control Protocol(传输控制协议) TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。TCP建立连接之后,通信双方都同时可以进行数据的传输,是全双工的。 在保证可靠性上
用户1332428
2018/03/08
2.6K0
通过UDP广播实现Android局域网Peer Discovering
Java利用UDP协议建立广播组通信【附通信源码】
之前和大家分享了使用TCP协议进行网络通信的过程,想了解的小伙伴可以看我的这篇文章《Java利用TCP协议实现客户端与服务器通信》,今天来和大家分享一下在Java网络编程开发中,使用UDP协议进行网络通信,
灰小猿
2020/09/23
1.6K0
Java利用UDP协议建立广播组通信【附通信源码】
网络通信学习笔记(四)---UDP通信
这里我们首先需要明白一点,UDP本身就是一种不需要连的协议,所以是不存在客户端与服务端的.
萌萌哒的瓤瓤
2021/01/13
6450
网络通信学习笔记(四)---UDP通信
Java学习笔记——网络编程
Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。
梦飞
2022/06/23
2500
初学者第69节网络编程-UDP
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。
用户5224393
2019/08/20
4650
Java网络编程
ip:全称为:互联网协议地址,也称IP地址,是分配给上网设备的数字标签,常见的IP分类为:ipv4和ipv6
乐心湖
2020/07/31
8640
Java网络编程
使用DatagramSocket发送、接收数据(Socket之UDP套接字)
Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报,Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成的。
全栈程序员站长
2022/07/01
2.6K0
JAVA网络编程TCP通信
Socket称为“套接字”,描述IP地址和端口。在Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端口上,不同的端口对应于不同的服务。Socket和ServerSocket类位于java.net包中。ServerSocket用于服务端,Socket是建立网络连接时使用的。连接成功时,应用程序两端都会产生一个Socket实例,通过操作这个实例完成所需会话。
HUC思梦
2020/09/03
8870
JAVA网络编程TCP通信
UDP协议支持广播发送数据_tcp协议建立连接的过程
之前和大家分享了使用TCP协议进行网络通信的过程,想了解的小伙伴可以看我的这篇文章《Java利用TCP协议实现客户端与服务器通信》,今天来和大家分享一下在Java网络编程开发中,使用UDP协议进行网络通信,
全栈程序员站长
2022/08/18
1.7K0
UDP协议支持广播发送数据_tcp协议建立连接的过程
阶段01Java基础day25网络编程
声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接:http://www.duiyi.xyz/c%e5%ae%9e%e7%8e%b0%e9%9b%b7%e9%9c%86%e6%88%98%e6%9c%ba-32/
对弈
2019/09/04
3670
【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )[通俗
2. UDP 发送和接收 : 计算机 A 向 计算机 B 的 X 端口发送消息 , B 不一定能接收到 , B 能收到并处理该消息的前提是 , B 当前正在监听 X 端口 ;
全栈程序员站长
2022/08/31
6.6K0
【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )[通俗
基于UTP的Socket编程(基础)
CBeann
2023/12/25
1140
相关推荐
Java-网络编程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文