Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JAVA网络编程之UDP通信

JAVA网络编程之UDP通信

作者头像
用户8785253
发布于 2021-08-23 03:30:12
发布于 2021-08-23 03:30:12
1.3K00
代码可运行
举报
文章被收录于专栏:JAVA学习历程JAVA学习历程
运行总次数:0
代码可运行

文章目录


概述

UDP协议是一种对等通信的实现,发送方只需要接受方的IP(地址)和Port(端口),就可以直接向它发送数据,不需要线连接。每个程序都可以作为服务器,也可以作为客户端。UDP是一种无连接的传输协议,每个数据报的大小限定在64KB以内。数据报是一个在网络上发送的独立信息,它的到达。到达时间以及内容本身等都不能得到保证。这种传输方式是无序的,也不能确保绝对的安全可靠,但它很简单也具有较高的效率。 使用UDP协议进行数据传输是,需要将需要传输数据定义为数据报(DatagramPaket),在数据报中指明数据所要到达Socket(主机地址和端口号),然后再将数据报发送出去。实例化DatagramPacket时使用参数port和没有使用参数port的区别在与,提供port的一方可以让别人主动发送消息过来,而没有参数port的则会在发送消息时自动绑定一个本地没有使用的端口。在接收到发送的数据报(DatagramPaket)时,不仅可以获取数据,还可以获得发送方的IP和Port,这样就可以向发送方发送数据,因此,本质上二者是对等的。

一、TCP通信的实现原理

1、在接收端指定一个端口号来创建DatagramSocket,然后创建一个接收数据报(DatagramPaket),使用recevie方法等待发送方请求报文,这将阻塞服务器线程 2、在发送方创建一个DatagramSocket,使用接收方的IP和端口来创建发送数据报(DatagramPaket),使用send方法发送。现在接收方的recevie方法被唤醒,同时会将发送方的数据报内容填充到接收方的DatagramPaket中。 3、接收方从发送方的数据报中获得发送方的IP和端口,使用它们构造一个发送数据报,然后发送给发送方,这样就实现了发送方和接收方的通信 4、在通信完成后,在客服端和服务端中分别关闭Socket

二、代码

发送端:

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

public class SendMessage {

	public static void main(String[] args) throws Exception {
		// 创建发送端Socket对象
		DatagramSocket sendSocket = new DatagramSocket();
		// 准备需要发送的数据
		String message = "hello";
		// 创建一个缓冲区
		byte[] messageByte = message.getBytes();
		// 获取缓冲区中数据的真实长度
		int messageLen = message.length();
		// InetAddress实例化获取本机通信地址
		InetAddress address = InetAddress.getLocalHost();
		// 设置通信端口号
		int port = 12345;
		// 打包数据
		DatagramPacket sendPacket = new DatagramPacket(messageByte, messageLen, address, port);
		// 发送数据
		sendSocket.send(sendPacket);
		// 发送端等待接收端成功接收信息后返回的回应
		// 创建一个缓冲区,容量尽量设置大一点因为不知道发送过来的信息有多大
		byte[] recevieByte = new byte[1024*10];
		int len = recevieByte.length;
		// 接收数据报
		DatagramPacket receivePacket = new DatagramPacket(recevieByte, len);
		// 接收数据
		sendSocket.receive(receivePacket);
		// 获取接收端发送过来的真实长度以及数据
		byte[] data = receivePacket.getData();
		int length = receivePacket.getLength();
		String receiveData = new String(data,0,length);
		// 获取发送者的IP
		address = receivePacket.getAddress();
		String ip = address.getHostAddress();
		System.out.println("接收来自:"+ip+"的数据,内容是:"+receiveData);
		// 关闭资源
		sendSocket.close();	
	}
}

接收端:

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

public class RecevieMessage {

