【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )
文章目录
- I UDP 信息发送接收原理
- II UDP 发送和接收端口相同
- III UDP 发送信息代码示例
- IV UDP 接收信息代码示例
- V UDP 服务器端代码示例
- VI UDP 客户端代码示例
- VII 客户端服务器端通信
I UDP 信息发送接收原理
1. UDP 既有客户端的功能 , 也有服务器端的功能 ;
2. UDP 发送和接收 : 计算机 A 向 计算机 B 的 X 端口发送消息 , B 不一定能接收到 , B 能收到并处理该消息的前提是 , B 当前正在监听 X 端口 ;
3. 发送设备个数 : B 监听 X 端口 , 并接收数据 , 向 B 发送信息的设备可以是多个 , B 可以接收到任何设备向其 X 端口发送的数据 ;
4. 端口号说明 : UDP 报文头 64 位 , 其中有发送源端口号 , 和接收的目标端口号 , 这个目标端口号是 X 端口号 , 发送源端口号是随机的动态端口号 ;
5. 相互通信 : B 收到消息时 , 才知道 A 设备发送消息的端口号 ; 如果 B 收到消息 , 然后马上向 A 的发送源端口号回送一条消息 , 如果 A 计算机正在监听这个端口号 , 就可以收到 B 计算机发送的消息 ; 如果 A 没有监听 , 那么收不到这个消息 ;
II UDP 发送和接收端口相同
UDP 发送和接收使用的是同一个端口 ;
UDP 发送和接收使用的是同一个端口 ;
UDP 发送和接收使用的是同一个端口 ;
重要的事情说三遍
III UDP 发送信息代码示例
1. 创建 DatagramSocket 对象 : 发送 UDP 数据包 , 首先要创建 DatagramSocket 对象 , 该对象可用于 UDP 数据包的发送和接收 , 创建时如果需要监听数据的接收 , 可以指定监听的端口 , 也可以等待系统自动分配一个端口 , 使用该端口进行数据的发送和接收 ;
2. 创建并设置 DatagramPacket 对象 : 发送的数据包实体是 DatagramPacket 对象 , 将目标设备的 IP 地址 , 端口号 , 发送的 byte[] 数组数据 , 设置到该数据包实体中 , 调用 DatagramSocket 对象的 send 方法 , 将该数据包发送出去 ;
3. 动态端口号自动分配 : 这里注意 , 发送的同时 , 系统自动分配了 一个动态端口号 , 该发送端口号就是接受端口号 , UDP 开始监听该端口号 , 意味着可以从该端口号接受数据包 , 服务器端就是接收到信息后 , 将反馈数据发送到该动态分配的端口中 ;
//I. 创建 DatagramSocket 对象 , 用于 UDP 数据包的发送和接收//1. UDP 数据包套接字 , 客户端 ,// 无需指定端口 , 让系统直接分配一个端口 , 使用该端口发送和接收数据DatagramSocket datagramSocket = new DatagramSocket();//II. 发送 UDP 数据包//2. 客户端发送给服务器端的端口号String sendMessage = "你好, 服务器 !";//3. 将字符串转为 byte[] 数组byte[] sendData = sendMessage.getBytes();//4. 创建发送数据包 , 需要传入的参数 1> 数据 2> 数据长度 3> 接收者的地址 4> 接收者的端口号// 向服务器端发送数据 , 发送的端口是自动分配的DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,InetAddress.getLocalHost(), 8888);//5. 将数据包发送出去datagramSocket.send(sendPacket);
IV UDP 接收信息代码示例
1. 创建 DatagramSocket 对象 : 接收 UDP 数据包 , 首先要创建 DatagramSocket 对象 , 注意必须设置一个监听的端口号 , 才能接收数据包 ;
客户端没有设置监听端口号 , 接收到了数据 , 是因为其先发送的数据 , 发送数据的同时 , 系统自动为其分配了一个动态端口号 , UDP 中发送和接收使用的是同一个端口号 , 在分配完该动态端口号之后 , 客户端就开始监听该端口号了 ;
2. 创建并设置 DatagramPacket 对象 : 接收的数据包实体是 DatagramPacket 对象 , 需要为其设置一个接收数据的缓冲区 , 接收到数据包后 , 系统会自动将发送信息的设备的 IP 地址 , 端口号 , 发送的 byte[] 数组数据 , 设置到该数据包实体中 , 调用 DatagramSocket 对象的 receive 方法 , 会阻塞等待数据包到来 ;
//I. 创建 DatagramSocket 对象 , 用于 UDP 数据包的发送和接收//1. UDP 数据包接收者 , 监听 8888 端口// 该 DatagramSocket 既可以接收数据包 , 也可以发送数据包DatagramSocket datagramSocket = new DatagramSocket(8888);//II. 接收 UDP 数据包//2. 接收数据包使用的缓冲区byte[] receiveBuffer = new byte[1024];//3. 接收 UDP 数据包使用的 DatagramPacket 对象DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);//4. 接收 UDP 数据包datagramSocket.receive(receivePacket);
V UDP 服务器端代码示例
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UDPServer {public static void main(String[] args){try {System.out.println("服务器 开始运行");//I. 创建 DatagramSocket 对象 , 用于 UDP 数据包的发送和接收//1. UDP 数据包接收者 , 监听 8888 端口// 该 DatagramSocket 既可以接收数据包 , 也可以发送数据包DatagramSocket datagramSocket = new DatagramSocket(8888);//II. 接收 UDP 数据包//2. 接收数据包使用的缓冲区byte[] receiveBuffer = new byte[1024];//3. 接收 UDP 数据包使用的 DatagramPacket 对象DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);//4. 接收 UDP 数据包datagramSocket.receive(receivePacket);//5. 获取发送端的 IP 地址String sendIP = receivePacket.getAddress().getHostAddress();//6. 获取发送端的端口号int sendPort = receivePacket.getPort();//7. 获取接收到的数据的长度int receiveLen = receivePacket.getLength();//8. 获取接收到的数据 , 并转为字符串String receiveData = new String(receivePacket.getData(), 0, receiveLen);//9. 打印接收到的数据包信息System.out.println("服务器 接收到 " + sendIP + " : " + sendPort + " 发送的数据 : " + receiveData);//III. 发送 UDP 数据包//10. 将接收到的数据长度回送给发送者String response = "服务器端 收到客户端发送的 " + receiveLen + " Byte 数据";//11. 将字符串转为 byte[] 数组byte[] responseData = response.getBytes();//12. 创建发送数据包 , 需要传入的参数 1> 数据 2> 数据长度 3> 接收者的地址 4> 接收者的端口号DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length,receivePacket.getAddress(), receivePacket.getPort());//13. 将数据包发送出去datagramSocket.send(responsePacket);System.out.println("服务器 向客户端 " + sendIP + " : " + sendPort + " 发送的数据 : " + response);} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {System.out.println("服务器 运行结束");}}}
VI UDP 客户端代码示例
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class UDPClient {public static void main(String[] args){try {System.out.println("客户端 开始运行");//I. 创建 DatagramSocket 对象 , 用于 UDP 数据包的发送和接收//1. UDP 数据包套接字 , 客户端 ,// 无需指定端口 , 让系统直接分配一个端口 , 使用该端口发送数据DatagramSocket datagramSocket = new DatagramSocket();//II. 发送 UDP 数据包//2. 客户端发送给服务器端的端口号String sendMessage = "你好, 服务器 !";//3. 将字符串转为 byte[] 数组byte[] sendData = sendMessage.getBytes();//4. 创建发送数据包 , 需要传入的参数 1> 数据 2> 数据长度 3> 接收者的地址 4> 接收者的端口号// 向服务器端发送数据 , 发送的端口是自动分配的DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,InetAddress.getLocalHost(), 8888);//5. 将数据包发送出去datagramSocket.send(sendPacket);System.out.println("客户端 向服务器 : " +InetAddress.getLocalHost() + " : " + 8888 + " 发送的数据 : " + sendMessage);//III. 接收 UDP 数据包//6. 接收数据包使用的缓冲区byte[] receiveBuffer = new byte[1024];//7. 接收 UDP 数据包使用的 DatagramPacket 对象DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);//8. 接收 UDP 数据包datagramSocket.receive(receivePacket);//9. 获取发送端的 IP 地址String sendIP = receivePacket.getAddress().getHostAddress();//10. 获取发送端的端口号int sendPort = receivePacket.getPort();//11. 获取接收到的数据的长度int receiveLen = receivePacket.getLength();//12. 获取接收到的数据 , 并转为字符串String receiveData = new String(receivePacket.getData(), 0, receiveLen);//13. 打印接收到的数据包信息System.out.println("客户端 接收到服务器端反馈信息 : " +sendIP + " : " + sendPort + " 发送的数据 : " + receiveData);} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {System.out.println("客户端 运行结束");}}}
VII 客户端服务器端通信
1. 服务器运行 : 先运行服务器 , 此时服务器开始监听 8888 端口 ,
2. 客户端发送信息 : 再运行客户端 , 客户端向服务器端的 8888 端口发送数据 , 客户端的发送端口是随机的 , 本次是 57660 端口 , 这是个动态分配端口 , UDP 的发送和接收端口是同一个端口 , 此时 UDP 开始监听该端口 ;
3. 服务器端反馈信息 : 服务器端收到客户端发送的数据 , 处理后将反馈数据再次发送回去 , 这里发送给客户端的 57660 端口 , 服务器端的发送端口就是 8888 端口 ;
UDP 发送和接收端口是同一个端口 ;
【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )相关推荐
- 【Java——网络编程基础之客户端服务器连接】
网络编程 1.1软件结构 1.2 网络通信协议 1.3 协议分类 1.4网络编程三要素 协议 IP地址 端口号 TCP通信程序 2.1 概述 2.2 Socket类 构造方法 成员方法 2.3 Ser ...
- java网络编程Socket实现客户端向服务端发送信息
(可按目录按需阅读,我一般会整理的比较细) 前置知识 java IO Socket 什么是socket?socket字面意思其实就是一个插口或者套接字,包含了源ip地址.源端口.目的ip地址和源端口. ...
- Java网络编程——9.服务器Socket
2019独角兽企业重金招聘Python工程师标准>>> 前一章从客户端的角度讨论了Socket,客户端就是向监听连接的服务器打开一个Socket的程序,不过如果不能与服务器对话,客户 ...
- java网络编程入门到精通
Java网络编程从入门到精通(1):Internet地址概述 . Java网络编程从入门到精通(2):创建InetAddress对象的四个静态方法 . Java网络编程从入门到精通(3):为什么不能直 ...
- Java 网络编程 03 —— URL下载资源
系列文章目录 Java 网络编程 01 -- Socket TCP通信 Java 网络编程 02 -- Socket UDP通信 Java 网络编程 03 -- URL下载资源 文章目录 系列文章目录 ...
- 【Java 网络编程】UDP 服务器 与 客户端持续交互 案例
文章目录 I UDP 交互原理 II UDP 服务器端代码示例 III UDP 客户端代码示例 IV 服务器 客户端 运行结果 I UDP 交互原理 1. UDP 单播传输流程 : A 给 B 发送数 ...
- java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端
//郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...
- Java——网络编程(UDP与TCP通信及实现聊天案例)
目录 1.什么是网络通信协议? 2.TCP/IP协议 3.协议分类 3.1.UDP协议 3.2.TCP协议 4.网络编程三大要素 4.1.协议 4.2.IP地址 4.3.端口号 5.InetAddre ...
- 【Java 网络编程】UDP API 简介 ( DatagramSocket | DatagramPacket )
文章目录 I DatagramSocket II DatagramSocket 构造方法 III DatagramSocket 数据操作 IV DatagramPacket V DatagramPac ...
最新文章
- mysql日常错误信息解决方法:InnoDB: and force InnoDB to continue crash recovery here.
- python绘制曲线图-python绘制多个曲线的折线图
- RHEL5下构建LVS负载均衡系统详解(二)
- hdu3697(贪心+暴力)
- typescript类型断言
- linux7怎么安装yum,centos7下怎么安装yum
- 充值后的充值金额提交到账户金额中
- left join on or 优化_pandas中merge/join有什么区别?
- 【To Understand!】LeetCode 117. Populating Next Right Pointers in Each Node II
- 华为悦盒EC6018V9E线刷linux教程
- ENVI实现最小距离法、最大似然法、支持向量机遥感图像监督分类与分类后处理操作
- labwindows mysql_LabWindows/CVI(二):基本代码框架函数说明
- 小学带计算机2000的检讨书,小学生检讨书范文
- 彻底清理该死的搜狗输入法
- MFC自制小游戏——躲避球(每日进度)
- 中国移动为挽留用户!推出20元不限量套餐,你会为之买单吗
- 太原理工大学 计算机专业课程,太原理工大学最全专业介绍
- Iterator 的用法
- “给阿姨倒杯卡布奇诺”广发卡分期积分带你免费畅饮星巴克!
- shell读取键盘输入