通信协议之TCP(Transmission Control Protocol传输控制协议)

通信协议

协议:就好比约定,就好比我们现在说的普通话。
网络通信协议:速率,传输码率、代码结构、传输控制…(非常的复杂)

TCP/IP协议模型 (Transmission Control Protocol/Internet Protocol 翻译为:传输控制协议/互联网协议),包含了一系列构成互联网基础的网络协议,是Internet的核心协议。

重要的协议:
在这里插入图片描述
TCP和UDP对比

TCP:打电话

  • 连接、稳定
  • “三次握手” “四次挥手”
最少需要3次才可以保证稳定连接(“三次握手”)
A:你愁啥
B:瞅你咋地
A:干一场!

A:我要走了(“四次挥手”)
B:你真的要走了吗
B:你真的真的要走了吗
A:我真的要走了
  • 客服端、服务端
  • 传输完成,释放连接,效率低。

UDP:发短信

  • 不连接,不稳定
  • 客服端、服务端:没有明确的界限
  • 不管有没有准备好,都可以发送给你。
  • DDOS:洪水攻击!(饱和攻击)

TCP(Transmission Control Protocol传输控制协议)

客服端:

  1. 连接服务器 Socket
  2. 发送消息

服务端:

  1. 建立服务的端口 ServerSocket
  2. 等待用户的连接 accept
  3. 接收用户的消息

示例:
TcpClientDemo01.java
客服端

package net;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

// 客户端
public class TcpClientDemo01 {
    
    
    public static void main(String[] args) {
    
    
        OutputStream outputStream = null;
        Socket socket = null;
        try {
    
    
//        1.要知道服务器的地址
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
//        2.端口号
            int port = 9999;
//        3.创建一个socket连接
            socket = new Socket(serverIP, port);
//        4.发送消息 IO流
            outputStream = socket.getOutputStream();
            outputStream.write("李旭永远的神".getBytes());
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } //        关闭资源 从下往上依次关闭
        finally {
    
    
            if (outputStream != null) {
    
    
                try {
    
    
                    outputStream.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
            if (socket != null) {
    
    
                try {
    
    
                    socket.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }
    }
}

TcpServerDemo01.java
服务端

package net;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

// 服务端
public class TcpServerDemo01 {
    
    
    public static void main(String[] args) {
    
    
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        try {
    
    
//        1.我要有一个地址
            serverSocket = new ServerSocket(9999);
//        2.等待客户端连接
            socket = serverSocket.accept();
//        3.读取客户端的消息
            inputStream = socket.getInputStream();
//        4.管道流
            byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer)) != -1) {
    
    
                byteArrayOutputStream.write(buffer, 0, length);
            }

            System.out.println(byteArrayOutputStream.toString());
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            //        关闭资源 从下往上依次关闭
            if (byteArrayOutputStream != null) {
    
    // 资源为空才去关闭它,否则没必要
                try {
    
    
                    byteArrayOutputStream.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
            if (inputStream != null) {
    
    
                try {
    
    
                    inputStream.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
            if (socket != null) {
    
    
                try {
    
    
                    socket.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
            if (serverSocket != null) {
    
    
                try {
    
    
                    serverSocket.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:
在这里插入图片描述

TCP文件上传实现

TcpClientDemo02.java

扫描二维码关注公众号,回复: 12650290 查看本文章
package net;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

// 客服端 实现文件上传
public class TcpClientDemo02 {
    
    
    public static void main(String[] args) throws IOException {
    
    
// 1.创建一个Sockey连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
//        2.创建一个输出流
        OutputStream socketOutputStream = socket.getOutputStream();
//        3.读取文件
        FileInputStream fileInputStream = new FileInputStream(new File("boy.jpg"));
//        4.写出文件
        byte[] buffer = new byte[1024];
        int length;
        while ((length = fileInputStream.read(buffer)) != -1) {
    
    
            socketOutputStream.write(buffer, 0, length);
        }
//        5.关闭资源
        fileInputStream.close();
        socketOutputStream.close();
        socket.close();
    }
}

TcpServerDemo02.java

package net;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

// 服务端接收文件
public class TcpServerDemo02 {
    
    
    public static void main(String[] args) throws IOException {
    
    
//        1.创建服务
        ServerSocket serverSocket = new ServerSocket(9000);
//        2.监听客户端的连接
        Socket socket = serverSocket.accept();// 阻塞式监听
//        3.获取输入流
        InputStream inputStream = socket.getInputStream();
//        4.文件输出
        FileOutputStream fileOutputStream = new FileOutputStream(new File("receive.jpg"));

        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) != -1) {
    
    
            fileOutputStream.write(buffer, 0, length);
        }

//        关闭资源
        fileOutputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}

运行结果:
在这里插入图片描述

认识Tomcat

服务端

  • 自定义 S(Serve)
  • Tomcat服务器 S(Serve)

客户端

  • 自定义 C(Client)
  • 游览器 B(Browser)
  1. 启动服务器在这里插入图片描述
    2.在游览器打开:localhost:8080
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/I_r_o_n_M_a_n/article/details/113881383