文章目录

  • 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 接收数据包 | 端口号分配使用机制 )相关推荐

  1. 【Java——网络编程基础之客户端服务器连接】

    网络编程 1.1软件结构 1.2 网络通信协议 1.3 协议分类 1.4网络编程三要素 协议 IP地址 端口号 TCP通信程序 2.1 概述 2.2 Socket类 构造方法 成员方法 2.3 Ser ...

  2. java网络编程Socket实现客户端向服务端发送信息

    (可按目录按需阅读,我一般会整理的比较细) 前置知识 java IO Socket 什么是socket?socket字面意思其实就是一个插口或者套接字,包含了源ip地址.源端口.目的ip地址和源端口. ...

  3. Java网络编程——9.服务器Socket

    2019独角兽企业重金招聘Python工程师标准>>> 前一章从客户端的角度讨论了Socket,客户端就是向监听连接的服务器打开一个Socket的程序,不过如果不能与服务器对话,客户 ...

  4. java网络编程入门到精通

    Java网络编程从入门到精通(1):Internet地址概述 . Java网络编程从入门到精通(2):创建InetAddress对象的四个静态方法 . Java网络编程从入门到精通(3):为什么不能直 ...

  5. Java 网络编程 03 —— URL下载资源

    系列文章目录 Java 网络编程 01 -- Socket TCP通信 Java 网络编程 02 -- Socket UDP通信 Java 网络编程 03 -- URL下载资源 文章目录 系列文章目录 ...

  6. 【Java 网络编程】UDP 服务器 与 客户端持续交互 案例

    文章目录 I UDP 交互原理 II UDP 服务器端代码示例 III UDP 客户端代码示例 IV 服务器 客户端 运行结果 I UDP 交互原理 1. UDP 单播传输流程 : A 给 B 发送数 ...

  7. java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端

    //郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...

  8. Java——网络编程(UDP与TCP通信及实现聊天案例)

    目录 1.什么是网络通信协议? 2.TCP/IP协议 3.协议分类 3.1.UDP协议 3.2.TCP协议 4.网络编程三大要素 4.1.协议 4.2.IP地址 4.3.端口号 5.InetAddre ...

  9. 【Java 网络编程】UDP API 简介 ( DatagramSocket | DatagramPacket )

    文章目录 I DatagramSocket II DatagramSocket 构造方法 III DatagramSocket 数据操作 IV DatagramPacket V DatagramPac ...

最新文章

  1. mysql日常错误信息解决方法:InnoDB: and force InnoDB to continue crash recovery here.
  2. python绘制曲线图-python绘制多个曲线的折线图
  3. RHEL5下构建LVS负载均衡系统详解(二)
  4. hdu3697(贪心+暴力)
  5. typescript类型断言
  6. linux7怎么安装yum,centos7下怎么安装yum
  7. 充值后的充值金额提交到账户金额中
  8. left join on or 优化_pandas中merge/join有什么区别?
  9. 【To Understand!】LeetCode 117. Populating Next Right Pointers in Each Node II
  10. 华为悦盒EC6018V9E线刷linux教程
  11. ENVI实现最小距离法、最大似然法、支持向量机遥感图像监督分类与分类后处理操作
  12. labwindows mysql_LabWindows/CVI(二):基本代码框架函数说明
  13. 小学带计算机2000的检讨书,小学生检讨书范文
  14. 彻底清理该死的搜狗输入法
  15. MFC自制小游戏——躲避球(每日进度)
  16. 中国移动为挽留用户!推出20元不限量套餐,你会为之买单吗
  17. 太原理工大学 计算机专业课程,太原理工大学最全专业介绍
  18. Iterator 的用法
  19. “给阿姨倒杯卡布奇诺”广发卡分期积分带你免费畅饮星巴克!
  20. shell读取键盘输入

热门文章

  1. ESB与可插拨系统的思考
  2. 弹性盒子 flex-direction
  3. Keras Theano 输出中间层结果
  4. 一类SG函数递推性质的深入分析——2018ACM陕西邀请赛H题
  5. C语言第一次博客作业——输入输出格式
  6. 【转】webgame前台开发总结--虽然是10年的文章,但是也有参考价值
  7. JAVA中文字符串编码--GBK转UTF-8
  8. php 常用字符串函数
  9. 课后练习----实现窗口的切换
  10. navicat远程连接mysql10060