UDP通讯

2023-05-16

目录

利用DatagramSocket发送和接收UDP数据报

DatagramPacket构造方法说明

利用DatagramPacket和Datagramsocket简单实现服务器和客户端的通信

UDP协议通讯的用户状态跟踪


利用DatagramSocket发送和接收UDP数据报

1、Java语言中使用数据报(Datagram)进行基于UDP的网络编程;

2、数据报(Datagram)如同邮件系统,不能保证可靠的传输,而面向链接的TCP就好比打电话,双方能肯定对方接受到了信息;

3、Java API中java.net包提供了DatagramSocket和DatagramPacket两个类,用来支持数据报通信;

4、DatagramSocket用于在程序之间建立传送数据报的通信连接;

5、DatagramPacket则用来表示一个数据报;

6、用数据报方式进行网络编程时,无论客户端还是服务器端都要建立一个DatagramSocket对象,用来接收或发送数据报,然后使用DatagramPacket类对象作为传输数据的载体;

DatagramPacket构造方法说明

DatagramPacket相当于一个被邮寄的包裹,上面写着收货人的地址,包裹里是所要传递的数据

1、DatagramPacket(byte[] buf,int length):以一个字节数组来创建DatagramPacket对象,该对象的作用是接收DatagramSocket中的数据。相当于一个缓冲池的作用

2、DatagramPacket(byte buf[], int offset, int length) {} :一个字节的数组来创建DatagramPacket对象,其中 int offset 代表偏移量,int length代表长度(也可以说是池子的容量)

3、 DatagramPacket(byte buf[], int offset, int length, InetAddress address, int port) :创建一个用于发送的DatagramPacket对象,指定发送buf数组中从offset开始,总共length个字节。

4、DatagramPacket(byte[] buf, int length, InetAddress addr, int port):以一个包含数据的数组来创建DatagramPacket对象,创建该DatagramPacket对象时还指定了IP地址和端口--这就决定了该数据报的目的地。

利用DatagramPacket和Datagramsocket简单实现服务器和客户端的通信

1、创建客户端

1)创建客户端 DatagramSocket 类+指定端口

2)准备数据 字节数组

3) 打包 DatagramPacket +服务器地址 以及端口

4) 发送

5) 释放资源

2、服务器端

1)创建服务器 DatagramSocket 类+指定端口

2)准备接受的容器 字节数组 封装 DatagramPacket

3)包接收资源

4) 分析

5) 释放资源 简单来说就是服务器先挖一个DatagramPacket的邮箱,时刻准备着接受邮件,客户端这边准备好所要邮寄的东西,写好所要邮寄的地址(DatagramPacket+服务器地址+端口)不然邮递员不知道把邮件往那发送。

img

import java.io.IOException;
import java.net.*;

