目录

UDP 简 介

通信示例

接收端

发送端

网络编程


UDP 简 介

1、UDP 是一种高速,无连接的数据交换方式,UDP 传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说 UDP 是无连接的、不可靠的一种数据传输协议

2、UDP( User Datagram Protocol ) 用户数据报协议,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

3、因为不必进行收发数据的确认,所以 UDP 的实时性更好,传输速率更高。有时候速度比数据完整性重要,在比如视频会议、电话通信等,丢失几帧画面、声音是可以接受的,但在需要数据安全接受的环境下,就宜采用TCP

4、在网络质量令人不十分满意的环境下,UDP 协议数据包丢失会比较严重。但是由于它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用 UDP 较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

5、Java 中使用 UDP 编程主要使用 java.net 包下的 DatagramSocket 和 DatagramPacket 类

6、可以参考《TCP 理论详解》

通信示例

接收端

1)使用 DatagramSocket(int port) 建立socket(套间字)服务,必须指定监视的 port

2)定义数据报包(DatagramPacket),用于储存接收到的数据

3)通过 DatagramSocket 的 receive 方法将接收的数据存入上面定义的包中

4)使用 DatagramPacket 的 getData 方法,提取数据

5)DatagramPacket 关闭资源

package com.lct.udp;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.Charset;
import java.util.Date;/*** Created by Administrator on 2018/10/14 0014.* UDP 接收端*/
public class UdpServer {public static void main(String[] args) {udpReceive();}/*** Udp 监听端口数据*/public static void udpReceive() {DatagramSocket datagramSocket = null;/** 数据接收大小设置为1024字节,超出部分是接收不到的*/byte[] buffer = new byte[1024];DatagramPacket datagramPacket;try {/*** DatagramSocket(int port, InetAddress laddr):创建一个DatagramSocket实例,并将该对象绑定到指定IP地址、指定端口。* DatagramSocket(int port):创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、指定端口。* */datagramSocket = new DatagramSocket(8080);datagramPacket = new DatagramPacket(buffer, buffer.length);/*** setSoTimeout(int timeout):设置 DatagramSocket 的 receive(DatagramPacket p) 方法* 阻塞监听端口时的超时时间,单位毫秒,* 当 receive 方法阻塞监听端口超过指定的时间时,抛出异常:java.net.SocketTimeoutException: Receive timed out*//*datagramSocket.setSoTimeout(60 * 1000);*//** 接收端循环监听*/while (true) {System.out.println(new Date() + " :开始监听端口" + Thread.currentThread().getName());/**阻塞监听端口*/datagramSocket.receive(datagramPacket);/**读取数据*/String message = new String(datagramPacket.getData(), 0, datagramPacket.getLength(), Charset.forName("UTF-8"));System.out.println("监听到数据:" + message);}} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {/**如果发送异常,关闭操作*/if (datagramSocket != null) {if (!datagramSocket.isConnected()) {datagramSocket.disconnect();}if (!datagramSocket.isClosed()) {datagramSocket.close();}}}}
}

发送端

1)使用 DatagramSocket 建立 socket(套间字)服务,可以指定端口,也可让它自动分配

2)将数据打包到 DatagramPacket 中

3)通过 socket 服务发送打包好的 DatagramPacket(send() 方法

4)socket 服务关闭资源

package com.lct.udp;import java.io.IOException;
import java.net.*;/*** Created by Administrator on 2018/10/14 0014.* Udp 发送端*/
public class UcpClient {public static void main(String[] args) {/*** 使用 3 个线程发送消息,模拟 多个客户端操作*/for (int i = 0; i < 3; i++) {new Thread() {@Overridepublic void run() {sendUdpMessage();}}.start();}}/*** 发送 Udp 消息*/public static void sendUdpMessage() {DatagramSocket datagramSocket = null;try {/** 实例化数据报套接字*/datagramSocket = new DatagramSocket();/**将被发送的数据转为字节数组,同时指定编码*/String msg = "修长城的民族!" + Thread.currentThread().getName();byte[] msgBytes = msg.getBytes("UTF-8");/** InetAddress:指定 UDP 接收端的 IP 地址*/InetAddress inetAddress = InetAddress.getByName("192.168.1.20");/*** DatagramPacket(byte buf[], int length,InetAddress address, int port)*      buf[]:被发送的数据*      length:指定 buf[] 中 [0,length]的数据进行发送*      address:udp 接收端的地址*      port:udp 接收端监听的端口*/DatagramPacket datagramPacket = new DatagramPacket(msgBytes, msgBytes.length, inetAddress, 8080);/**发送数据*/datagramSocket.send(datagramPacket);System.out.println("消息发送结束..............." + Thread.currentThread().getName());} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {/**操作结束,释放 datagramSocket,并关闭*/if (datagramSocket != null) {if (!datagramSocket.isConnected()) {datagramSocket.disconnect();}if (!datagramSocket.isClosed()) {datagramSocket.close();}}}}
}

udp 接收端输出如下:

Sun Oct 14 11:43:40 CST 2018 :开始监听端口main
监听到数据:修长城的民族!Thread-0
Sun Oct 14 11:43:42 CST 2018 :开始监听端口main
监听到数据:修长城的民族!Thread-1
Sun Oct 14 11:43:42 CST 2018 :开始监听端口main
监听到数据:修长城的民族!Thread-2
Sun Oct 14 11:43:42 CST 2018 :开始监听端口main

