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

Java网络编程,对使用UDP实现TCP(一)三次握手实现的补充

修改片段1

在第一次握手时,由《TCP/IP详解》卷二中对tcp计时器的描述中,我们可知连接的建立是需要进行判断,如果客户端发送了SYN连接请求,服务端没有在有限时间内进行恢复,就会取消本次连接。

我们使用 setSoTimeout() 来判断超时时间,当超过了我们的计时时间,会抛出一个RuntimeException异常,我们需要使用 try-catch来捕获这个异常,并且输出提示

//调用对象发送数据datagramSocket.send(datagramPacket);datagramSocket.setSoTimeout(75000);System.out.println("====================");System.out.println("接收数据中:...");/*** 在第二次握手中,客户端主要会检查两个方面的内容:* 检查ACK标志位:客户端需要确认服务端发送的确认信息(SYN-ACK)中的ACK标志位是否已设置。ACK标志位表示服务端确认收到了客户端的握手请求。* 检查确认号(ACK):客户端需要检查服务端发送的确认信息中的确认号(ACK)是否正确。确认号应该是服务端发送的初始序列号加1,用于告知服务端它已经正确接收到服务端的数据。*///创建数据包,用于接收数据byte[] bytes = new byte[1024];DatagramPacket datagramPacket2 = new DatagramPacket(bytes, bytes.length);datagramSocket.receive(datagramPacket2);//停止计时datagramSocket.setSoTimeout(0);

修改片段二

  • 无论是客户端还是服务端在每次接收信息和数据时,需要判断连接请求和传来的数据是否为自己应该接收的。
  • 在我们发现不是当前接收方需要接收的数据时,该如何处理

判断在服务端第二次握手过程中,传来数据是否应该由本服务端接收。(是否为本次连接

if (Integer.parseInt(strArr3[0]) != 1|| Integer.parseInt(strArr3[1]) != Integer.parseInt(ACK2)|| (Integer.parseInt(strArr3[2]) - 1) != Integer.parseInt(Seq2)){throw new WrongConnectionException("非本次连接");}

判断若不是为本次连接,我采用的方法是抛出一个异常

  • 自定义异常类
  • 抛出异常
  • 捕获异常(try-catch)

注意:该方法不是完全合乎逻辑的,因为抛出异常后程序将会停止,而且接收到数据后才进行的判断。正常情况下应该在接收前进行判断是否为本次连接的内容,如若不是本次连接数据,应该忽略本次连接,继续等待数据。

创建异常类:

package TCP_handShake;public class WrongConnectionException extends Exception{public WrongConnectionException(String Msg) {super(Msg);}
}

异常捕获在上一个代码段。

catch (WrongConnectionException e) {System.out.println("异常提醒:" + e.getMessage());}

相关文章:

  • 华为OD机试 - 数据单元的变化替换(Java JS Python C)
  • 在idea中使用maven创建dynamic web project
  • 4-Docker命令之docker export
  • Redis KEY*模糊查询导致速度慢、阻塞其他 Redis 操作
  • 破晓6G新时代:迈向新一代星地融合的高速测试解决方案
  • Mysql的多表联合查询
  • OpenAI 承认 ChatGPT 最近确实变懒,承诺修复问题
  • 基于Maven构建OSGI应用(Maven和OSGI结合)
  • 为什么现在是学习 Rust 的最佳时机
  • js根据数组对象中的某个值去重
  • Android audio设置投屏和喇叭双输出
  • 【数据结构和算法】--队列
  • Kubernetes(k8s)集群部署----->超详细
  • Spring Boot学习随笔- 集成JSP模板(配置视图解析器)、整合Mybatis(@MapperScan注解的使用)
  • 企业选CRM系统,这3个关键点你一定不能错过
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • Cumulo 的 ClojureScript 模块已经成型
  • Druid 在有赞的实践
  • Java小白进阶笔记(3)-初级面向对象
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • MD5加密原理解析及OC版原理实现
  • TypeScript迭代器
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue-router 实现分析
  • Vultr 教程目录
  • 从零搭建Koa2 Server
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 普通函数和构造函数的区别
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 2017年360最后一道编程题
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #LLM入门|Prompt#3.3_存储_Memory
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (2)STM32单片机上位机
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (二)换源+apt-get基础配置+搜狗拼音
  • (十三)Maven插件解析运行机制
  • (四)Android布局类型(线性布局LinearLayout)
  • (原)Matlab的svmtrain和svmclassify
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转载)OpenStack Hacker养成指南
  • .gitignore文件---让git自动忽略指定文件
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .Net Core和.Net Standard直观理解
  • .NET 发展历程
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET多线程执行函数
  • .net反混淆脱壳工具de4dot的使用
  • @font-face 用字体画图标
  • [100天算法】-实现 strStr()(day 52)
  • [Android]How to use FFmpeg to decode Android f...