欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中的tcp示例詳解

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

TCP簡介

TCP介紹

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

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

TCP通信模型中,在通信開始之前,一定要先建立相關的鏈接,才能發(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的不同點

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

udp通信模型

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

TCP通信模型

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

tcp客戶端

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

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

import socket


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

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

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

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

if __name__ == "__main__":

  main()

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

在網(wǎng)絡調(diào)試助手中啟動tcp服務器進行交互:

tcp服務器

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

  • socket創(chuàng)建一個套接字
  • bind綁定ip和port
  • listen使套接字變?yōu)榭梢员粍渔溄?/li>
  • 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用來為這個客戶端服務
  client_socket, client_addr = tcp_server_socket.accept() 
 
  # 5.接收對方發(fā)送的數(shù)據(jù)
  recv_data = client_socket.recv(1024) 
  print("接收到的數(shù)據(jù):%s" % recv_data.decode("utf-8"))
 
  # 6.給對方發(fā)送數(shù)據(jù)
  client_socket.send("hahaha".encode("utf-8")) 

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


if __name__ == "__main__":
  main()

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

在網(wǎng)絡調(diào)試助手中啟動tcp服務器進行交互:


tcp注意點

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

總結(jié)

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

相關文章

  • Python裝飾器知識點補充

    Python裝飾器知識點補充

    本篇文章給大家補充了關于Python裝飾器的相關知識點內(nèi)容,大家可以跟著學習參考下。
    2018-05-05
  • Python中__str__()方法的實用技巧分享

    Python中__str__()方法的實用技巧分享

    在Python編程中,__str__()是一個特殊方法,它允許自定義對象的字符串表示形式,本文將深入探討__str__()的相關實用技巧,希望對大家有所幫助
    2023-11-11
  • 用Python實現(xiàn)局域網(wǎng)控制電腦

    用Python實現(xiàn)局域網(wǎng)控制電腦

    大家好,本篇文章主要講的是用Python實現(xiàn)局域網(wǎng)控制電腦,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 基于Python制作天眼查小程序的示例代碼

    基于Python制作天眼查小程序的示例代碼

    本文主要介紹了如何利用Python制作一個天眼查GUI程序。這次的GUI程序,我們使用的框架是PyQt5,該框架擁有比tkinter更為豐富的內(nèi)置組件,在界面美化方面,貌似也更勝一籌,快跟隨小編一起學起來吧
    2022-09-09
  • Python查找算法之插補查找算法的實現(xiàn)

    Python查找算法之插補查找算法的實現(xiàn)

    這篇文章主要介紹了Python查找算法之插補查找算法的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • python如何生成任意n階的三對角矩陣

    python如何生成任意n階的三對角矩陣

    這篇文章主要介紹了python如何生成任意n階的三對角矩陣,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python生成excel的實例代碼

    python生成excel的實例代碼

    這篇文章主要為大家詳細介紹了python生成excel的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • python的pygal模塊繪制反正切函數(shù)圖像方法

    python的pygal模塊繪制反正切函數(shù)圖像方法

    在本篇文章中我們給大家整理了關于如何用python的pygal模塊繪制反正切函數(shù)圖像的知識點內(nèi)容,有需要的朋友們可以學習下。
    2019-07-07
  • Python關鍵字?asynico基本用法

    Python關鍵字?asynico基本用法

    asyncio是Python的異步編程庫,用于編寫并發(fā)程序,它提供了一組基于協(xié)程的工具,可以幫助你實現(xiàn)異步網(wǎng)絡通信、并發(fā)計算等任務,這篇文章主要介紹了Python關鍵字?asynico,需要的朋友可以參考下
    2023-01-01
  • Django基礎知識與基本應用入門教程

    Django基礎知識與基本應用入門教程

    這篇文章主要介紹了Django基礎知識與基本應用,結(jié)合實例形式分析了Django框架基本的項目創(chuàng)建、啟動、查看版本等操作,并結(jié)合一個簡單的blog應用示例分析了Django的基本使用方法,需要的朋友可以參考下
    2018-07-07

最新評論