tcp(Transmission Control Protocol)传输控制协议及案例文件下载器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40667484/article/details/83617305

----------udp通信模型
是写信的模型
要填上ip 端口
特点:不太安全,容易丢包
飞q:edp

----------tcp通信模型
是打电话的模型,不需要填写ip和port
TCP:安全
在通信开始之前,一定要建立相关的链接,才能发送数据。
建立通道。

----------TCP通信需要经过创建连接,数据传送,终止连接三个步骤。
----------TCP采用了应答机制
在这里插入图片描述

-----------TCP和UDP的不同点
在这里插入图片描述
面向连接(确认有创建三方交握,连接已创建才作传输)
有序数据传输
重发丢失的数据包
舍弃重复的数据包
无差错的的数据传输
阻塞/流量控制

----------udp流程

在这里插入图片描述

----------tcp流程

在这里插入图片描述

-----------tcp客户端
在这里插入图片描述

-----------tcp客户端构建流程
在这里插入图片描述

import socket

def main():
    # 创建套接字
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    # 链接服务器
    server_ip = input("请输入要链接的服务器的ip:")
    server_port = int(input("请输入要链接的服务器的port:"))
    server_addr = (server_ip,server_port)
    tcp_socket.connect(server_addr)

    # 发送数据
    while True:
        send_data = input("请输入要发送的数据:")
        tcp_socket.send(send_data.encode("utf-8"))
        if send_data == "exit":
            break
    # 关闭套接字
    tcp_socket.close()

if __name__ == "__main__":
    main()

-------------TCP服务器

在这里插入图片描述

------------------TCP服务器代码

import socket

def main():
    # 买个手机(创建套接字)
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    # 安装手机卡(绑定本地信息)
    localaddr = ("",7788)
    tcp_server_socket.bind(localaddr)

    # 将手机设置为正常的 响铃模式(让默认的套接字由主动变为被动 listen)
    tcp_server_socket.listen(128)
    print("------1------")
    while True:
        # 等待别人的电话到来(等待客户端的链接 accept)
        new_client_socket,client_addr = tcp_server_socket.accept()
        print("--------2--------")
        print(client_addr)

        # 接收客户端发送过来的请求
        recv_data = new_client_socket.recv(1024)
        print(recv_data)

        # 回送一部分数据给客户端
        new_client_socket.send("1111".encode("utf-8"))

        # 关闭套接字
        new_client_socket.close()

    tcp_server_socket.close()


if __name__ == "__main__":
    main()

----------主要流程是:
总述: 一个客户端传送数据,一个服务器端接收数据

1.先是服务器端打开流,
2.到accept堵塞,等客户端解堵塞
3.再是客户端利用connect连接服务器端
4.接收客户端发送的信息
5.回送一部分数据给客户端以证明发送成功
6.关闭套接字(关闭连接)

循环为多个客户端服务

在accept前面加while True:

while True:
    # 等待别人的电话到来(等待客户端的链接 accept)
    new_client_socket,client_addr = tcp_server_socket.accept()
    print("--------2--------")
    print(client_addr)

    # 接收客户端发送过来的请求
    recv_data = new_client_socket.recv(1024)
    print(recv_data)

    # 回送一部分数据给客户端
    new_client_socket.send("1111".encode("utf-8"))

    # 关闭套接字
    new_client_socket.close()
tcp_server_socket.close()

TCP——案例:文件下载器模型(抄作业模型)

什么叫下载:
1.在本地创建一个文件
2.然后收到一点数据,就写进去

----------文件下载器的客户端
1.打开套接字
2.绑定地址
3.链接服务器端
4.获取下载的文件名字
5.发送数据(一个文件名)
6.接收数据
7.把接收的数据写在文件内
8.关闭套接字

import socket


def main():
    # 打开套接字
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    # 绑定地址
    localaddr = ("",7788)
    tcp_socket.bind(localaddr)

    # 链接服务器端
    server_ip = input("请输入要链接的服务器的ip:")
    server_port = int(input("请输入要链接的服务器的port:"))
    server_addr = (server_ip, server_port)
    tcp_socket.connect(server_addr)

    # 获取下载的文件名字
    download_file_name = input("请输入要下载的文件名字:")

    # 发送数据(一个文件名)
    tcp_socket.send(download_file_name.encode("utf-8"))

    # 接收数据
    recv_data = tcp_socket.recv(1024*1024)

    # 把接收的数据写在文件内
    with open("[新]" + download_file_name, "wb") as f:
        f.write(recv_data)

    # 关闭套接字
    tcp_socket.close()


if __name__ == "__main__":
    main()

----------文件下载器的服务器端

import socket

def main():
    # 创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    # 绑定自身地址
    localaddr = ("",5050)
    tcp_server_socket.bind(localaddr)

    # 换为接听
    tcp_server_socket.listen(128)
    # 接受客户端访问
    new_client_socket,client_addr = tcp_server_socket.accept()
    print(client_addr)
    # 接受数据
    recv_data = new_client_socket.recv(1024*1024)
    print(recv_data)
    # 发送数据
    new_client_socket.send("dqwdq".encode("utf-8"))
    # 关闭套接字
    new_client_socket.close()
    tcp_server_socket.close()

if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/qq_40667484/article/details/83617305
今日推荐