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

python中的tcp示例詳解

 更新時(shí)間:2018年12月09日 08:42:38   作者:張風(fēng)閑  
這篇文章主要給大家介紹了關(guān)于python中tcp協(xié)議的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

TCP簡(jiǎn)介

TCP介紹

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

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

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

TCP特點(diǎn)

1. 面向連接

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

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

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

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

2. 可靠傳輸

1)TCP采用發(fā)送應(yīng)答機(jī)制

TCP發(fā)送的每個(gè)報(bào)文段都必須得到接收方的應(yīng)答才認(rèn)為這個(gè)TCP報(bào)文段傳輸成功

2)超時(shí)重傳

發(fā)送端發(fā)出一個(gè)報(bào)文段之后就啟動(dòng)定時(shí)器,如果在定時(shí)時(shí)間內(nèi)沒有收到應(yīng)答就重新發(fā)送這個(gè)報(bào)文段。

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

3)錯(cuò)誤校驗(yàn)

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

4) 流量控制和阻塞管理

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

TCP與UDP的不同點(diǎn)

  • 面向連接(確認(rèn)有創(chuàng)建三方交握,連接已創(chuàng)建才作傳輸。)
  • 有序數(shù)據(jù)傳輸
  • 重發(fā)丟失的數(shù)據(jù)包
  • 舍棄重復(fù)的數(shù)據(jù)包
  • 無差錯(cuò)的數(shù)據(jù)傳輸
  • 阻塞/流量控制

udp通信模型

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

TCP通信模型

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

tcp客戶端

tcp的客戶端要比服務(wù)器端簡(jiǎn)單很多,如果說服務(wù)器端是需要自己買手機(jī)、查手機(jī)卡、設(shè)置鈴聲、等待別人打電話流程的話,那么客戶端就只需要找一個(gè)電話亭,拿起電話撥打即可,流程要少很多

python創(chuàng)建tcp客戶端的代碼如下:

import socket


def main():
  # 1.創(chuàng)建套接字socket
  tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  # 2.連接服務(wù)器
  dest_ip = input("請(qǐng)輸入服務(wù)器ip:")
  dest_port = int(input("請(qǐng)輸入服務(wù)器port:"))
  dest_addr = (dest_ip, dest_port)
  tcp_socket.connect(dest_addr)

  # 3. 接收/發(fā)送數(shù)據(jù)
  send_data = input("請(qǐng)輸入要發(fā)送的數(shù)據(jù):")
  tcp_socket.send(send_data.encode("utf-8")) 
 
  # 接收服務(wù)器發(fā)送的數(shù)據(jù)
  recv_data = tcp_socket.recv(1024)
  print(recv_data.decode("utf-8")) 

  # 4. 關(guān)閉套接字socket
  tcp_socket.close()

if __name__ == "__main__":

  main()

在ubuntu的終端上執(zhí)行:

在網(wǎng)絡(luò)調(diào)試助手中啟動(dòng)tcp服務(wù)器進(jìn)行交互:

tcp服務(wù)器

在程序中,如果想要完成一個(gè)tcp服務(wù)器的功能,需要的流程如下:

  • socket創(chuàng)建一個(gè)套接字
  • bind綁定ip和port
  • listen使套接字變?yōu)榭梢员粍?dòng)鏈接
  • accept等待客戶端的鏈接
  • recv/send接收發(fā)送數(shù)據(jù)
import socket


def main():
  # 1.創(chuàng)建套接字
  tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
  # 2.綁定端口
  addr = ("", 8866)
  tcp_server_socket.bind(addr)

  # 3.監(jiān)聽鏈接
  tcp_server_socket.listen(128)

  # 4.接收別人的連接
  # client_socket用來為這個(gè)客戶端服務(wù)
  client_socket, client_addr = tcp_server_socket.accept() 
 
  # 5.接收對(duì)方發(fā)送的數(shù)據(jù)
  recv_data = client_socket.recv(1024) 
  print("接收到的數(shù)據(jù):%s" % recv_data.decode("utf-8"))
 
  # 6.給對(duì)方發(fā)送數(shù)據(jù)
  client_socket.send("hahaha".encode("utf-8")) 

  # 7.關(guān)閉套接字 
  client_socket.close()
  tcp_server_socket.close()


