{"title":"详细解读一下这段代码","content":"\u003ccode\u003eimport java.io.DataInputStream;\nimport java.io.DataOutputStream;\nimport java.io.IOException;\nimport java.net.ServerSocket;\nimport java.net.Socket;\nimport java.util.Random;\n\n/**\n *\n * @author SCZ\n *\n */\n\npublic class Server {\n ServerSocket sSocket = null;\n Socket socket;\n int port = 8888;\n DataInputStream di = null;\n DataOutputStream dou = null;\n String clientSYN1,clientACK1,clientseq1,serverack,serverACK,serverseq,serverSYN,clientSYN3,clientACK3,clientseq3,clientack3;\n String fseq,fin,fACK2,fseq2,fack2,fin3,fACK3,fseq3,fack3,fACK4,fseq4,fack4;\n\n //初始化Socket\n public Server() throws IOException {\n sSocket = new ServerSocket(8888);\n }\n\n //将seq取出并+1形成ack\n public String seqTransferAck(String s) {\n String result = null;\n int i = Integer.parseInt(s);\n i = i + 1;\n result = String.valueOf(i);\n return result;\n }\n\n //[start] 三次握手\n public String[] firsthand() throws Exception{\n socket = sSocket.accept();\n String str[] = new String[4];\n di = new DataInputStream(socket.getInputStream());\n dou = new DataOutputStream(socket.getOutputStream());\n //服务器从客户端接收第一次握手的数据,通过数据输入流读出\n clientSYN1 = di.readUTF();\n clientACK1 = di.readUTF();\n clientseq1 = di.readUTF();\n str[0] = clientSYN1;\n str[1] = clientACK1;\n str[2] = clientseq1;\n return str;\n }\n public void firstPrint()throws Exception{\n System.out.println("第一次握手");\n System.out.println("从客户端接受到的SYN=" + clientSYN1);\n System.out.println("从客户端接受到的ACK=" + clientACK1);\n System.out.println("从客户端接收到的seq=" + clientseq1);\n //第二次握手,服务器向客户端发送数据,设:ACK=1 seq=随机数 SYN=1 ack=seqTransferAck(clientseq1)\n serverack = seqTransferAck(clientseq1);\n serverACK = "1";\n serverseq = new Random().nextInt(1000)+"";\n serverSYN = "1";\n //将第二次握手的数据写入数据输出流中\n dou.writeUTF(serverACK);\n dou.writeUTF(serverSYN);\n dou.writeUTF(serverseq);\n dou.writeUTF(serverack);\n }\n public String[] thirdhand() throws Exception{\n //服务器从客户端接收第三次握手的数据,通过数据输入流读入\n String str[] = new String[4];\n di = new DataInputStream(socket.getInputStream());\n dou = new DataOutputStream(socket.getOutputStream());\n clientSYN3 = di.readUTF();\n clientACK3 = di.readUTF();\n clientseq3 = di.readUTF();\n clientack3 = di.readUTF();\n str[0] = clientSYN3;\n str[1] = clientACK3;\n str[2] = clientseq3;\n str[3] = clientack3;\n return str;\n }\n\n public void thirdPrint()throws Exception{\n System.out.println("第三次握手");\n System.out.println("从客户端获得的SYN=" + clientSYN3);\n System.out.println("从客户端获得的ACK=" + clientACK3);\n System.out.println("从客户端获得的seq=" + clientseq3);\n System.out.println("从客户端获得的ack=" + clientack3);\n System.out.println("");\n }\n //[end]\n\n //[start] 四次挥手\n public String[] fourthhand() throws Exception{\n String str[] = new String[4];\n di = new DataInputStream(socket.getInputStream());\n dou = new DataOutputStream(socket.getOutputStream());\n fin = di.readUTF();\n fseq = di.readUTF();\n str[0] = fin;\n str[1] = fseq;\n return str;\n }\n\n public void fourthPrint()throws Exception{\n System.out.println("第一次挥手");\n System.out.println("从客户端获得的fin=" + fin);\n System.out.println("从客户端获得的seq=" + fseq);\n // 第二次挥手 收到客户端消息 发送响应消息,ACK=1 seq=随机数 ack=fseq+1 写入数据输出流中\n fACK2 = "1";\n fseq2 = new Random().nextInt(1000)+"";\n fack2 = seqTransferAck(fseq);\n dou.writeUTF(fACK2);\n dou.writeUTF(fseq2);\n dou.writeUTF(fack2);\n }\n\n public void sixthhand()throws Exception{\n // 第三次挥手 向客户端发送消息 FIN=1 ACK=1 seq=随机数 ack=fseq+1 写入到数据输出流中\n fin3 = "1";\n fseq3 = new Random().nextInt(1000)+"";\n fack3 = seqTransferAck(fseq);\n dou.writeUTF(fin3);\n dou.writeUTF(fseq3);\n dou.writeUTF(fack3);\n }\n\n public String[] sevenhand()throws Exception{\n //第四次挥手 读取来自客户端的消息\n String str[] = new String[4];\n di = new DataInputStream(socket.getInputStream());\n dou = new DataOutputStream(socket.getOutputStream());\n fACK4 = di.readUTF();\n fseq4 = di.readUTF();\n fack4 = di.readUTF();\n str[0] = fACK4;\n str[1] = fseq4;\n str[2] = fack4;\n return str;\n }\n\n public void sevenPrint()throws Exception{\n System.out.println("第四次挥手");\n System.out.println("从客户端获得的ACK=" + fACK4);\n System.out.println("从客户端获得的seq=" + fseq4);\n System.out.println("从客户端获得的ack=" + fack4);\n }\n //[end]\n\n\n public static void main(String[] args) throws IOException {\n new Server();\n }\n\n}\n\u003c/code\u003e这段代码是一个简单的服务器端程序,实现了TCP连接的三次握手和四次挥手过程。\n\n首先,在初始化Socket的时候,创建了一个ServerSocket对象,并指定了端口号为8888。\n\n然后,定义了一些字符串变量,用于存储收到的和发送的数据。\n\n接下来,定义了一个方法seqTransferAck,用于将收到的seq值加1后转换为ack值。\n\n然后,定义了一个方法firsthand,实现了三次握手的第一次握手过程。在这个方法中,服务器使用ServerSocket的accept方法等待客户端的连接,并通过DataInputStream和DataOutputStream对象来读取和写入数据。首先读取客户端发送的SYN、ACK和seq值,并将它们存储在字符串数组str中。\n\n然后,定义了一个方法firstPrint,用于打印第一次握手的数据。\n\n接着,定义了一个方法thirdhand,实现了三次握手的第三次握手过程。在这个方法中,服务器再次通过DataInputStream和DataOutputStream对象来读取和写入数据。这次读取的数据包括客户端发送的SYN、ACK、seq和ack值,并将它们存储在字符串数组str中。\n\n然后,定义了一个方法thirdPrint,用于打印第三次握手的数据。\n\n接下来,定义了一个方法fourthhand,实现了四次挥手的第一次挥手过程。在这个方法中,服务器通过DataInputStream对象读取客户端发送的fin和seq值,并将它们存储在字符串数组str中。\n\n然后,定义了一个方法fourthPrint,用于打印第一次挥手的数据,并向客户端发送响应消息。\n\n接着,定义了一个方法sixthhand,实现了四次挥手的第三次挥手过程。在这个方法中,服务器向客户端发送消息,包括FIN、ACK、seq和ack值。\n\n然后,定义了一个方法sevenhand,实现了四次挥手的第四次挥手过程。在这个方法中,服务器通过DataInputStream对象读取客户端发送的ACK、seq和ack值,并将它们存储在字符串数组str中。\n\n接下来,定义了一个方法sevenPrint,用于打印第四次挥手的数据。\n\n最后,在main方法中,创建了一个Server对象,启动服务器。\n\n总的来说,这段代码实现了一个简单的服务器端程序,完成了TCP连接的三次握手和四次挥手过程,并打印了相关的数据。


原文地址: https://www.cveoy.top/t/topic/pObX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录