传输层中UDP的深入理解以及socket中UDP的使用
目录
一.学习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的特点
- 无连接:知道对端的IP和端口号就直接进行传输, 不需要建立连接。
- 不可靠:没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息。
- 面向数据报:不能够灵活的控制读写数据的次数和数量。对于UDP传输,发送端如果发送了100字节的数据,那么接收端必须也一次接受100字节的数据,不能分开进行接收。
- 只有接收缓冲区没有发送缓冲区(发送缓冲区主要用于超时重传)。
- 大小受限,UDP所能传输数据的最大长度为64K。
3.了解基于UDP的一些应用层协议
- NFS: 网络文件系统
- TFTP: 简单文件传输协议
- DHCP: 动态主机配置协议
- BOOTP: 启动协议(用于无盘设备启动)
- DNS: 域名解析协议
传输层中UDP的深入理解以及socket中UDP的使用相关推荐
- 计算机网络基础(传输层和它的两个朋友TCP、UDP)(传输层【上】)
目录 UDP和TCP UDP UDP首部 TCP TCP报文段的首部格式 TCP的三次握手和四次挥手 传输层协议和应用层协议之间的关系 注意的网络安全 修改服务器默认端口 只开放必要端口 UDP和TC ...
- 带你一文看懂--应用层、传输层的协议,HTTP协议及实现,UDP和TCP的报文格式以及为什么3次握手和4次挥手
网络基础:TCP/IP四层模型中的典型协议--理解网络通信的流程原理 应用层协议:负责应用程序之间的数据沟通 网络版计算器:客户端向服务端传递两个数字以及一个运算符,服务端收到数据进行解析得到数字与运 ...
- 【Attention】深度学习中的注意机制:理解序列模型中的注意机制How Attention works in Deep Learning
[学习资源] How Attention works in Deep Learning: understanding the attention mechanism in sequence model ...
- 指针在c语言中的运用,怎么理解C语言中的指针,如何运用?
恰好我之前写了一系列介绍 C 语言的文章,介绍了什么是指针,以及为什么要使用指针,下面摘录一部分,感兴趣的话,可以点我了解更多. 什么是 C语言指针? 不同的数据类型的主要区别在于占用的存储空间不同. ...
- 传输层协议TCP与UDP的区别
TCP协议与UDP协议作为传输层最常用的两种传输协议,这两种协议都是使用IP作为网络层协议进行传输.网络层IP与传输层的关系可以简单理解成生活中收快递.IP协议为每个上网的主机分发一个IP地址,这个地 ...
- 传输层协议(TPC和UDP介绍)
第五章.传输层协议介绍 文章目录 第五章.传输层协议介绍 一.TCP和UDP协议 二.TCP报文格式 三.TCP三次握手 四.TCP四次挥手 面试题1:为什么是三次握手而不是两次呢? 面试题2:为什么 ...
- 《图解TCP/IP》阅读笔记(第六章 6.5、6.6)——其他代表性的传输层协议与UDP、TCP首部
6.5 其他传输层协议 实际上,UDP与TCP在很长的一段时间,霸占了"传输至尊榜"中的前两位,难以分出高下,但是仍有几款"神兵利器",被收入兵器榜前十位,接下 ...
- Day5:传输层概述、传输层服务、多路复用和解复用、无连接传输 UDP
加油,偷博仔! 为了给学习增添一丝文艺美感,沉静一下学习的心境. 我买了一本朦胧主义的诗集<顾城的诗> 附几句干净.美好的诗句在开头. 树枝想要去撕裂天空, 却直戳了几个微小的窟窿, 它透 ...
- 前端工程师如何理解 TCP/IP 传输层协议?| 技术头条
作者 | 浪里行舟 责编 | 郭芮 网络协议是每个前端工程师都必须要掌握的知识,TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP,本文将介绍下这两者以及它们之间的区别. TCP ...
最新文章
- DllMain中不当操作导致死锁问题的分析--死锁介绍
- pbewithmd5anddes算法 对应.net_文本相似度算法之-simhash
- 嵌入式深度学习运用的思路
- Effective C++学习第一天
- 为XNA制做安装程序(四)WIX Toolset 3.0 for Visual Studio 2008
- MySQL的basedir
- 如何在内存中创建文件供用户下载,而不是通过服务器下载?
- hdfs-大数据Week6-DAY2-2-hdfs
- Skype 1.4 for Linux 掉掉更新
- 语音信号处理的一些基础知识
- 狂神说Redis学习笔记
- 51单片机:P1口输入/输出实验1(控制发光二极管亮灭)
- seo知识技巧-关键词密度选取技巧
- 转载大牛对Microsoft的认识
- 文件存储名片java_java做的名片管理系统
- 为打印到OneNote中的PDF添加链接目录
- Matlab官方在线代码搜索网站,很多开源matlab代码
- android p 荣耀v10,荣耀V10和V9哪个好 区别对比分析告诉你
- arduino/Mixly使用LGT8F328P
- HTML5生日祝福网页代码