	public static void main(String[] args) throws Exception {
		// 接收消息的端口(与发送端保持一致)
		int port = 12345;
		DatagramSocket recevieSocket = new DatagramSocket(port);
		// 设置缓冲区接收发过来的信息
		byte[] receiveByte = new byte[1024*10];
		int len = receiveByte.length;
		// 接收数据报
		DatagramPacket receviePacket = new DatagramPacket(receiveByte, len);
		// 接收数据
		recevieSocket.receive(receviePacket);
		// 获取实际接收到的数据及其大小
		byte[] data = receviePacket.getData();
		int length = receviePacket.getLength();
		String receiveData = new String(data,0,length);
		// 获取发送者的IP
		InetAddress address = receviePacket.getAddress();
		String ip = address.getHostAddress();
		System.out.println("接收来自:"+ip+"的数据,内容是:"+receiveData);
		// 接收端接收到信息后发送一条确认接收的消息到发送端
		String message = "OK";
		byte[] messageByte = message.getBytes();
		int messageLength = message.length();
		// 从已收到的数据报中获取IP和port
		address = receviePacket.getAddress();
		int port1 = receviePacket.getPort();
		//构造新数据报
		DatagramPacket sendPacket = new DatagramPacket(messageByte, messageLength, address, port1);
		// 发送数据
		recevieSocket.send(sendPacket);
		// 关闭资源
		recevieSocket.close();
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Java】21 基于 UDP 的网络编程
  UDP 协议是英文 User Datagram Protocol 的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络连接。UDP 协议从问世至今已经被使用了很多年,虽然 UDP 协议目前应用不如 TCP 协议广泛,但 UDP 协议依然是一个非常实用和可行的网络传输层协议。尤其是在一些实时性很强的应用场景中,比如网络游戏、视频会议等,UDP 协议的快速更具有独特的魅力。   UDP 协议是一种面向非连接的协议,面向非连接指的是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。至于对方是否可以接收到这些数据内容,UDP 协议无法控制,因此说 UDP 协议是一种不可靠的协议。UDP 协议适用于一次只传送少量数据、对可靠性要求不高的应用环境。与 TCP 协议一样,UDP 协议直接位于 IP 协议之上。实际上,IP 协议属于 OSI 参考模型的网络层协议,而 UDP 协议和 TCP 协议都属于传输层协议。   因为 UDP 协议是面向非连接的协议,没有建立连接的过程,因此它的通信效率很高;但也正因为如此,它的可靠性不如 TCP 协议。UDP 协议的主要作用是完成网络数据流和数据报之间的转换。在信息的发送端,UDP 协议将网络数据流封装成数据报,然后将数据报发送出去;在信息的接收端,UDP 协议将数据报转换成实际数据内容。
Demo_Null
2020/09/28
6700
【Java】21 基于 UDP 的网络编程
【Java 基础篇】Java UDP通信详解
UDP(User Datagram Protocol)是一种无连接的网络传输协议,它不像TCP那样需要建立连接和维护状态,因此更加轻量级。UDP适用于那些对数据传输的实时性要求较高,可以容忍一定数据丢失的场景。本文将详细介绍Java中如何使用UDP协议进行网络通信,包括UDP套接字、数据传输、服务器和客户端的创建等。
繁依Fanyi
2023/10/12
6100
【Java 基础篇】Java UDP通信详解
【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 接收数据包 | 端口号分配使用机制 )[通俗
【Java 基础篇】Java网络编程实时数据流处理
在现代计算机应用程序中,处理实时数据流是一项关键任务。这种数据流可以是来自传感器、网络、文件或其他源头的数据,需要即时处理并做出相应的决策。Java提供了强大的网络编程工具和库,可以用于处理实时数据流。本文将详细介绍如何使用Java进行实时数据流处理。
繁依Fanyi
2023/10/12
3400
【Java 基础篇】Java网络编程实时数据流处理
java 之UDP编程
大白话:每一台电脑都有自己的ip地址,向指定的ip地址发数据,数据就发送到了指定的电脑。UDP通信只是一种通信方式而已,其特点就不多说。有了ip地址数据就能发送到指定的电脑了,但是呢!我把数据发送到电脑了,电脑中的哪个程序接收呢。不知道亲们知不知道,其实每一个网络软件都有自己的通信端口,像qq,酷狗音乐的下载端口等等。现在知道了吧,向指定的ip地址和指定的端口发数据,才能发送到指定的程序上(当然是我们自己做的程序)。 我们要做两个程序发送端和接收端,先做发送端吧 java提供了专门用于UDP通信的类Data
杨奉武
2018/04/10
8740
【Java 网络编程】UDP 服务器 与 客户端持续交互 案例
1. UDP 单播传输流程 : A 给 B 发送数据包 , B 设备一定要处于监听 X 端口状态 , A 向 B 的 X 端口发送数据包 , B 才能收到 ; B 收到 A 的数据包后 , B 就知道了 A 的端口号 Z 的信息了 , 此时 B 可以向 A 的 Z 端口号发送数据包 ;
韩曙亮
2023/03/27
1.6K0
【Java 网络编程】UDP 服务器 与 客户端持续交互 案例
【说站】java UDP通信的原理
1、UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象
很酷的站长
2022/11/23
5160
【说站】java UDP通信的原理
java网络编程从0到1快速上手
java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。
一个风轻云淡
2023/10/15
2870
java网络编程从0到1快速上手
Java---网络编程(2)-UDP
☆ UDP 将数据及源和目的封装成数据包中,不需要建立连接 每个数据报的大小在限制在64k内 因无连接,是不可靠协议 不需要建立连接,速度快
谙忆
2021/01/21
3600
DatagramPacket与DatagramSocket 详解
  a.DatagramPacket与DatagramSocket位于java.net包中
全栈程序员站长
2022/08/18
8390
JavaTCP和UDP套接字编程
原文地址:http://www.cnblogs.com/MindMrWang/p/8919890.html 在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向,请求转发等等(当然也没有很多),但是我们自己真正的去开发一个小型网站(对安全性一起其他并发不作要求)的时候,其实我们会发现,Java后端是真的省事,好像除了CURD还是CURD,没有什么更新鲜的了。但是我们回顾计算机网络的知识提出疑问,计算机信息传输有TCP和UDP两种连
MindMrWang
2018/04/24
7140
JavaTCP和UDP套接字编程
Java从入门到精通十三(java网络编程)
前言:不在本文中详细说明网络通信(具体的准备有时间开一个网络专栏,具体按照Cisco Packet进行实验模拟说明。)
兰舟千帆
2022/07/16
1.9K0
Java从入门到精通十三(java网络编程)
JAVA网络编程TCP通信
Socket称为“套接字”,描述IP地址和端口。在Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端口上,不同的端口对应于不同的服务。Socket和ServerSocket类位于java.net包中。ServerSocket用于服务端,Socket是建立网络连接时使用的。连接成功时,应用程序两端都会产生一个Socket实例,通过操作这个实例完成所需会话。
HUC思梦
2020/09/03
8990
JAVA网络编程TCP通信
【java网络】编程基础
Java 网络编程 基于套接字的通信可以使程序通过指定的套接字进行通信。套接字是两个主机之间逻辑链接的端点,可以用于发送和接收数据,Java对套接字的处理非常类似于对输入输出操作的处理,因此,程序从socket中读写就像从文件中读写一样容易 Java支持流套接字和数据报套接字:流套接字使用传输控制协议TCP进行数据传输,而数据报套接字使用的是用户数据报协议UDP进行数据传输 1、客户/服务器计算模式 网络程序设计通常涉及一个服务器和一个或多个客户,客户向服务器发送请求,服务器响应请求。服务器创建一个服务器套
程序员互动联盟
2018/03/16
1.2K0
深入探秘 Java 网络编程:从基础到多线程服务器的全方位指南
Java 作为一门功能强大的编程语言,不仅在桌面应用、移动开发、后端开发等领域表现出色,还在网络编程中拥有广泛的应用。网络编程涉及在两个或多个设备之间通过网络进行通信,这对于构建分布式系统、客户端-服务器应用程序、以及互联网服务至关重要。在这篇博客中,我们将详细探讨 Java 网络编程的基础知识,并通过代码示例展示如何在 Java 中实现网络通信。
2的n次方
2024/10/15
1960
深入探秘 Java 网络编程:从基础到多线程服务器的全方位指南
Java网络编程
ip:全称为:互联网协议地址,也称IP地址,是分配给上网设备的数字标签,常见的IP分类为:ipv4和ipv6
乐心湖
2020/07/31
8690
Java网络编程
第62节:探索Java中的网络编程技术
网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考.
达达前端
2019/07/03
3760
第62节:探索Java中的网络编程技术
使用DatagramSocket发送、接收数据(Socket之UDP套接字)
Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报,Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成的。
全栈程序员站长
2022/07/01
2.6K0
JavaSe-网络编程
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
框架师
2021/04/28
3400
JavaSe-网络编程
Java中利用DatagramPacket与DatagramSocket进行通讯的示例
先运行Receiver工程,正在阻塞等待接收发送方发送的消息,总共接收到了5个消息,每个消息间隔5秒钟
全栈程序员站长
2022/08/22
3750
相关推荐
【Java】21 基于 UDP 的网络编程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档