1. 程式人生 > >tcp(Transmission Control Protocol)傳輸控制協議及案例檔案下載器

tcp(Transmission Control Protocol)傳輸控制協議及案例檔案下載器

----------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()