目录

一.学习UDP的预备知识

1.熟悉网络通信中的五元组

(1)源IP地址和目的IP地址

(2)源端口号和目的端口号

(3)协议号

2.什么是客户端和服务端

二.socketAPI中UDP的使用

1.UDP在socket中使用的类和方法

2.使用DatagramSocket类实现一个简单的单词翻译程序(包含客户端和服务端)

(1)图示

(2)代码实现

(3)运行结果

三.UDP协议详情

1.UDP的协议端格式

2.UDP的特点

3.了解基于UDP的一些应用层协议


一.学习UDP的预备知识

1.熟悉网络通信中的五元组

(1)源IP地址和目的IP地址

确定发送消息的主机和接收消息的主机。

(2)源端口号和目的端口号

确定是该主机的哪个进程发送的消息和接收消息主机中的哪个进程。

端口号的划分:0~1023为知名端口号,有HTTP(80端口),HTTPS(443端口),FTP(21端口),SSH(22端口)等应用层协议。我们自己写程序时要避免知名端口号,以免发生异常。

1024~65535:操作系统动态分配的端口号,其中客户端的就是由操作系统从这个范围进行分配的。

其中一个进程可以绑定多个端口号,一个端口号不能被多个进程绑定

(3)协议号

发送消息的进程和接收的进程之间遵守的协议。

2.什么是客户端和服务端

二.socketAPI中UDP的使用

1.UDP在socket中使用的类和方法

其中使用到的类为DatagramSocket。常用的方法如下:

方法名 方法说明
DatagramSocket(int port,InetAddress laddr)  创建一个数据报套接字,绑定到指定的本地地址
DatagramSocket(SocketAddress bindaddr) 创建一个数据报套接字,绑定到指定的本地套接字地址
void bind(SocketAddress addr) 将此DatagramSocket绑定到特定的地址和端口
void connect(InetAddress address, int port)
 将套接字连接到此套接字的远程地址
void receive(DatagramPacket p) 从此套接字接收数据报包
void close()
 关闭此数据报套接字
void send(DatagramPacket p)
 从此套接字发送数据报包

在使用DatagramSocker中的数据是以数据报为单位进行发送的。

使用该类来进行发送数据报,这里使用到了以下两个构造器。

2.使用DatagramSocket类实现一个简单的单词翻译程序(包含客户端和服务端)

(1)图示

(2)代码实现

客户端:

这里还用到InetAddress 类下的一个静态方法

package javaweb.udptcp2.udp;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;public class UDPClient {DatagramSocket socket = null;String serverIp = null;int serverPort;//客户端的端口号不需要进行绑定,由系统自动分配public UDPClient(String serverIp, int serverPort) throws SocketException {socket = new DatagramSocket();this.serverIp = serverIp;this.serverPort = serverPort;}//启动客户端(这里使用循环可以一直输入请求)public void start() throws IOException {System.out.println("客户端启动");//使用scanner来输入请求Scanner sc = new Scanner(System.in);while (true) {String request = sc.nextLine();//退出客户端if("exit".equals(request)) {break;}//构造要发送的数据报(这里将字符串数据转化为二进制来进行发送)//InetAddres.getName()是确定主机名称的IP地址DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIp), serverPort);//将构造好的数据报发送给指定的客户端socket.send(requestPacket);//以数据报的形式接收服务端的请求DatagramPacket responPacket = new DatagramPacket(new byte[4096],4096);socket.receive(responPacket);//将接收到的消息转化为字符串(使用trim是去除字符串的前后空格)String respons = new String(responPacket.getData(),0,responPacket.getLength()).trim();//将得到的响应打印到控制台上System.out.println(respons);}}//启动客户端public static void main(String[] args) throws IOException {//这里的ip是本机的回环ipUDPClient client = new UDPClient("127.0.0.1",9090);client.start();}
}

服务端:

package javaweb.udptcp2.udp;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;//实现一个简单的英文翻译的服务端
public class UDPServer {DatagramSocket socket = null;//保存单词Map<String, String> words = new HashMap<>();//给服务端需要绑定端口号public UDPServer(int port) throws SocketException {socket = new DatagramSocket(port);words.put("猫","cat");words.put("狗","dog");words.put("鱼","fish");}//启动服务端public void start() throws IOException {System.out.println("服务端已经启动");while (true) {//接收客户端发来的请求DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);String request = new String(requestPacket.getData(),0,requestPacket.getLength()).trim();//根据请求构造响应String respons = process(request);//将响应数据发送给客户端DatagramPacket responsPacket = new DatagramPacket(respons.getBytes(),respons.getBytes().length,requestPacket.getSocketAddress());socket.send(responsPacket);//将服务端端发送给哪个客户端的数据输出到控制台上System.out.printf("[%s:%d]; request:%s  respons:%s\n",requestPacket.getAddress().toString(),requestPacket.getPort(), request, respons);}}//计算出的响应private String process(String request) {if(words.containsKey(request)) {return words.get(request);} else {return "未找到";}}//启动服务端public static void main(String[] args) throws IOException {UDPServer server = new UDPServer(9090);server.start();}
}

注意:这里数据报中的缓冲区是自己设置大小的,如果发送的数据超过缓冲区的大小则会自动截断,所以这里的大小需要自己配置。

(3)运行结果

三.UDP协议详情

1.UDP的协议端格式

协议格式详解图:

