TCP 通信

高级编程技巧 学习笔记

一、TCP


1.1、TCP 介绍

  • TCP协议,传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。

  • TCP通信需要经过创建连接、数据传送、终止连接三个步骤。

  • TCP通信模型中,在通信开始之前,一定要先建立相关连接,才能发生数据。

1.2、TCP 特点

  • 面向连接
    通信双方必须先建立连接才能进行数据的传输

  • 可靠传输
    (1)TCP采用发送应答机制
    (2)超时重传
    (3)错误校验
    (4)流量控制和阻塞管理




二、TCP 客户端 与 服务端


服务端: 就是提供服务的一方。

客户端: 就是需要被服务的一方。


2.1、TCP客户端构建流程

  1. 创建 socket

  2. 链接服务器

  3. 接收数据(最大接收2014个字节)

  4. 关闭套接字

import socket
# from socket import *

def main():
    # 创建 TCP 套接字(使用不同的导入方式, 则用不同的创建形式)
    tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # tcp_client = socket(AF_INET, SOCK_STREAM)

    # 链接服务器
    server_ip = input("server ip:")
    server_port = int(input("server port:"))					# 注意端口是整数类型
    tcp_client.connect_ex((server_ip, server_port))

    # 发送数据
    send_data = input("发送的数据:")
    # 因为上面已经连接过, 所以用 send 而不用 sendto
    tcp_client.send(send_data.encode())

    # 接收数据, 没收到数据则阻塞
    recvdata = tcp_client.recv(1024)
    print(recvdata.decode('gbk'))

	# 关闭连接
    tcp_client.close()


if __name__ == '__main__':
    main()

2.2、TCP 服务端

  1. socket 创建套接字

  2. bind 绑定 IP 和 port

  3. listen 使套接字变为可以被动链接

  4. accept 等待客户端的链接

  5. recv/send 接收发送数据

import socket


def main():
    # tcp 的套接字(监听套接字, 监听谁发送连接申请, 然后创建新套接字)
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 绑定信息
    tcp_server.bind(("", 7890))

    # 主动变被动
    tcp_server.listen(128)

    # accept() -> (socket object, address info)        accept 返回的两个参数
    # 接收监听后创建的一对一套接字
    new_client_socket, client_addr = tcp_server.accept()
    # print(client_addr)
    
    # 接收数据
    recv_data = new_client_socket.recv(1024)
    print(recv_data)

    # 发送数据
    new_client_socket.send('haha'.encode('gbk'))

	# 关闭连接
    new_client_socket.close()
    tcp_server.close()


if __name__ == '__main__':
    main()



三、劣质版 TCP 服务端为多个客户端服务(不能同时服务)


import socket


def main():
    # tcp的套接字
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 绑定信息
    tcp_server.bind(("", 7890))

    # 为多个客户端服务
    while True:
        # 主动变被动
        tcp_server.listen(128)
        new_client_socket, client_addr = tcp_server.accept()
        # print(client_addr)

        # 为客户端多次服务
        while True:
            # 接收数据  阻塞
            recv_data = new_client_socket.recv(1024)
            print(recv_data)

            # 客户端发送过来数据
            # 没有数据时, 客户端断开连接
            if recv_data.decode('gbk'):
                # 发送数据
                new_client_socket.send('haha'.encode('gbk'))
            else:
                break
                
        # 关闭客户端对应套接字
        new_client_socket.close()

	#关闭监听套接字
    tcp_server.close()


if __name__ == '__main__':
    main()



四、TCP 与 UDP 区别


  1. TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。

  2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。

  3. UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

  4. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。

  5. TCP对系统资源要求较多,UDP对系统资源要求较少。


UDP 通信

在这里插入图片描述


TCP 通信

在这里插入图片描述

发布了85 篇原创文章 · 获赞 0 · 访问量 1221

猜你喜欢

转载自blog.csdn.net/qq_43621629/article/details/104093758