Python高級網絡編程系列之基礎篇

一、Socket簡介

1、不同電腦上的進程如何通信?

  進程間通信的首要問題是如何找到目標進程,也就是操作系統是如何唯一標識一個進程的!

  在一臺電腦上是只通過進程號PID,但在網絡中是行不通的,因為每臺電腦的IP可能都是不一樣的,因此TCP/IP協議族通過使用IP地址+端口號的方式來標識任意一臺主機的應用進程。

  因此,利用IP地址 + 協議 + 端口號就可以用來標識網絡進程了,網絡中可以利用這個標識來與其他進程通信。

?

2.什么是socket

  Socket簡稱為套接字,是進程間通信的一種方式,它與其他進程間通信的一個不同之處在于:它能實現不同主機間的進程間通信,網絡上各種各樣的服務大多是基于Socket來完成的。

?

二、TCP簡介

  1.介紹:TCP協議,傳輸控制協議(Transmission Control Protocol)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。

  2.通信流程:建立連接、數據傳輸、終止連接,就類似我們生活中的“打電話”。

三、TCP特點:

   1.面向連接:通信前必須先建立連接才能進行數據傳輸,雙方都必須為該連接分配必要的系統內核資源。

   2.可靠傳輸:主要體現在:

     1). TCP采用發送應答機制:TCP發送的每個報文都必須得到接收方的應答才能成功傳輸該報文。

     2). 超時重傳:如果發出的報文在一段時間內沒有收到應答那么就重新發送這個報文段。此外,TCP是為每個包都分配一個序號,用來保證不會發送方丟包和用于在接收端重組。

     3). 錯誤檢驗:TCP用一個校驗和函數來校驗數據是否有誤,

    ? ?4). 流量控制和阻塞管理:用來避免主機發送得過快而使接收方來不及全部收下。

?

四、UDP協議

  UDP是一中無需建立連接就能通信的協議,只需要發送數據即可。因此一般適用于廣播的應用程序。

?

五、TCP與UDP的不同點

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

?

六、TCP/IP協議族

  互聯網協議包含了上百種協議標準,但是最重要的兩個協議是TCP和IP協議,因此一般把互聯網的協議簡稱為TCP/IP協議族。

?

七、TCP/IP協議傳輸示意圖

  以QQ間發送消息為例!

  

?

八、TCP通信模型

  主要是使用TCP協議來進行通信!

  

?  

  注意點:

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

?

代碼實現如:

 1 import socket
 2 
 3 
 4 def main():
 5     pass
 6     # 1.創建TCP套接字
 7     tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 8     # 設置地址可重用
 9     tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
10     # 2.把套接字綁定到主機上
11     tcp_sock.bind(('', 6060))
12     # 3.被動套接字
13     tcp_sock.listen(128)
14     print('{}正在監聽中'.format(tcp_sock.getsockname()))
15     # 4.與客戶端進行連接
16     while True:
17         client, addr = tcp_sock.accept() # Ctrl+Shift +i
18         print('已經連接到了客戶端:{}'.format(addr))
19         # 接收來自客戶端的消息
20         data = client.recv(1024)
21         print(data.decode('utf-8'))
22         # 消息一經發送完畢就斷開了連接
23         client.close() # 短連接
24 
25     tcp_sock.close()
26     
27     
28 if __name__ == '__main__':
29     main()

?

轉載于:https://www.cnblogs.com/fangtaoa/p/9041603.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390450.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390450.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390450.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多線程編程和單線程編程_生活與編程的平行線程

多線程編程和單線程編程I’m convinced our deepest desire is, by paying the cost of time, to be shown a glimmer of some fundamental truth about the universe. To hear it whisper its lessons and point towards its purpose.我堅信,我們最深切的愿望是通過…

劍指 Offer 67. 把字符串轉換成整數

寫一個函數 StrToInt,實現把字符串轉換成整數這個功能。不能使用 atoi 或者其他類似的庫函數。 首先,該函數會根據需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符為止。 當我們尋找到的第一個非空字符為正或者負號時&#xff0c…

搭建MSSM框架(Maven+Spring+Spring MVC+MyBatis)

https://github.com/easonjim/ssm-framework 先欠著&#xff0c;后續再進行講解&#xff1a; 一、Spring內核集成 二、Spring MVC集成 三、MyBatis集成 四、代碼生成工具集成 >如有問題&#xff0c;請聯系我&#xff1a;easonjim#163.com&#xff0c;或者下方發表評論。<…

4.RabbitMQ Linux安裝

這里使用的Linux是CentOS6.2 將/etc/yum.repo.d/目錄下的所有repo文件刪除 先下載epel源 # wget -O /etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo 修改epel-erlang.repo文件&#xff0c;如下圖 添加CentOS 的下載源…

freecodecamp_如何對freeCodeCamp文章提供反饋

freecodecampWe at the freeCodeCamp editorial team do our best to ensure articles are as accurate as they can be.我們的freeCodeCamp編輯團隊竭盡所能&#xff0c;以確保文章盡可能準確。 Still, we occasionally miss factual inaccuracies, non-functioning code exa…

如何對接oracle 建立pdb

Oracle數據庫的結構是一個數據庫實例下有許多用戶&#xff0c;每一個用戶有自己的表空間&#xff0c;即每一個用戶相當于MySQL中的一個數據庫。不久前下了oracle 12c的數據庫&#xff0c;安裝之后建user時才知道oracle12c 有一個很大的變動就是引入了pdb可插入數據庫&#xff0…

二、數據庫設計與操作