udp 发送端输出如下:

消息发送结束...............Thread-1
消息发送结束...............Thread-0
消息发送结束...............Thread-2

网络编程

  • 技术日新月异,目前网络编程最为流行的当属 Netty,Java 网络编程发展历程:

JDK 1.4 以前:java.net + java.io——即平时所使用的简单的 TCP 、UDP 编程

JDK 1.4 及以后:java.nio

当下流行:JBoos 的 Netty 库、Apache 的  Mina 等

  • 如下所示的《Netty 权威指南》下载地址:https://download.csdn.net/download/wangmx1993328/10717896

UDP 理论概述与编码入门相关推荐

  1. 视频编码零基础入门(1):视频编解码之理论概述

    1.前言 即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙.原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的.有关 ...

  2. 视频编解码之理论概述 和即时通信

    前言 即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙.原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的.有关实时 ...

  3. Docker基本理论概述

    < Docker基本理论概述 > 关于Docker 1.为什么要使用 Docker ? 项目从开发到上线,从操作系统,到运行环境,再到应用的详细配置.作为开发工程师与运维工程师之间的协作, ...

  4. 【Applied Algebra】可满足性模理论(Satisfiability Modulo Theories)入门

    [Applied Algebra]可满足性模理论(Satisfiability Modulo Theories)入门 摘要:SMT问题是在特定理论下判定一阶逻辑公式可满足性问题.它在很多领域,尤其是形 ...

  5. 【信息论是什么?信息,消息和信号?】信息论与编码入门(一)

    信息论与编码入门(一) 写在前面的话 信息论的研究目的 信息的定义 点对点通信系统模型 信息,消息和信号 什么是信息 不确定性(信息量)的定性和定量描述 完善通信系统模型 编码器 写在前面的话 书:& ...

  6. 数据结构与算法理论概述

    数据结构与算法理论概述 文章目录 数据结构与算法理论概述 数据结构概述 ◆ 数据结构涵盖的内容 ◆ 存储数据 算法概述 ◆ 算法的基本特性 ◆ 算法设计要求 ◆ 算法分析 数据结构概述 狭义上:数据结 ...

  7. Spring Cloud 基本理论概述

    前言 万丈高楼平地起,但还有种说法叫:"万事开头难",不管使用什么技术,就算是行业老司机,也得乖乖的从基本理论概述开始.通过本篇文章,您将理解什么是 Spring Cloud ?S ...

  8. Linux负载均衡解决方案 -- LVS 理论概述

    Lvs 理论概述 一.什么是 LVS ? 二.为什么需要 LVS ? 三.LVS 原理 1.LVS 体系结构 2.LVS 工作模式 3.LVS 调度算法 四.LVS 工作方式 1.LVS-DR 模式 ...

  9. 计算机网络-传输层(传输层概述,TCP,UDP协议概述)

    文章目录 1. 传输层概述 2. TCP,UDP协议概述 3. 传输层的寻址与端口 1. 传输层概述 传输层是只有主机才有的层次. 传输层功能: 传输层提供进程和进程之间的逻辑通信. 网络层提供主机到 ...

  10. logback(一)理论概述

    参考文章直达车 logback的官方网站: http://logback.qos.ch SLF4J的官方网站:http://www.slf4j.org logback(一)理论概述 logback(二 ...

最新文章

  1. 配置化的版本更新引导怎么做?
  2. 文本转换成htmldocument
  3. 5个编码技巧以减少GC开销
  4. 进程共享(读时共享写时复制)
  5. 令人惊讶的手机端实时 4K 风格迁移!谷歌又出牛文
  6. JavaScript:时间戳(timestamp)与时间(Date)转换
  7. js知识梳理1:理解对象的属性特性
  8. android ndk官网下载地址,android ndk下载
  9. 【数字水印】图像数字水印技术-含Matlab Gui界面-含文档【0100期】
  10. 淘宝SKU组合查询算法实现
  11. 总结十八:程序员激励办法——激励理论
  12. 2011年很美的118句话
  13. ssd [Error] UnicodeDecodeError: 'gbk' codec can't decode byte 0x81 in position【已解决】
  14. pandas的数据拼接与合并(concat、join、merge)
  15. 计算机管理恢复分区,Win10硬盘新增的恢复分区是什么?
  16. 安装r 源代码 linux,在RStudio中从源代码安装R软件包时遇到问题-Ubuntu 16.04
  17. OceanBase分区
  18. Rust:Trait 详解
  19. 熬夜的T哥们T姐们注意了
  20. Browsers Series_2_Firefox

热门文章

  1. DataSet如何处理海量数据
  2. P ⊆ co-NP的原因
  3. 牛顿法为什么比梯度下降法求解需要的迭代次数更少?
  4. python怎么恢复默认窗口,如何恢复python编程环境spyder的窗口
  5. 教育局查询2021年高考成绩,关于广东省2021年普通高考英语听说考试成绩发布有关事宜的通知...
  6. iapp退出软件按钮代码_还在为金蝶财务软件发愁吗?超详细!金蝶财务软件实操流程,速收...
  7. 【视频】时间序列分析:ARIMA-ARCH / GARCH模型分析股票价格
  8. 拓端tecdat|Python中的Apriori关联算法-市场购物篮分析
  9. 2020 【第十一届蓝桥杯省赛】 C/C++ B组 (第二场)
  10. 清华大学操作系统OS学习(十二)——信号量与管程