发表于: 2017-10-06 22:31:09

1 831


今天完成的事情:

学习http协议,了解http基本流程

学习tcp/id 三次握手 四次握手

在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接:

  • 第一次握手:客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。

  • 第二次握手: 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。

  • 第三次握手: 客户必须再次回应服务段一个ACK报文,这是报文段3。

  • 在TCP/IP协议中,TCP协议断开连接要进行4次

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

  • 第一次握手: TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送
  • 第二次握手: 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号
  • 第三次握手: 服务器关闭客户端的连接,发送一个FIN给客户端
  • 第四次握手:客户段发回ACK报文确认,并将确认序号设置为收到序号加1

由TCP的三次握手和四次断开可以看出,TCP使用面向连接的通信方式,大大提高了数据通信的可靠性,使发送数据端
和接收端在数据正式传输前就有了交互,为数据正式传输打下了可靠的基础。

package client;

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;

/**
* Created by 56929 on 2017/10/6.
*/
public class client {
public static void main(String[] args) {
try {
//创建socket指定服务器地址和端口
           Socket client = new Socket("127.0.0.1",8001);
           //客户端向服务器发送登陆信息
           OutputStream os = client.getOutputStream();//字节输出流
           PrintWriter pw = new PrintWriter(os);
           pw.write("用户名:严恒;密码:123");
           pw.flush();
           client.shutdownOutput();
           //获取输出流
           InputStream is = client.getInputStream();
           InputStreamReader isr = new InputStreamReader(is);
           BufferedReader br = new BufferedReader(isr);
           String info = null;
           while ((info = br.readLine())!=null) {
System.out.println("服务器说:"+info);
           }
//关闭其他资源换
           pw.close();
           os.close();
           is.close();
           isr.close();
           br.close();
           client.close();
       }catch (UnknownHostException e) {
e.printStackTrace();
       }catch (IOException e){
e.printStackTrace();
       }
}
}
package server;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
* Created by 56929 on 2017/10/6.
*/
public class Server {
public static void main(String[] args) {
try {
//创建一个服务端的Socket,指定绑定的端口,并且监听
           ServerSocket server = new ServerSocket(8001);
           //调用accept方法开始监听,等待客户端连接
           System.out.println("服务启动,等待客户端上线");
           Socket socket = server.accept();
           //获取一个输入流,用来读取客户端所发送的登陆信息
           InputStream is = socket.getInputStream();//字节输入
           InputStreamReader isr = new InputStreamReader(is);//将字节流转换
           BufferedReader br = new BufferedReader(isr);//为输入流添加缓冲
           String info = null;
           while ((info = br.readLine()) !=null){
System.out.println("我是服务器,客户端说:"+info);
           }
socket.shutdownInput();
           //获取输出流
           OutputStream os = socket.getOutputStream();
           PrintWriter pw = new PrintWriter(os);//包装打印流
           pw.write("老婆我爱你");
           pw.flush();
           socket.shutdownOutput();
           //关闭资源(连接)
           pw.checkError();
           br.close();
           isr.close();
           is.close();
           server.close();

       } catch (IOException e) {
e.printStackTrace();
       }
}
}

明天计划的事情:

完成小课堂,继续投简历

遇到的问题:

无法实时传输控制台输入的数据

收获:

学习了tcp/ip


返回列表 返回列表
评论

    分享到