中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python?socket之TCP通信及下載文件如何實現

發布時間:2023-02-24 09:46:55 來源:億速云 閱讀:104 作者:iii 欄目:開發技術

這篇“Python socket之TCP通信及下載文件如何實現”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python socket之TCP通信及下載文件如何實現”文章吧。

    TCP簡介

    TCP介紹

    TCP協議,傳輸控制協議(英語:Transmission Control Protocol,縮寫為 TCP)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議,由IETF的RFC 793定義。

    TCP通信需要經過創建連接、數據傳送、終止連接三個步驟。

    TCP通信模型中,在通信開始之前,一定要先建立相關的鏈接,才能發送數據,類似于生活中,“打電話”

    TCP特點

    1. 面向連接

    通信雙方必須先建立連接才能進行數據的傳輸,雙方都必須為該連接分配必要的系統內核資源,以管理連接的狀態和連接上的傳輸。

    雙方間的數據傳輸都可以通過這一個連接進行。

    完成數據交換后,雙方必須斷開此連接,以釋放系統資源。

    這種連接是一對一的,因此TCP不適用于廣播的應用程序,基于廣播的應用程序請使用UDP協議。

    2. 可靠傳輸

    1)TCP采用發送應答機制

    TCP發送的每個報文段都必須得到接收方的應答才認為這個TCP報文段傳輸成功

    2)超時重傳

    發送端發出一個報文段之后就啟動定時器,如果在定時時間內沒有收到應答就重新發送這個報文段。

    TCP為了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的包發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那么對應的數據包就被假設為已丟失將會被進行重傳。

    3)錯誤校驗

    TCP用一個校驗和函數來檢驗數據是否有錯誤;在發送和接收時都要計算校驗和。

    4) 流量控制和阻塞管理

    流量控制用來避免主機發送得過快而使接收方來不及完全收下。

    TCP與UDP的不同點


    TCP

    UDP

    1

    TCP的傳輸是可靠傳輸。

    UDP的傳輸是不可靠傳輸。

    2

    TCP是基于連接的協議,在正式收發數據前,必須和對方建立可靠的連接。

    UDP是和TCP相對應的協議,它是面向非連接的協議,它不與對方建立連接,而是直接把數據包發送出去

    3

    TCP是一種可靠的通信服務,負載相對而言比較大,TCP采用套接字(socket)或者端口(port)來建立通信。

    UDP是一種不可靠的網絡服務,負載比較小。

    4

    TCP和UDP結構不同,TCP包括序號、確認信號、數據偏移、控制標志(通常說的URG、ACK、PSH、RST、SYN、FIN)、窗口、校驗和、緊急指針、選項等信息。

    UDP包含長度和校驗和信息。

    5

    TCP提供超時重發,丟棄重復數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端。

    UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是并不能保證它們能到達目的地。

    6

    TCP在發送數據包前在通信雙方有一個三次握手機制,確保雙方準備好,在傳輸數據包期間,TCP會根據鏈路中數據流量的大小來調節傳送的速率,傳輸時如果發現有丟包,會有嚴格的重傳機制,故而傳輸速度很慢。

    UDP在傳輸數據報前不用在客戶和服務器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。

    7

    TCP支持全雙工和并發的TCP連接,提供確認、重傳與擁塞控制。

    UDP適用于哪些系統對性能的要求高于數據完整性的要求,需要“簡短快捷”的數據交換、需要多播和廣播的應用環境。

    tcp通信模型

    udp通信模型中,在通信開始之前,不需要建立相關的鏈接,只需要發送數據即可,類似于生活中,“寫信”

    tcp通信模型中,在通信開始之前,一定要先建立相關的鏈接,才能發送數據,類似于生活中,“打電話”

    Python?socket之TCP通信及下載文件如何實現

    Python?socket之TCP通信及下載文件如何實現

    tcp注意點

    • tcp服務器一般情況下都需要綁定,否則客戶端找不到這個服務器

    • tcp客戶端一般不綁定,因為是主動鏈接服務器,所以只要確定好服務器的ip、port等信息就好,本地客戶端可以隨機

    • tcp服務器中通過listen可以將socket創建出來的主動套接字變為被動的,這是做tcp服務器時必須要做的

    • 當客戶端需要鏈接服務器時,就需要使用connect進行鏈接,udp是不需要鏈接的而是直接發送,但是tcp必須先鏈接,只有鏈接成功才能通信

    • 當一個tcp客戶端連接服務器時,服務器端會有1個新的套接字,這個套接字用來標記這個客戶端,單獨為這個客戶端服務

    • listen后的套接字是被動套接字,用來接收新的客戶端的鏈接請求的,而accept返回的新套接字是標記這個新客戶端的

    • 關閉listen后的套接字意味著被動套接字關閉了,會導致新的客戶端不能夠鏈接服務器,但是之前已經鏈接成功的客戶端正常通信,因為accept返回了新的套接字。

    • 關閉accept返回的套接字意味著這個客戶端已經服務完畢

    • 當客戶端的套接字調用close后,服務器端會recv解堵塞,并且返回的長度為0,就是recv()返回為空, sendto不能發送空消息,因此服務器可以通過返回數據的長度來區別客戶端是否已經下線

    代碼:

    TCPServer:

    import socket
     
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_server.bind(("0.0.0.0", 8080))
     
    # 將套接字將默認的主動模式改成被動模式(監聽模式)
    tcp_server.listen(128)
     
    ret = tcp_server.accept()
     
    print(ret)
     
    tcp_server.close()

    TCPClient:

    import socket
     
    tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_client.connect(("192.168.1.12", 8080))
    tcp_client.send("hello,world!!!".encode("utf-8"))
     
    tcp_client.close()

    運行結果:

    Python?socket之TCP通信及下載文件如何實現

    TCP服務端與客戶端消息通信:

    代碼:

    TCPServer:

    import socket
    import threading
     
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_server.bind(("", 8080))
     
    # 將套接字將默認的主動模式改成被動模式(監聽模式)
    tcp_server.listen(128)
     
    client_socket, client_info = tcp_server.accept()
     
     
    def deal_msg():
        while True:
            data = client_socket.recv(1024)
            print(data)
            # 當客戶端關閉了連接,服務端的連接套接字也會繼續執行接收函數,但返回的是空字符串,這時服務端的連接套接字就可以關閉了
            if data == "":
                break
        client_socket.close()
     
     
    threading.Thread(target=deal_msg).start()
     
    print(client_socket, client_info)
     
    tcp_server.close()

    TCPClient:

    import socket
    import time
     
    tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_client.connect(("192.168.1.12", 8080))
     
    while True:
        time.sleep(2)
        tcp_client.send("hello,world!!!".encode("utf-8"))
     
    # tcp_client.close()

    下載文件:

    TCPDownloaderServer:

    import socket
    import threading
     
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_server.bind(("0.0.0.0", 8080))
    tcp_server.listen(128)
     
    tcp_client, clint_info = tcp_server.accept()
     
     
    def send_file():
        with open("./test.txt", "rb") as fp:
            while True:
                byteData = fp.read(128)
                print(byteData)
                if byteData:
                    tcp_client.send(byteData)
                else:
                    break
            tcp_client.close()
     
     
    threading.Thread(target=send_file).start()
     
    tcp_server.close()

    TCPDownloaderClient:

    import socket
     
    tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_client.connect(("192.168.1.12", 8080))
     
    with open("./test2.txt", "wb") as fp:
        while True:
            data = tcp_client.recv(1024)
            print(data)
            if data.decode("utf-8") == "":
                break
            fp.write(data)
     
    tcp_client.close()

    以上就是關于“Python socket之TCP通信及下載文件如何實現”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    嘉定区| 临漳县| 安塞县| 汽车| 潼关县| 扶绥县| 平阴县| 宁河县| 黄浦区| 全州县| 黄骅市| 岱山县| 三穗县| 靖州| 神池县| 武邑县| 鄂尔多斯市| 茂名市| 昆明市| 罗江县| 怀集县| 成武县| 台东市| 新化县| 西宁市| 连城县| 阳西县| 礼泉县| 忻州市| 安泽县| 盖州市| 宝山区| 唐河县| 桐城市| 漳平市| 德安县| 东台市| 建平县| 观塘区| 玛曲县| 博爱县|