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

news/2025/1/11 17:01:16/

修改片段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());}


http://www.ppmy.cn/news/1270879.html

相关文章

人工智能与天文:技术前沿与未来展望

人工智能与天文:技术前沿与未来展望 一、引言 随着科技的飞速发展,人工智能(AI)在各个领域的应用越来越广泛。在天文领域,AI也发挥着越来越重要的作用。本文将探讨人工智能与天文学的结合,以及这种结合带…

DataFunSummit:2023年数据科学在线峰会-核心PPT资料下载

一、峰会简介 数据会说谎?如何正确的挖掘并使用数据?前沿的科学实验如何做?实验又是如何欺骗你的?数据中台如何发挥功效?用户增长有捷径吗?数据科学的最佳实践有哪些? 本次峰会共包含了&#…

linux基础知识面试题及一般面试技巧

什么是Linux? Linux是一种开源的操作系统,最初由芬兰计算机科学家Linus Torvalds创建。它基于UNIX操作系统的设计原理,并且可以在各种硬件平台上运行。Linux操作系统具有稳定性、安全性和灵活性的特点,广泛应用于服务器、超级计算…

C# ref传参与out传参

在 C# 中,ref 和 out 都是用于传递参数的关键字 1、ref 关键字: ref 用于将一个变量传递给方法,并允许方法修改该变量的值。 调用方法时,必须先初始化被 ref 修饰的变量,否则会编译错误。 方法内部可以不给 ref 参数重…

Win11 TensorRT环境部署

一、CUDA和CUDNN安装 cuda和cudnn网上有很多安装教程,这里列举了一些,就不详细说了,具体链接如下: csdn.net - CUDA安装教程(超详细) 原创 zhihu.com - 深度学习之CUDACUDNN详细安装教程 tencent.com - C…

一个程序员的养生指南

文章目录 一个程序员的养生指南 一个程序员的养生指南 大学毕业后几年,体重长得比工作年限还快,不到3年,增重将近20公斤,也不知道咋做到的。直到2019年年底,已经到了走路喘气,爬楼胸闷,下蹲头晕…

ChatGPT 成为 Nature 年度十大人物,首个非人类实体

文章目录 一、前言二、主要内容三、总结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 2023 年即将结束,现在是时候回顾今年的重要科学进展了。12 月 13 日,著名科学期刊《Nature》刚刚发布了 2023 年度的十大人物&…

Tair(2):Tair安装部署

1 安装相关依赖库 yum install -y gcc gcc-c make m4 libtool boost-devel zlib-devel openssl-devel libcurl-devel yum:是yellowdog updater modified 的缩写,Linux中的包管理工具gcc:一开始称为GNU C Compiler,也就是一个C编…