文章目录

  • I UDP 交互原理
  • II UDP 服务器端代码示例
  • III UDP 客户端代码示例
  • IV 服务器 客户端 运行结果

I UDP 交互原理


1. UDP 单播传输流程 : A 给 B 发送数据包 , B 设备一定要处于监听 X 端口状态 , A 向 B 的 X 端口发送数据包 , B 才能收到 ; B 收到 A 的数据包后 , B 就知道了 A 的端口号 Z 的信息了 , 此时 B 可以向 A 的 Z 端口号发送数据包 ;

2. 局域网设备交互 : A 设备给局域网其它设备发送信息 , 并能接收到其它设备回送给 A 的信息 ;

3. 接收信息设备监听 X 端口 : 此时 A 作为客户端时 , 服务器需要接收 A 发送的数据包 , 服务器需要监听一个指定的接口 X , 那么如果 A 发送广播消息 , 监听 X 端口的服务器就会收到 A 发送的消息 ;

4. A 提前监听端口 Z : 如果服务器在收到消息后立刻向 A 的 Z 端口回送一个反馈信息 , 设备 A 需要在发送消息之前就监听 Z 端口 , 才能实现上述功能 ;

5. 持续交互 : A 不断向其它设备的 X 端口发送信息 , 其它设备可以不断反馈信息给设备 A 的 Z 端口 , 这样就实现了客户端与服务器端数据交互的功能 ;

