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

修改片段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());
        }
相关推荐
梁辰兴6 分钟前
计算机网络基础:P2P 文件分发的分析
网络·计算机网络·计算机·p2p·计算机网络基础·梁辰兴·文件分发分析
未若君雅裁7 分钟前
工厂模式详解:简单工厂、工厂方法与抽象工厂
java·开发语言
不会写DN11 分钟前
通过php 中的Route:: 的写法了解什么是静态类调用
android·java·php
小刘|12 分钟前
SpringAIAlibaba快速接入阿里云百炼
java·spring boot·spring·maven
2601_9619633814 分钟前
从OCR到NLP:AI技术如何赋能电子合同智能审核与风险预警?
网络·人工智能·安全·金融·智能合约
我命由我1234516 分钟前
由 ImageView 获取到的 Drawable 对象,它的 intrinsicWidth、intrinsicWidth 与实际图片的尺寸
java·开发语言·java-ee·android studio·android jetpack·android-studio·android runtime
Han.miracle17 分钟前
Jackson 工具类详解:ObjectMapper 配置、泛型擦除、TypeReference 与 JavaType
java·spring boot·spring
guslegend18 分钟前
Java 创建对象有几种方式
java·开发语言
CJH(本人账号)19 分钟前
大模型的“越狱“之路:从DAN到多模态注入,AI安全边界正在崩塌
网络·人工智能·安全
暗暗别做白日梦20 分钟前
延时消息的几种实现方式及优缺点
java