public class Client { int port = 8888; String ip = 'localhost'; DataInputStream di = null; DataOutputStream dou = null; Socket client = null; // socket 通常也称作'套接字',用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过'套接字'向网络发出请求或者应答网络请求。

// 构造TCP报文段
String seq = null;// 序号
String SYN = null;//请求同步
String ack = null;//返回的确认号
String ACK = null;// 确认同步
String fin = '1';// fin=1时此报文段的发送方的数据已经发送完毕,并要求释放连接
String serverSYN,serverACK,serverseq,serverack;
String RecACK2,Recseq2,Recack2,Recfin3,Recseq3,Recack3;


//初始化Socket
public Client() throws UnknownHostException, IOException {
    client = new Socket(ip, port);
    run();
}

//将seq取出并+1形成ack
public String seqTransferAck(String s) {
    String result = null;
    int i = Integer.parseInt(s);
    i = i + 1;
    result = String.valueOf(i);
    return result;
}

//客户端向服务器发送相关消息
public void run() throws IOException {
    di = new DataInputStream(client.getInputStream());
    dou = new DataOutputStream(client.getOutputStream());
    //第一次握手,客户端向服务器发送的数据。seq=随机数  SYN=1 ACK=0
    seq = new Random().nextInt(1000)+"";
    ack = "0";
    SYN = "1";
    ACK = "0";
    //将要发给服务器的数据写入到数据输出流中
    dou.writeUTF(SYN);
    dou.writeUTF(ACK);
    dou.writeUTF(seq);


}

public String[] secendhand() throws Exception{
    di = new DataInputStream(client.getInputStream());
    dou = new DataOutputStream(client.getOutputStream());
    //第二次握手,读取来自服务器的数据
    String str[] = new String[4];
    serverSYN = di.readUTF();// SYN
    serverACK = di.readUTF();// ACK
    serverseq = di.readUTF();// seq
    serverack = di.readUTF();//
    str[0] = serverSYN;
    str[1] = serverACK;
    str[2] = serverseq;
    str[3] = serverack;
    return str;
}

public void secendPrint()throws Exception{
    System.out.println("第二次握手");
    System.out.println("从服务器端收到的ACK=" + serverSYN);
    System.out.println("从服务器端收到的SYN=" + serverACK);
    System.out.println("从服务器端收到的seq=" + serverseq);
    System.out.println("从服务器端收到的ack=" + serverack);
    //第三次握手,客户端向服务器发送的数据。设seq=serverack SYN=0 ACK=1 ack=seqTransferAck(serverseq)
    ACK = "1";
    SYN = "0";
    ack = seqTransferAck(serverseq);
    dou.writeUTF(ACK);
    dou.writeUTF(SYN);
    dou.writeUTF(serverack);
    dou.writeUTF(ack);
}

//[start] 四次挥手
/**
 * TCP拆除连接的四次挥手过程
 * 第一次挥手:fin = 1,seq = u
 * 第二次挥手:ACK = 1,seq = v ack = u+1
 * 第三次挥手:fin = 1,ACK=1,seq = w,ack = u+1
 * 第四次挥手:ACK = 1,seq = u+1,ack = w+1
 */

public void fouthsend() throws Exception{
    di = new DataInputStream(client.getInputStream());
    dou = new DataOutputStream(client.getOutputStream());
    seq = new Random().nextInt(1000)+"";
    dou.writeUTF(fin);
    dou.writeUTF(seq);
}

public String[] fifthhand() throws Exception{
    di = new DataInputStream(client.getInputStream());
    dou = new DataOutputStream(client.getOutputStream());
    String str[] = new String[4];
    RecACK2 = di.readUTF();
    Recseq2 = di.readUTF();
    Recack2 = di.readUTF();
    str[0] = RecACK2;
    str[1] = Recseq2;
    str[2] = Recack2;
    return str;
}

public void fifthPrint()throws Exception{
    System.out.println("第二次挥手");
    System.out.println("从服务器获得的ACK=" + RecACK2);
    System.out.println("从服务器获得的seq=" + Recseq2);
    System.out.println("从服务器获得的ack=" + Recack2);
}

public String[] sixthhand() throws Exception{
    di = new DataInputStream(client.getInputStream());
    dou = new DataOutputStream(client.getOutputStream());
    String str[] = new String[4];
    Recfin3 = di.readUTF();
    Recseq3 = di.readUTF();
    Recack3 = di.readUTF();
    str[0] = Recfin3;
    str[1] = Recseq3;
    str[2] = Recack3;
    return str;
}

public void sixthPrint()throws Exception{
    System.out.println("第三次挥手");
    System.out.println("从服务器获得的FIN=" + Recfin3);
    System.out.println("从服务器获得的seq=" + Recseq3);
    System.out.println("从服务器获得的ack=" + Recack3);
    String RecACK4 = "1";
    String Recseq4 = seqTransferAck(seq);
    String Recack4 = seqTransferAck(Recseq3);
    dou.writeUTF(RecACK4);
    dou.writeUTF(Recseq4);
    dou.writeUTF(Recack4);
}
TCP三次握手和四次挥手详解:Java代码逐行翻译

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

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