II UDP 服务器端代码示例


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.ArrayList;public class UDPServer {public static void main(String[] args){System.out.println("服务器 开始运行");//开启接收数据的线程ReceiveThread receiveThread = new ReceiveThread();receiveThread.start();}/*** 服务器端监听客户端发送的信息*/private static class ReceiveThread extends Thread{/*** 是否继续监听 , 循环控制变量*/boolean isReceive = true;/*** 存储发送数据的客户端信息*/ArrayList<Client> clients = new ArrayList<>();@Overridepublic void run() {super.run();try {//I. 创建 DatagramSocket 对象 , 用于 UDP 数据包的发送和接收//1. UDP 数据包接收者 , 监听 8888 端口//      该 DatagramSocket 既可以接收数据包 , 也可以发送数据包DatagramSocket datagramSocket = new DatagramSocket(8888);//II. 接收 UDP 数据包 , 无限循环接收来自客户端的信息 , 并根据不同的信息进行不同处理while (isReceive){//2. 接收数据包使用的缓冲区byte[] receiveBuffer = new byte[256];//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);//退出服务器循环if("exit".equals(receiveData)){isReceive = false;}}} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {System.out.println("服务器 运行结束");}}}/*** 封装向服务器端发送数据的客户端信息* 主要是保存客户端的 IP 地址和端口号*/private static class Client{String ClientIP;String ClientPort;public Client(String clientIP, String clientPort) {ClientIP = clientIP;ClientPort = clientPort;}}}

III UDP 客户端代码示例


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
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 数据包套接字 , 客户端 ,//      监听 8889 端口 , 发送和接收数据包都使用该端口DatagramSocket datagramSocket = new DatagramSocket(8889);//II. 人机交互控制台阻塞获取用户输入//1. 获取控制台输入流InputStream is = System.in;//2. 该输入流会阻塞 , 等待用户控制台输入BufferedReader br = new BufferedReader(new InputStreamReader(is));// 循环控制变量 , 循环发送和接收 UDP 数据包boolean flag = true;while(flag){//3. 阻塞命令行 , 等待用户输入一行数据, 并存入 string 对象中String string = br.readLine();//III. 向服务器发送 UDP 数据包//1. 将字符串转为 byte[] 数组byte[] sendData = string.getBytes();//2. 创建发送数据包 , 需要传入的参数 1> 数据 2> 数据长度 3> 接收者的地址 4> 接收者的端口号//      向服务器端发送数据 , 发送的端口是自动分配的DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,InetAddress.getLocalHost(), 8888);//3. 将数据包发送出去datagramSocket.send(sendPacket);System.out.println("客户端 向服务器 : " +InetAddress.getLocalHost() + " : " + 8888 + " 发送的数据 : " + string);//4. 退出if("exit".equals(string)){flag = false;}//IV. 接收服务器反馈的 UDP 数据包//1. 接收数据包使用的缓冲区byte[] receiveBuffer = new byte[1024];//2. 接收 UDP 数据包使用的 DatagramPacket 对象DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);//3. 接收 UDP 数据包datagramSocket.receive(receivePacket);//4. 获取发送端的 IP 地址String sendIP = receivePacket.getAddress().getHostAddress();//5. 获取发送端的端口号int sendPort = receivePacket.getPort();//6. 获取接收到的数据的长度int receiveLen = receivePacket.getLength();//7. 获取接收到的数据 , 并转为字符串String receiveData = new String(receivePacket.getData(), 0, receiveLen);//8. 打印接收到的数据包信息System.out.println("客户端 接收到服务器端反馈信息 : " +sendIP + " : " + sendPort + " 发送的数据 : " + receiveData);}} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {System.out.println("客户端 运行结束");}}}

IV 服务器 客户端 运行结果


先运行服务器端 , 再运行客户端 ;

【Java 网络编程】UDP 服务器 与 客户端持续交互 案例相关推荐

  1. 【Linux】socket网络编程之服务器与客户端的数据交互

    [Linux]socket网络编程之服务器与客户端的数据交互 前言参考 argc !=2是什么意思 inet pton函数 对stdin,stdout 和STDOUT_FILENO,STDIN_FIL ...

  2. 关于JAVA网络编程UDP和TCP(上)

    对于JAVA的网络编程我们又称之为socket编程.首先,网络编程,顾名思义,要涉及到网络,其中网络协议是必不可少的对于我们而言,一个重要的网络协议是大家要会的:TCP/IP协议,udp协议. 一.网 ...

  3. Linux下TCP网络编程-创建服务器与客户端

    一.前言 互联网概念诞生于20世纪60年代末,从9几年中国接入互联网开始到现在,生活的每个角落都能看到网络的使用.现在物联网时代.共享经济的到来,生活中不仅仅电脑.手机可以接入网络,身边的各个设备也能 ...

  4. Java网络编程UDP编程

    一. 简单先介绍一下网络编程 1. 概念 : 通过网络IP连接起来,实现网络通信,数据传输的操作,就是网络编程 2. 实现 : 目前来说当前主要有两种实现的方法,TCP和UDP: 其中TCP需要划分客 ...

  5. QT网络编程——TCP服务器和客户端通信

    目录 一.服务器端 1.QT中TCP服务器的开发思路 2.QT服务器界面设计 3.QT服务器代码实现 二.客户端 1.QT中TCP客户端的开发思路 2.QT客户端界面设计 3.QT客户端代码实现 网络 ...

  6. java 网络编程 UDP TCP

    网络编程 网络编程主要用于解决计算机与计算机(手机.平板..)之间的数据传输问题. 网络编程: 不需要基于html页面就可以达到数据之间的传输. 比如: feiQ , QQ , 微信.... 网页编程 ...

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

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

  8. Java网络编程——UDP

    网络编程,UDP编程 网络编程 网络编程三要素 IP ipv4 ipv6 Java获取IP 端口 端口号 协议 UDP协议 TCP协议 UDP通信程序 发送步骤 接收步骤 单播 组播 广播 网络编程 ...

  9. java网络编程 UDP通信协议实现局域网内文件的发送和接收

    要实现两台内网下的机子进行通信,首先得知道接收方的内网IP,获取IP的方式:可以打开任务管理器的以太网进行查看: 如下 也可以通过 win+r 输入cmd ,然后输入 ipconfig  回车  进行 ...

最新文章

  1. 十一、Redis五大数据类型之三Set
  2. IE8 Beta2 AJAX 的更新篇之XDR(二)(IE8 Beta2 Hand-on Lab-XDR)
  3. python使用线性回归实现房价预测
  4. spring mvc学习(13)windows上安装maven
  5. php集成环境还需要mysql吗_是选择php集成环境好还是分开安装的原生版好
  6. 仿iReader-按menu键弹出PopupWindow布局界面
  7. html java简单示例,HtmlUnit的简单例子
  8. LeetCode-326. Power of Three
  9. as(四级考试频度很大的几个用法)
  10. 什么是SPA,有什么优缺点
  11. 全国书画艺术之乡-----通渭
  12. 强化学习综述(机器学习角度)
  13. 计算机打不开网络共享,电脑的网络和共享中心打不开,网络发现又没打开,..._网络编辑_帮考网...
  14. 小程序源码:修复图片音频全新升级带特效喝酒神器小游戏-多玩法安装简单
  15. 如何统一设置或者修改Excel表格中图表样式
  16. 基于MATLAB实现进制数转换
  17. 基因编辑相关最新研究进展(2022年12月)
  18. 【将金令】1.21早评:欧QE独占鳌头,金银高位不休
  19. bilibili用户信息爬虫(全网最全)
  20. 基于51单片机MAX487实现RS485多机通信protues仿真

热门文章

  1. 高并发之CAS机制和ABA问题
  2. 【Android Studio快捷键】之导入对应包声明(import packages)
  3. android studio 模拟器中文乱码
  4. 第一次做安卓项目使用的开源框架列表
  5. ViewState的使用
  6. ListView 排序
  7. C# 存储过程 分页
  8. ArcGis For Flex 之 QueryTask地理坐标展现【原创】
  9. ASP.NET 2.0 XML 系列(4):用XmlReader类介绍
  10. 2019.07.30 学习整理