/**
 * 发送数据到客户端
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket对象
        DatagramSocket socket = new DatagramSocket(5000);
        //定义缓存
        byte[] buffer = new byte[1024];
        //创建DatagramPacket对象
        DatagramPacket receivePacket = new DatagramPacket(buffer, 0, buffer.length);
        //接收数据报,存储到DatagramPacket
        socket.receive(receivePacket);
        //获取DatagramPacket对象对应的数据
        String s = new String(receivePacket.getData(), 0, receivePacket.getLength());
        //ip地址和窗口
        String hostAddress = receivePacket.getAddress().getHostAddress();
        int port = receivePacket.getPort();
        //打印
        System.out.println(hostAddress + ":" + port + "发送来的数据为:" + s);
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Client {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket对象
        DatagramSocket socket = new DatagramSocket(3456);
        //数据要发送的字节数组
        byte[] data = "hello world".getBytes();
        //接收者的IP地址 对应的InetAddress对象
        InetAddress address = InetAddress.getByName("127.0.0.1");
        //接收者的端口
        int port = 5000;
        //创建DatagramPack(数据报)
        DatagramPacket sendPacket = new DatagramPacket(data, 0, data.length, address, port);
        //发送
        socket.send(sendPacket);
        System.out.println("数据发送完毕");
    }
}

 

UDP协议通讯的用户状态跟踪

1、和Socket不同,UDP是一个典型的非状态协议(即UDP通讯的两个节点无法获取对方的在线状态),因此在实时通讯领域判定客户端是否掉线就不及Socket方式方便(Socket方式通讯时一端掉线另一端会直接抛出异常)

2、在这种情况下,服务器要想获取客户端的在线信息就需要完成定期问询,如果在规定时间内能够得到客户端自动反馈的问询结果则说明客户端依旧在线,反之则客户端离线(即心跳信息)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UDP通讯 的相关文章

  • 如何设置Winsock UDP套接字?

    我想创建一个仅向客户端发送数据的 Winsock UDP 套接字 我希望内核为我选择一个可用的端口 另一方面 我想指出要使用哪个本地 IP 因为我正在运行一些网卡 我尝试过梳理迷宫般的套接字选项 以及将套接字地址中的端口绑定设置为 0 但均
  • 具有多个接口的 Python UDP 套接字

    我正在 Windows XP 机器上用 python2 7 编写脚本 本机使用不同的网卡连接到多个网络 我遇到了一个问题 我已将 UDP 套接字绑定到特定接口 我知道您可以通过仅提供网卡现有的 IP 地址来在 Windows 中完成此操作
  • NodeJS UDP 多播如何

    我正在尝试将 UDP 多播数据包发送到 230 185 192 108 以便每个订阅的人都会收到 有点卡住了 我相信它的广播正确 但似乎无法从任何客户端获取任何信息 Server var news Borussia Dortmund win
  • 接收来自 N 个客户端的响应,以回复通过 UDP 的广播请求

    我正在为特定类型的网络多媒体设备实现一种 IP 查找器 我想找出 LAN 中该类型的所有活动设备及其 IP 地址和其他详细信息 设备有自己的设备发现方式 其工作原理如下 客户端通过 UDP 通过 LAN 发送广播请求 目的端口号是固定的 作
  • UDP sendto 上的 ECONNREFUSED 错误

    我在使用正在写入的应用程序时遇到一些无法解释的行为 使用 sendto 向多个端口发送 UDP 数据 所有端口均使用套接字 PF INET SOCK DGRAM 0 为了一组客户端读取进程的利益 这些 sendto 偶尔会不可预测地触发经济
  • 搜索所有网络上的设备

    我想实现一个代码 通过它我可以列出网络上连接的 upnp 兼容媒体渲染器设备 我用谷歌搜索了这个并找到了以下代码扭曲的网站 https twistedmatrix com documents current core howto udp h
  • C# 广播是UDP消息,监听多个回复

    我正在尝试编写一些执行 UDP 广播的代码 然后侦听来自远程服务器的答复 说明它们存在 它用于识别子网上运行服务器应用程序的计算机 因此基本上会发出 谁在那儿 并听取所有答复 我在 Java 中有这个 工作完美 它将 DatagramPac
  • iOS 14 在进行本地网络广播时给出“操作系统错误:错误的文件描述符,errno = 9”

    做一点Jeopardy 风格问答 https stackoverflow blog 2011 07 01 its ok to ask and answer your own questions here 我正在 Flutter 中开发一个应
  • VS2015:应用程序无法正确启动(0xc000007b)

    我在 Visual Studio 2015 上为 Windows 10 PC 编写了代码 该应用程序主要关注 UDP 通信 我使用 boost 库 它工作正常 但当我将代码文件夹移至 Windows 7 时 我收到错误 应用程序无法正确启动
  • 互联网上的 UDP 多播?

    我不确定如何最好地解决我的问题 我有一个在远程计算机上运行的服务 用于接收和处理 UDP 数据包 我希望该服务能够将这些数据包重新发送给任何需要它们的人 可能是任何人 通常是一台机器 但也可能更多 我认为 UDP 多播将是理想的 该服务可以
  • C++ UDP Socket端口复用

    如何在 C 中创建客户端 UDP 套接字 以便它可以侦听另一个应用程序正在侦听的端口 换句话说 如何在 C 中应用端口复用 我只想监听一个端口 您可以使用嗅探器来做到这一点 只需忽略来自不同端口的数据包即可 我可能需要阻止它发送一些特定的数
  • F1 2019 UDP解码

    我目前正在为 F1 方向盘开发自己的显示器 F1 2019 由codemasters提供 通过UDP发送数据 该数据存储在字节数组中 我在解码返回的数组时遇到一些问题 问题是我得到了很多信息 但我不知道如何处理它们 我将向您介绍我所尝试过的
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • recvfrom() 中的 addrlen 字段有何用途?

    我在程序中使用 recvfrom 从我在 src addr 中指定的服务器获取 DGRAM 数据 但是 我不确定为什么需要初始化并传入addrlen 我读了手册页 但不太明白它的意思 如果src addr不为NULL 并且底层协议提供了源地
  • 如何将udp发送到udp node.js服务器?

    我对此很陌生 所以我真的不知道我在做什么 但我已经设置了一个 node js udp 服务器 我想从客户端 来自网站 向它发送一个数据包 但我不知道如何在 javascript 中做到这一点 或者是否可能 我不是在研究如何从 Node js
  • 使用多个 NIC 广播 UDP 数据包

    我正在 Linux 中为相机控制器构建嵌入式系统 非实时 我在让网络做我想做的事情时遇到问题 该系统有 3 个 NIC 1 个 100base T 和 2 个千兆端口 我将较慢的连接到相机 这就是它支持的全部 而较快的连接是与其他机器的点对
  • 如何从 DatagramPacket 中检索字符串[重复]

    这个问题在这里已经有答案了 下面的代码打印 B 40545a60 B 40545a60abc exp 但我想打印abc 以便我可以从接收系统检索正确的消息 public class Operation InetAddress ip Data
  • 用于实时传输协议的开源 .net C# 库

    net中有好的RTP开源库吗 我的目的是用于音频和视频同步问题并提高每秒帧数速率 我对 RTP 不太了解 但你可能想看看本文 http www codeproject com KB IP Using RTP in Multicasting
  • 跨 NAT 的 UDP 客户端无法从服务器接收数据

    我正在尝试在服务器 在公共 IP 上 和客户端 跨 NAT 之间使用 UDP 进行双向通信 我的逻辑是 如果服务器将一些数据发送到 IP 和它接收数据包的端口 客户端仍然应该收到它 因为 NAT 将具有最终将数据包发送到客户端的映射 客户端
  • boost 是否有可移植的方式来使用 ntohl/htonl/ntohs/htons 类型函数?

    我正在使用 UDP 特别是 boost asio ip udp socket 套接字 如果有帮助的话 头文件是什么 我需要哪些标头 类来处理 UDP 提升下的网络字节排序 刚刚发现就足够了 include

随机推荐

  • vector容器存放自定义数据类型及指针

    include lt iostream gt using namespace std include lt vector gt class person public person string a int b name a age b s
  • unreal 启动报错:运行引擎需要D3D11兼容GPU(功能级别11.0,着色器模型5.0)处理

    问题 AMD核显电脑 xff0c 突然有一天开机后显示器显示效果发白 xff0c 刚开始没在意 xff0c 后来某天想使用Unreal时发现启动不了了 xff0c 弹窗报错 xff1a 运行引擎需要D3D11兼容GPU xff08 功能级别
  • Win10 RealSense L515 ORBSLAM2 配置全攻略

    目录 背景简介Step 1 准备 SDKStep 2 连接设备Step 3 测试例程Step 4 配置环境Step 5 相机标定Step 6 编写入口Step 7 实地运行附录A xff1a 获取内参代码附录B xff1a yaml 参数文
  • rviz仿真底盘移动与云台击打

    rviz仿真底盘移动与云台击打 底盘与云台通过坐标轴来模拟 xff0c 目标方块与子弹可视化通过marker仿真 其中底盘与云台固连 xff0c 底盘xy方向移动云台会同步移动 xff0c 云台可进行pitch和yaw轴旋转 xff0c 通
  • 机器视觉中坐标系转换

    机器视觉 立体视觉等等方向常常涉及到四个坐标系 xff1a 世界坐标系 相机坐标系 图像坐标系 像素坐标系 整体预览如下 1 世界坐标系和相机坐标系 世界坐标系 xff0c 也称为测量坐标系 xff0c 它是一个三维直角坐标系 Xw Yw
  • 机械臂DH参数总结

    DH参数 DH参数 xff08 Denavit Hartenberg parameters xff09 是一个用四个参数表达两对关节连杆之间位置角度关系的机械臂数学模型和坐标系确定系统 DH选的四个参数都的含义如下 xff1a link l
  • 机器人正解和逆解

    正解FK 给定机器人各关节的角度 xff0c 计算出机器人末端的空间位置 逆解IK 已知机器人末端的位置和姿态 xff0c 计算机器人各关节的角度值 挖个坑待完善
  • LeetCode—232 用栈实现队列 Cpp&Python

    LeetCode 225 用队列实现栈 Cpp amp Python 一 方法与思路二 C 43 43 代码三 Python代码 一 方法与思路 使用栈实现队列的下列操作 xff1a push x 将一个元素放入队列的尾部 pop 从队列首
  • E: Unable to locate package解决办法

    问题 xff1a E Unable to locate package 解决 xff1a sudo apt span class token operator span get updade
  • Yolo框架简介

    YOLO xff08 You Only Look Once xff09 是一种基于深度神经网络的对象识别和定位算法 xff0c 其最大的特点是运行速度很快 xff0c 可以用于实时系统 现在YOLO已经发展到v4版本 论文地址 xff1a
  • Ubuntu下编辑权限只读文件的方法

    首先要注意的是只读文件一般都是系统文件 xff0c 或者软件配置文件 xff0c 修改时要尤其谨慎 本文提供两种方法 xff1a 方法一 首先安装一个插件 span class token function sudo span apt sp
  • Ros下Aruco模块的使用

    生成ARUCO ROS MARKER 链接 http chev me arucogen 首先启动ros roscore 打开相机节点 xff0c 在此提供usb相机与Realsense D435i的启动方法 xff1a roslaunch
  • 脚气、灰指甲治疗实验方案

    脚气 xff08 已临床实验 xff09 脚气 xff0c 又叫足廯 香港脚 糜烂性脚气 症状 xff1a 80 都是这种类型 常见于多汗人群 角质层被汗水浸软 xff0c 发白了以后 xff0c 走动不断摩擦表皮脱落 xff0c 露出鲜红
  • VS2015显示“正在从以下位置加载符号“的解决办法

    解决方法 xff1a VS 工具 选项 调试 符号 看到 MicroSoft符号服务器 xff0c 去掉方框中的 xff0c 确定即可 xff0c 之后就不会再调试时加载
  • 【面包】STM32学习笔记(二) --- USART 串口通信学习总结

    tip xff1a 如有错误 xff0c 希望指出 xff0c 非常感谢 xff01 目录 简介一 USART是什么 xff1f 二 问答通信方式1 USART和UART区别2 单工 半双工 全双工区别 三 代码实验1 说明2 代码初始化配
  • [论文阅读笔记] Reciprocal n-body Collision Avoidance(ORCA/RVO2)

    论文阅读 Reciprocal n body Collision Avoidance ORCA RVO2 文章目录 论文阅读 Reciprocal n body Collision Avoidance ORCA RVO2 论文地址Intro
  • 在VSCode中搭建C++编译环境

    在VSCode中搭建C 43 43 编译环境 VSCode当中搭建C 43 43 环境下载VSCode下载MinGW配置文件撰写测试小程序 VSCode当中搭建C 43 43 环境 vscode作为一款轻量级编程软件深受编程人员喜爱 xff
  • 【C++学习笔记】头文件详解

    个人整理学习用 xff0c 非教材 xff0c 有错误欢迎指正 头文件 究竟什么是头文件 xff1f 首先说明一个概念 xff0c 所谓的文件后缀并不是必须的 xff0c 在Linux下这种特点尤为明显 对于编译器来说 xff0c 无论是
  • 编程实现字符串连接函数strcat()

    按如下函数原型编程实现字符串连接函数strcat 的功能 void MyStrcat char dstStr char srcStr 输入提示信息 xff1a Input a string Input another string 输入字符
  • UDP通讯

    目录 利用DatagramSocket发送和接收UDP数据报 DatagramPacket构造方法说明 利用DatagramPacket和Datagramsocket简单实现服务器和客户端的通信 UDP协议通讯的用户状态跟踪 利用Datag