最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?socket之TCP通信及下載文件的實現(xiàn)

 更新時間:2023年02月24日 08:30:03   作者:雙天至尊-王天龍  
本文主要介紹了Python?socket之TCP通信及下載文件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

TCP簡介

TCP介紹

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

TCP通信需要經(jīng)過創(chuàng)建連接、數(shù)據(jù)傳送、終止連接三個步驟。

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

TCP特點

1. 面向連接

通信雙方必須先建立連接才能進行數(shù)據(jù)的傳輸,雙方都必須為該連接分配必要的系統(tǒng)內(nèi)核資源,以管理連接的狀態(tài)和連接上的傳輸。

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

完成數(shù)據(jù)交換后,雙方必須斷開此連接,以釋放系統(tǒng)資源。

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

2. 可靠傳輸

1)TCP采用發(fā)送應答機制

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

2)超時重傳

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

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

3)錯誤校驗

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

4) 流量控制和阻塞管理

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

TCP與UDP的不同點

TCP

UDP

1

TCP的傳輸是可靠傳輸。

UDP的傳輸是不可靠傳輸。

2

TCP是基于連接的協(xié)議,在正式收發(fā)數(shù)據(jù)前,必須和對方建立可靠的連接。

UDP是和TCP相對應的協(xié)議,它是面向非連接的協(xié)議,它不與對方建立連接,而是直接把數(shù)據(jù)包發(fā)送出去

3

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

UDP是一種不可靠的網(wǎng)絡服務,負載比較小。

4

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

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

5

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

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

6

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

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

7

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

UDP適用于哪些系統(tǒng)對性能的要求高于數(shù)據(jù)完整性的要求,需要“簡短快捷”的數(shù)據(jù)交換、需要多播和廣播的應用環(huán)境。

tcp通信模型

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

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

tcp注意點

  • tcp服務器一般情況下都需要綁定,否則客戶端找不到這個服務器
  • tcp客戶端一般不綁定,因為是主動鏈接服務器,所以只要確定好服務器的ip、port等信息就好,本地客戶端可以隨機
  • tcp服務器中通過listen可以將socket創(chuàng)建出來的主動套接字變?yōu)楸粍拥?,這是做tcp服務器時必須要做的
  • 當客戶端需要鏈接服務器時,就需要使用connect進行鏈接,udp是不需要鏈接的而是直接發(fā)送,但是tcp必須先鏈接,只有鏈接成功才能通信
  • 當一個tcp客戶端連接服務器時,服務器端會有1個新的套接字,這個套接字用來標記這個客戶端,單獨為這個客戶端服務
  • listen后的套接字是被動套接字,用來接收新的客戶端的鏈接請求的,而accept返回的新套接字是標記這個新客戶端的
  • 關(guān)閉listen后的套接字意味著被動套接字關(guān)閉了,會導致新的客戶端不能夠鏈接服務器,但是之前已經(jīng)鏈接成功的客戶端正常通信,因為accept返回了新的套接字。
  • 關(guān)閉accept返回的套接字意味著這個客戶端已經(jīng)服務完畢
  • 當客戶端的套接字調(diào)用close后,服務器端會recv解堵塞,并且返回的長度為0,就是recv()返回為空, sendto不能發(fā)送空消息,因此服務器可以通過返回數(shù)據(jù)的長度來區(qū)別客戶端是否已經(jīng)下線

代碼:

TCPServer:

import socket
 
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server.bind(("0.0.0.0", 8080))
 
# 將套接字將默認的主動模式改成被動模式(監(jiān)聽模式)
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()

運行結(jié)果:

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

代碼:

TCPServer:

import socket
import threading
 
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server.bind(("", 8080))
 
# 將套接字將默認的主動模式改成被動模式(監(jiān)聽模式)
tcp_server.listen(128)
 
