当前位置: 首页 > news >正文

UDP数据报套接字编程

1.1UDP编程原理

          对于UDP协议来说,具有无连接,面向数据报的特征,即每次都是没有建立连接,并且一次发送全部数据报,一次接收全部的数据报。Java中使用UDP协议通信,主要基于DatagramSocket类来发送或接收数据报套接字,并使用DatagramPacket作为创建的UDP数据报,DatagramPacket类对象就是UDP协议中Socket的数据报。 

1.2 DatagramSocket API

DatagramSocket 是UDP Socket,用于发送和接收UDP数据报。

(1) DatagramSocket 构造方法:

(2)DatagramSocket 方法: 

1.3DatagramPacket类

(1)DatagramPacket构造方法

构造方法如下:

 

(2)DatagramPacket普通方法 

2.1服务器端代码

public class EchoServer {//服务器端//1、创建一个DatagramSocket对象DatagramSocket socket = null;public EchoServer(int port) throws SocketException {//服务器端需要自己指定端口号socket = new DatagramSocket(port);//这么写就是手动指定端口号//socket = new DatagramSocket();//这么写就是系统自动分配端口号}public void start() throws IOException {System.out.println("服务器启动...");while (true){DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);//requestPacket这个对象是用来承载数据的,在创建的时候需要创建一块内存空间来保存数据socket.receive(requestPacket);//当前完成的receive之后,数据是以二进制的形式存储到DatagramPacket中//还需要把这个二进制的数据转化成字符串的形式String request = new String(requestPacket.getData(),0,requestPacket.getLength());//范围为0到requestPacket.getLength(),requestPacket.getLength()表示数据的真实长度//2、根据请求,计算响应(服务器端最核心的作用)String response = process(request);//3、把响应写回到客户端//搞一个响应对象,DatagramPacket//把DatagramPacket构造刚才的数据,再通过send返回DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,requestPacket.getSocketAddress());//指定数据内容,同时指定数据要发给谁socket.send(responsePacket);//4、打印一个日志,把这次的数据交互的详情给打印出来System.out.printf("[%s:%d] req = %s,resp = %s\n",responsePacket.getAddress().toString(),responsePacket.getPort(),request,response);}}public String process(String request) {//请求是啥样,响应就是啥样//回转响应的方法return request;}public static void main(String[] args) throws IOException {EchoServer server = new EchoServer(9090);//实例测试server.start();}
}

 2.2客服端代码

public class EchoClient {//客户端private DatagramSocket socket = null;private String serverIP = "";private int serverPort = 0;public EchoClient(String ip,int port) throws SocketException {//创建这个对象不能手动指定端口socket = new DatagramSocket();//由于 UDP自身不会持有对端信息,就需要在应用程序里,把对端的情况给记录下来//这里咱们主要记录对端的ip和端口serverIP = ip;serverPort = port;}public void start() throws IOException {System.out.println("客户端启动...");Scanner scanner = new Scanner(System.in);while (true){//1、控制台读取数据,作为请求System.out.println(" -> ");String request = scanner.next();//2、把请求的内容构造成DatagramSocket对象,发送给服务器DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIP),serverPort);socket.send(requestPacket);//3、尝试获取服务器响应DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);//4、把响应给转换出字符串,并显示出来String response = new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {EchoClient client = new EchoClient("127.0.0.1",9090);client.start();}
}

2.3运行结果

 

相关文章:

  • 【热门话题】前端框架发展史
  • PostMan测试文件上传
  • 2024Vue高频面试题
  • C/C++火柴棍等式
  • docker搭建firefiy iii
  • 深入了解 大语言模型(LLM)微调方法
  • 如何“使用Docker快速安装Jenkins,在CentOS7”?
  • Qt教程 — 3.4 深入了解Qt 控件:Input Widgets部件(3)
  • NFT数字藏品推广途径有哪些?CloudNEO免费个性定制方案,推广您的NFT
  • 数据挖掘与大数据的结合
  • nginx实现多个域名和集群
  • 信息化项目可行性研究报告模板(第三章)
  • 【相关问题解答1】bert中文文本摘要代码:import时无法找到包时,几个潜在的原因和解决方法
  • ASP.NET-框架分类与详解
  • sqllab第二十六关通关笔记
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [case10]使用RSQL实现端到端的动态查询
  • [LeetCode] Wiggle Sort
  • Angular6错误 Service: No provider for Renderer2
  • ES6简单总结(搭配简单的讲解和小案例)
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Javascript Math对象和Date对象常用方法详解
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Vue2 SSR 的优化之旅
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于webpack 的 vue 多页架构
  • 配置 PM2 实现代码自动发布
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 在weex里面使用chart图表
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​queue --- 一个同步的队列类​
  • ###STL(标准模板库)
  • #FPGA(基础知识)
  • (3)nginx 配置(nginx.conf)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (编译到47%失败)to be deleted
  • (二)springcloud实战之config配置中心
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (七)Knockout 创建自定义绑定
  • (十一)图像的罗伯特梯度锐化
  • (五)c52学习之旅-静态数码管
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @RunWith注解作用
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C++] cout、wcout无法正常输出中文字符问题的深入调查(1):各种编译器测试
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