2.UDP的特点

  1. 无连接:知道对端的IP和端口号就直接进行传输, 不需要建立连接。
  2. 不可靠:没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息。
  3. 面向数据报:不能够灵活的控制读写数据的次数和数量。对于UDP传输,发送端如果发送了100字节的数据,那么接收端必须也一次接受100字节的数据,不能分开进行接收。
  4. 只有接收缓冲区没有发送缓冲区(发送缓冲区主要用于超时重传)。
  5. 大小受限,UDP所能传输数据的最大长度为64K。

3.了解基于UDP的一些应用层协议

  • NFS: 网络文件系统
  • TFTP: 简单文件传输协议
  • DHCP: 动态主机配置协议
  • BOOTP: 启动协议(用于无盘设备启动)
  • DNS: 域名解析协议

传输层中UDP的深入理解以及socket中UDP的使用相关推荐

  1. 计算机网络基础(传输层和它的两个朋友TCP、UDP)(传输层【上】)

    目录 UDP和TCP UDP UDP首部 TCP TCP报文段的首部格式 TCP的三次握手和四次挥手 传输层协议和应用层协议之间的关系 注意的网络安全 修改服务器默认端口 只开放必要端口 UDP和TC ...

  2. 带你一文看懂--应用层、传输层的协议,HTTP协议及实现,UDP和TCP的报文格式以及为什么3次握手和4次挥手

    网络基础:TCP/IP四层模型中的典型协议--理解网络通信的流程原理 应用层协议:负责应用程序之间的数据沟通 网络版计算器:客户端向服务端传递两个数字以及一个运算符,服务端收到数据进行解析得到数字与运 ...

  3. 【Attention】深度学习中的注意机制:理解序列模型中的注意机制How Attention works in Deep Learning

    [学习资源] How Attention works in Deep Learning: understanding the attention mechanism in sequence model ...

  4. 指针在c语言中的运用,怎么理解C语言中的指针,如何运用?

    恰好我之前写了一系列介绍 C 语言的文章,介绍了什么是指针,以及为什么要使用指针,下面摘录一部分,感兴趣的话,可以点我了解更多. 什么是 C语言指针? 不同的数据类型的主要区别在于占用的存储空间不同. ...

  5. 传输层协议TCP与UDP的区别

    TCP协议与UDP协议作为传输层最常用的两种传输协议,这两种协议都是使用IP作为网络层协议进行传输.网络层IP与传输层的关系可以简单理解成生活中收快递.IP协议为每个上网的主机分发一个IP地址,这个地 ...

  6. 传输层协议(TPC和UDP介绍)

    第五章.传输层协议介绍 文章目录 第五章.传输层协议介绍 一.TCP和UDP协议 二.TCP报文格式 三.TCP三次握手 四.TCP四次挥手 面试题1:为什么是三次握手而不是两次呢? 面试题2:为什么 ...

  7. 《图解TCP/IP》阅读笔记(第六章 6.5、6.6)——其他代表性的传输层协议与UDP、TCP首部

    6.5 其他传输层协议 实际上,UDP与TCP在很长的一段时间,霸占了"传输至尊榜"中的前两位,难以分出高下,但是仍有几款"神兵利器",被收入兵器榜前十位,接下 ...

  8. Day5:传输层概述、传输层服务、多路复用和解复用、无连接传输 UDP

    加油,偷博仔! 为了给学习增添一丝文艺美感,沉静一下学习的心境. 我买了一本朦胧主义的诗集<顾城的诗> 附几句干净.美好的诗句在开头. 树枝想要去撕裂天空, 却直戳了几个微小的窟窿, 它透 ...

  9. 前端工程师如何理解 TCP/IP 传输层协议?| 技术头条

    作者 | 浪里行舟 责编 | 郭芮 网络协议是每个前端工程师都必须要掌握的知识,TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP,本文将介绍下这两者以及它们之间的区别. TCP ...

最新文章

  1. DllMain中不当操作导致死锁问题的分析--死锁介绍
  2. pbewithmd5anddes算法 对应.net_文本相似度算法之-simhash
  3. 嵌入式深度学习运用的思路
  4. Effective C++学习第一天
  5. 为XNA制做安装程序(四)WIX Toolset 3.0 for Visual Studio 2008
  6. MySQL的basedir
  7. 如何在内存中创建文件供用户下载,而不是通过服务器下载?
  8. hdfs-大数据Week6-DAY2-2-hdfs
  9. Skype 1.4 for Linux 掉掉更新
  10. 语音信号处理的一些基础知识
  11. 狂神说Redis学习笔记
  12. 51单片机:P1口输入/输出实验1(控制发光二极管亮灭)
  13. seo知识技巧-关键词密度选取技巧
  14. 转载大牛对Microsoft的认识
  15. 文件存储名片java_java做的名片管理系统
  16. 为打印到OneNote中的PDF添加链接目录
  17. Matlab官方在线代码搜索网站,很多开源matlab代码
  18. android p 荣耀v10,荣耀V10和V9哪个好 区别对比分析告诉你
  19. arduino/Mixly使用LGT8F328P
  20. HTML5生日祝福网页代码

热门文章

  1. Deck.gl 相关
  2. ELK部署(filebeat+kafka+logstash+elasticsearch+kibana)
  3. 【C语言】rand()函数(如何生成指定范围随机数)
  4. SPSS R插件及PS Matching插件最详细简洁的安装经验
  5. MyBatis 动态 SQL,讲的很细
  6. 企业上云服务商之华山论剑
  7. mac系统如何更改用户名及头像
  8. Web自动化【selenium】基础知识
  9. 微信小程序 对象的深浅拷贝
  10. 数控服务器显示A49,FANUC 31i-A 附加轴(四轴)添加 实例讲解