一、 數據庫設計仿QQ數據庫一共包括5張數據表&#xff0c;每張數據表結構如下&#xff1a;1、 tb_User&#xff08;用戶信息表&#xff09;這張表主要用來存儲用戶的好友關系與信息字段名數據類型是否Null值默認值綁定描述IDint否用戶賬號PwdVarchar(50)否用戶密碼Frie…

hdu 過山車_從機械工程師到軟件開發人員–我的編碼過山車

hdu 過山車There arent many people out there who grew up dreaming of writing code. I definitely didnt. I wanted to design cars. But somehow I ended up building software.很少有人夢見編寫代碼。 我絕對沒有。 我想設計汽車。 但是我最終以某種方式開發了軟件。 I u…

mysql 兩列互換

mysql 如果想互換兩列的值&#xff0c;直接寫 update 表 set col1col2&#xff0c;col2col1 這樣的后果就是兩列都是 col2 的值 注意這和sql server 是不同的&#xff0c; 如果想實現上述功能&#xff0c;添加一個自增列作為標識&#xff08;必須的&#xff09;&#xff0c; u…

劍指 Offer 36. 二叉搜索樹與雙向鏈表

輸入一棵二叉搜索樹&#xff0c;將該二叉搜索樹轉換成一個排序的循環雙向鏈表。要求不能創建任何新的節點&#xff0c;只能調整樹中節點指針的指向。 為了讓您更好地理解問題&#xff0c;以下面的二叉搜索樹為例&#xff1a; 我們希望將這個二叉搜索樹轉化為雙向循環鏈表。鏈表…

游戲引擎開發和物理引擎_視頻游戲開發的最佳游戲引擎

游戲引擎開發和物理引擎In this article, well look at some of the most popular game engines for video game development. Youll get a brief overview of each engine so you can choose which to use for your project.在本文中&#xff0c;我們將介紹一些用于視頻游戲開…

TPS和QPS的區別和理解

TPS和QPS的區別和理解 原創 2016年04月26日 17:11:3114010QPS&#xff1a;Queries Per Second意思是“每秒查詢率”&#xff0c;是一臺服務器每秒能夠相應的查詢次數&#xff0c;是對一個特定的查詢服務器在規定時間內所處理流量多少的衡量標準。 TPS&#xff1a;是Transaction…

1893. 檢查是否區域內所有整數都被覆蓋

theme: healer-readable 給你一個二維整數數組 ranges 和兩個整數 left 和 right 。每個 ranges[i] [starti, endi] 表示一個從 starti 到 endi 的 閉區間 。 如果閉區間 [left, right] 內每個整數都被 ranges 中 至少一個 區間覆蓋&#xff0c;那么請你返回 true &#xff…

004-docker常用命令[二]-容器操作ps,top,attach,export

2.3、容器操作 2.3.1、docker ps docker ps : 列出容器 語法 docker ps [OPTIONS] OPTIONS說明&#xff1a; -a :顯示所有的容器&#xff0c;包括未運行的。 -f :根據條件過濾顯示的內容。 --format :指定返回值的模板文件。 -l :顯示最近創建的容器。 -n :列出最近創建的n…

【類】變量復用,函數復用

變量復用 變量復用&#xff0c;適用于以下場景&#xff1a;1&#xff0c;整個項目公用的部分&#xff08;比如errors&#xff09;&#xff1b;2&#xff0c;一組類要通信&#xff0c;或者同一個類的兩個函數之間要通信&#xff0c;通信數據可以用類來定義和約束&#xff1b; 場…

python練習_如何使用Logzero在Python中練習記錄

python練習Logzero is a Python package created by Chris Hager that simplifies logging with Python 2 and 3. Logzero makes it easier as a print statement to show information and debugging details.Logzero是Chris Hager創建的Python程序包&#xff0c;它簡化了Pytho…

1736. 替換隱藏數字得到的最晚時間

給你一個字符串 time &#xff0c;格式為 hh:mm&#xff08;小時&#xff1a;分鐘&#xff09;&#xff0c;其中某幾位數字被隱藏&#xff08;用 ? 表示&#xff09;。 有效的時間為 00:00 到 23:59 之間的所有時間&#xff0c;包括 00:00 和 23:59 。 替換 time 中隱藏的數…

電腦棒安裝linux_為什么要使用Linux? Linux很棒的11個理由

電腦棒安裝linuxIn this article, well look at some of the things developers love about Linux so you can decide if its right for you.在本文中&#xff0c;我們將研究開發人員對Linux的一些喜愛&#xff0c;以便您可以確定它是否適合您。 持續有效的改進。 (Constant a…

1743. 從相鄰元素對還原數組

存在一個由 n 個不同元素組成的整數數組 nums &#xff0c;但你已經記不清具體內容。好在你還記得 nums 中的每一對相鄰元素。 給你一個二維整數數組 adjacentPairs &#xff0c;大小為 n - 1 &#xff0c;其中每個 adjacentPairs[i] [ui, vi] 表示元素 ui 和 vi 在 nums 中相…

十 web爬蟲講解2—Scrapy框架爬蟲—Scrapy安裝—Scrapy指令

Scrapy框架安裝 1、首先&#xff0c;終端執行命令升級pip: python -m pip install --upgrade pip2、安裝&#xff0c;wheel(建議網絡安裝) pip install wheel3、安裝&#xff0c;lxml(建議下載安裝)4、安裝&#xff0c;Twisted(建議下載安裝)5、安裝&#xff0c;Scrapy(建議網絡…