client_socket, client_info = tcp_server.accept()
 
 
def deal_msg():
    while True:
        data = client_socket.recv(1024)
        print(data)
        # 當客戶端關(guān)閉了連接,服務端的連接套接字也會繼續(xù)執(zhí)行接收函數(shù),但返回的是空字符串,這時服務端的連接套接字就可以關(guān)閉了
        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()

到此這篇關(guān)于Python socket之TCP通信及下載文件的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python TCP通信下載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python入門教程4. 元組基本操作

    Python入門教程4. 元組基本操作

    這篇文章主要介紹了Python元組基本操作,簡單介紹了元組的創(chuàng)建、count方法元素統(tǒng)計、index方法元素獲取等相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2018-10-10
  • 使用原生Python編寫Hadoop?MapReduce程序

    使用原生Python編寫Hadoop?MapReduce程序

    在大數(shù)據(jù)處理領域,Hadoop?MapReduce是一個廣泛使用的框架,用于處理和生成大規(guī)模數(shù)據(jù)集,本文將使用原生Python編寫Hadoop?MapReduce程序,需要的可以參考下
    2025-02-02
  • pandas 數(shù)據(jù)索引與選取的實現(xiàn)方法

    pandas 數(shù)據(jù)索引與選取的實現(xiàn)方法

    這篇文章主要介紹了pandas 數(shù)據(jù)索引與選取的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • 粗暴解決CUDA out of memory的問題

    粗暴解決CUDA out of memory的問題

    這篇文章主要介紹了粗暴解決CUDA out of memory的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • drf序列化器serializer的具體使用

    drf序列化器serializer的具體使用

    本文主要介紹了drf序列化器serializer的具體使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • 解決vscode python print 輸出窗口中文亂碼的問題

    解決vscode python print 輸出窗口中文亂碼的問題

    今天小編就為大家分享一篇解決vscode python print 輸出窗口中文亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 詳解如何使用Pyecharts制作Map3D

    詳解如何使用Pyecharts制作Map3D

    本文基于 Python3 的 Pyecharts 制作 Map3D(三維地圖) 時需要使用的設置參數(shù)和常用模板案例,使用 Pyecharts 進行數(shù)據(jù)可視化時可提供直觀、交互豐富、可高度個性化定制的數(shù)據(jù)可視化圖表。案例中的代碼內(nèi)容基于 Pyecharts 1.x 版本,需要的朋友可以參考下
    2021-06-06
  • 詳解Python中字符串前“b”,“r”,“u”,“f”的作用

    詳解Python中字符串前“b”,“r”,“u”,“f”的作用

    這篇文章主要介紹了Python中字符串前“b”,“r”,“u”,“f”的作用,感興趣的朋友跟隨小編一起看看吧
    2019-12-12
  • 使用matlab 判斷兩個矩陣是否相等的實例

    使用matlab 判斷兩個矩陣是否相等的實例

    這篇文章主要介紹了使用matlab 判斷兩個矩陣是否相等的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python Asyncio調(diào)度原理詳情

    Python Asyncio調(diào)度原理詳情

    這篇文章主要介紹了Python Asyncio調(diào)度原理詳情,Python.Asyncio是一個大而全的庫,它包括很多功能,而跟核心調(diào)度相關(guān)的邏輯除了三種可等待對象外,還有其它一些功能,它們分別位于runners.py,base_event.py,event.py三個文件中
    2022-06-06

最新評論

大石桥市| 佛学| 九龙县| 鄂托克前旗| 盐津县| 香格里拉县| 全南县| 富川| 固安县| 宁波市| 沾益县| 西充县| 蓬溪县| 望江县| 武义县| 岢岚县| 息烽县| 绥宁县| 咸宁市| 清水河县| 宁阳县| 特克斯县| 富平县| 衢州市| 蓝田县| 浦江县| 梓潼县| 凌海市| 慈利县| 工布江达县| 广西| 南通市| 长治市| 广河县| 南平市| 江陵县| 宣恩县| 华坪县| 易门县| 张家界市| 论坛|