TCP传输
(1)连接:必须先连接在传输数据
(2)可靠:提供可靠的传输
(3)麻烦:需要保证传输可靠性,编程繁琐,内部机制繁琐,效率没有UDP高
(4)重要概念:三次握手和四次挥手
服务端:socket->bind->listen->accept->recv/send->close
客户端:socket———————>connect->recv/send->close
注意事项:
recv:什么时候返回值为空
答:在客户端断开的时候回返回为空

服务端基础代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Date  : 2021/6/8
# @Name  : ZhouZongXin

"""
TCP 服务端基础代码(循环模型)
"""
from socket import *


class TcpServer(object):

    @staticmethod
    def server():
        # 创建套接字(AF=家族,INET=ipv4)
        tcp_socket = socket(AF_INET, SOCK_STREAM)

        # 绑定套接字
        tcp_socket.bind(('0.0.0.0', 8888))

        # 设置监听(设置队列最大连接数)
        tcp_socket.listen(5)

        # 循环处理客户端连接,如果当前有客户端断开连接,那么等待接受下一个客户端进行连接
        while True:
            # 等待客户端连接
            print("waiting for connect")
            # 等待处理客户端连接accept
            connfd, addr = tcp_socket.accept()  # connfd连接的监听套接字,用accept处理
            print("connect from", addr)  # 打印客户端地址

            # 循环处理客户端发送消息
            while True:
                # 等待接收客户端消息
                data = connfd.recv(1024)
                # 客户端不存在了,recv会返回空字节
                if not data:
                    break
                print("recv", data.decode())
                # 回发给客户端
                connfd.send(f"服务端返回:{data}".encode())

            connfd.close()  # 关闭监听套接字  如果某个客户端退出连接下一个客户端连接

        tcp_socket.close()  # 关闭套接字


if __name__ == '__main__':
    TcpServer.server()

客户端基础代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Date  : 2021/6/8
# @Name  : ZhouZongXin

"""
TCP客户端基础代码
"""
from socket import *


class TcpClient(object):

    @staticmethod
    def client():

        while True:
            # 发送消息
            msg = input(">>")
            if not msg:
                break
            # 创建套接字
            tcp_socket = socket()

            # 发起连接  连接服务端
            tcp_socket.connect(('127.0.0.1', 8888))
            tcp_socket.send(msg.encode())  # 发送字节串
            data = tcp_socket.recv(1024)  # 接受1024字节
            print(data.decode())  # 转换字节串,且输出
            tcp_socket.close()  # 关闭套接字


if __name__ == '__main__':
    TcpClient.client()

UDP与TCP的区别

传输特性:
TCP提供可靠的数据传输,但是UDP则不保证传输的可靠性。
TCP传输数据处理为字节流,而UDP处理为数据包形式。
TCP传输需要建立连接才能进行数据传,效率相对较低,UDP比较自由,无需连接,效率较高。

套接字编程区别:
创建的套接字类型不同。
TCP套接字会有粘包,UDP套接字有消息边界不会粘包。
TCP套接字依赖listen accept建立连接才能收发消息,UDP套接字则不需要。
TCP套接字使用send,recv收到消息,UDP套接字使用sendto,recvfrom。

使用场景:
TCP更适合对准确性要求高,传输数据较大的场景。
文件传输:如下载电影,访问网页,上传照片。
邮件收发。
点对点数据传输:如点对点聊天,登陆请求,远程访问,发红包。

UDP更适合对可靠性要求没有那么高,传输方式比较自由的场景。
视频流传输:如直播,视频聊天。
广播:如网络广播,群发消息。
实时传输:如游戏画面。

在一个大型的项目中,可能既涉及到TCP网络又有UDP网络