if __name__ == "__main__":
  main()

在ubuntu的終端上執(zhí)行:

在網(wǎng)絡(luò)調(diào)試助手中啟動(dòng)tcp服務(wù)器進(jìn)行交互:


tcp注意點(diǎn)

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。 

相關(guān)文章

  • python多線程案例之多任務(wù)copy文件完整實(shí)例

    python多線程案例之多任務(wù)copy文件完整實(shí)例

    這篇文章主要介紹了python多線程案例之多任務(wù)copy文件,結(jié)合完整實(shí)例形式分析了Python使用multiprocessing模塊實(shí)現(xiàn)基于多線程的文件拷貝相關(guān)操作技巧,需要的朋友可以參考下
    2019-10-10
  • python數(shù)據(jù)分析之用sklearn預(yù)測(cè)糖尿病

    python數(shù)據(jù)分析之用sklearn預(yù)測(cè)糖尿病

    這篇文章主要介紹了python數(shù)據(jù)分析之用sklearn預(yù)測(cè)糖尿病,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python數(shù)據(jù)分析的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04
  • 解決python明明pip安裝成功卻找不到包的問題

    解決python明明pip安裝成功卻找不到包的問題

    今天小編就為大家分享一篇解決python明明pip安裝成功卻找不到包的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 簡(jiǎn)單了解python模塊概念

    簡(jiǎn)單了解python模塊概念

    這篇文章主要介紹了簡(jiǎn)單了解python模塊概念,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python中生成器和迭代器的區(qū)別詳解

    Python中生成器和迭代器的區(qū)別詳解

    這篇文章主要介紹了Python中生成器和迭代器的區(qū)別詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • python學(xué)習(xí)實(shí)操案例(二)

    python學(xué)習(xí)實(shí)操案例(二)

    這篇文章主要介紹了python學(xué)習(xí)實(shí)操案例,主要實(shí)操內(nèi)容有二進(jìn)制轉(zhuǎn)換、為自己手機(jī)充值、、計(jì)算能量的消耗等,需要的小伙伴可以參考一下
    2022-02-02
  • python實(shí)現(xiàn)類似Netty功能的異步編程

    python實(shí)現(xiàn)類似Netty功能的異步編程

    本文將介紹如何使用Python來實(shí)現(xiàn)本文將介紹如何使用Python來實(shí)現(xiàn)類似于Netty的功能,并提供一些代碼示例來幫助讀者理解,能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Python基于Pytorch的特征圖提取實(shí)例

    Python基于Pytorch的特征圖提取實(shí)例

    在利用深度學(xué)習(xí)進(jìn)行分類時(shí),有時(shí)需要對(duì)中間的特征圖進(jìn)行提取操作,下面這篇文章主要給大家介紹了關(guān)于Python基于Pytorch的特征圖提取的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • python實(shí)現(xiàn)npy格式文件轉(zhuǎn)換為txt文件操作

    python實(shí)現(xiàn)npy格式文件轉(zhuǎn)換為txt文件操作

    這篇文章主要介紹了python實(shí)現(xiàn)npy格式文件轉(zhuǎn)換為txt文件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 這三個(gè)好用的python函數(shù)你不能不知道!

    這三個(gè)好用的python函數(shù)你不能不知道!

    作為21世紀(jì)最流行的語(yǔ)言之一,Python當(dāng)然有很多有趣的功能值得深入探索和研究.今天通過理論和實(shí)際例子來討論,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

浪卡子县| 云霄县| 米脂县| 烟台市| 那曲县| 武隆县| 德昌县| 凉城县| 邛崃市| 文安县| 灯塔市| 绩溪县| 商南县| 疏附县| 平南县| 凤庆县| 平塘县| 保德县| 霍林郭勒市| 安吉县| 安福县| 从江县| 鄯善县| 牡丹江市| 天台县| 安阳县| 织金县| 乐业县| 龙海市| 蛟河市| 高雄市| 喀什市| 嵊州市| 油尖旺区| 海晏县| 麻栗坡县| 六安市| 旺苍县| 周宁县| 商河县| 江川县|