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

news/2024/5/18 15:13:51 标签: 网络, java, udp

修改片段1

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

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

java">//调用对象发送数据
            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);

修改片段二

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

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

java">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)

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

创建异常类:

java">package TCP_handShake;

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

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

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


http://www.niftyadmin.cn/n/5258014.html

相关文章

实验7:索引和视图定义

【实验目的】 1、了解索引和视图的含义 2、熟悉索引和视图的创建规则 3、掌握索引和视图的创建和管理 【实验设备及器材】 1、硬件:PC机; 2、软件:(1)Windows7; (2)Microsoft SQL Server 2012。 【主要内容】 索引的创建、删除、重建…

以csv为源 flink 创建paimon 临时表相关 join 操作

目录 概述配置关键配置测试启动 kyuubi执行配置中的命令 bug解决bug01bug02 结束 概述 目标:生产中有需要外部源数据做paimon的数据源,生成临时表,以使用与现有正式表做相关统计及 join 操作。 环境:各组件版本如下 kyuubi 1.8…

为 PHP 引入 Python 生态的经验分享

编译安装 phpy 可以作为 PHP 的扩展,也可以作为 Python 的 C 模块。既可以在 PHP 代码中调用 Python 的库,也可以在 Python 中调用 PHP 的类和函数。 作为 Python 模块时依赖 PHP 的 embed SAPI ,检查 PHP 的目录中,确保存在 libphp.so ll /opt/php-8.…

mybatis的快速入门以及spring boot整合mybatis(二)

需要用到的SQL脚本: CREATE TABLE dept (id int unsigned PRIMARY KEY AUTO_INCREMENT COMMENT ID, 主键,name varchar(10) NOT NULL UNIQUE COMMENT 部门名称,create_time datetime DEFAULT NULL COMMENT 创建时间,update_time datetime DEFAULT NULL COMMENT 修改…

10基于matlab的悬臂梁四节点/八节点四边形单元有限元编程(平面单元)

悬臂梁,有限元编程。基于matlab的悬臂梁四节点/八节点四边形单元有限元编程(平面单元),程序有详细注解,可根据需要更改参数,包括长度、截面宽度和高度、密度、泊松比、均布力、集中力、单元数量等。需要就拍…

华为儿童手表,运动的引领者

作为家长,你是否经常为孩子的健康担忧,也一直在寻找一种可以与孩子一起运动、记录运动数据并让孩子产生对运动感兴趣的设备? 那不妨试试华为儿童手表,一款拥有专业的运动模式的智能手表。孩子只需简单操作手表,就能开…

【数据结构和算法】递增的三元子序列

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:贪心 二分 2.2 方法二:贪心(优化) 三、代码…

英文作文AI创作工具,怎么用AI批量写英文作文

在当今全球化的时代,良好的英语写作能力不仅仅是学业成功的关键,更是职场竞争中的重要技能。随着科技的不断发展,我们现在有了更多的工具可以辅助我们提升英语写作水平。在这篇文章中,我将为大家推荐5种强大的AI写作工具&#xff…