Python學習 :socket基礎

来源:https://www.cnblogs.com/ArticleYeung/archive/2019/03/26/10603430.html
-Advertisement-
Play Games

socket基礎 什麼是socket? - socket為介面通道,內部封裝了IP地址、埠、協議等信息;我們可以看作是以前的通過電話機撥號上網的年代,socket即為電話線 socket通信流程 我們通過下麵的圖來瞭解socket的通信流程 流程描述: - 1 伺服器根據地址類型(ipv4,ipv ...


 socket基礎

  什麼是socket?

  - socket為介面通道,內部封裝了IP地址、埠、協議等信息;我們可以看作是以前的通過電話機撥號上網的年代,socket即為電話線

  socket通信流程

  我們通過下麵的圖來瞭解socket的通信流程

 

  流程描述:

  - 1 伺服器根據地址類型(ipv4,ipv6)、socket類型、協議創建socket

  - 2 伺服器為socket綁定ip地址和埠號

  - 3 伺服器socket監聽埠號請求,隨時準備接收客戶端發來的連接,這時候伺服器的socket並沒有被打開

  - 4 客戶端創建socket

  - 5 客戶端打開socket,根據伺服器ip地址和埠號試圖連接伺服器socket

  - 6 伺服器socket接收到客戶端socket請求,被動打開,開始接收客戶端請求,直到客戶端返回連接信息。這時候socket進入阻塞狀態,

      所謂阻塞即accept()方法一直等到客戶端返回連接信息後才返回,開始接收下一個客戶端連接請求

  - 7 客戶端連接成功,向伺服器發送連接狀態信息

  - 8 伺服器accept方法返回,連接成功

  - 9 客戶端向socket寫入信息(或服務端向socket寫入信息)

  - 10 伺服器讀取信息(客戶端讀取信息)

  - 11 客戶端關閉

  - 12 伺服器端關閉

 

  socket 方法

  - socket 方法中有兩個參數:family、type

  family 的參數來確定伺服器之間的通信

  - family = AF_INET :  伺服器之間的通信

  - family = AF_INET6 :伺服器之間的通信

  - family = AF_UNIX : UNIX系統中的進程間的通信

  type 的參數來確定連接協議

  - type = SOCK_STREAM : 用來建立 TCP

  - type = SOCK_Dgram :     用來建立 UDP

  其他方法

sk.bind(address)
  #s.bind(address) 將套接字綁定到地址。address地址的格式取決於地址族。在AF_INET下,以元組(host,port)的形式表示地址。

sk.listen(backlog)
  #開始監聽傳入連接。backlog指定在拒絕連接之前,可以掛起的最大連接數量。
    #backlog等於5,表示內核已經接到了連接請求,但伺服器還沒有調用accept進行處理的連接個數最大為5
    #這個值不能無限大,因為要在內核中維護連接隊列

sk.setblocking(bool)
  #是否阻塞(預設True),如果設置False,那麼accept和recv時一旦無數據,則報錯。

sk.accept()
  #接受連接並返回(conn,address),其中conn是新的套接字對象,可以用來接收和發送數據。address是連接客戶端的地址。
  #接收TCP 客戶的連接(阻塞式)等待連接的到來

sk.connect(address)
  #連接到address處的套接字。一般,address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤。

sk.connect_ex(address)
  #同上,只不過會有返回值,連接成功時返回 0 ,連接失敗時候返回編碼,例如:10061

sk.close()
  #關閉套接字

sk.recv(bufsize[,flag])
  #接受套接字的數據。數據以字元串形式返回,bufsize指定最多可以接收的數量。flag提供有關消息的其他信息,通常可以忽略。

sk.recvfrom(bufsize[.flag])
  #與recv()類似,但返回值是(data,address)。其中data是包含接收數據的字元串,address是發送數據的套接字地址。

sk.send(string[,flag])
   #註意send發送的數據必須為byte
  #將string中的數據發送到連接的套接字。返回值是要發送的位元組數量,該數量可能小於string的位元組大小。即:可能未將指定內容全部發送。

sk.sendall(string[,flag])
  #將string中的數據發送到連接的套接字,但在返回之前會嘗試發送所有數據。成功返回None,失敗則拋出異常。
   #內部通過遞歸調用send,將所有內容發送出去。

sk.sendto(string[,flag],address)
  #將數據發送到套接字,address是形式為(ipaddr,port)的元組,指定遠程地址。返回值是發送的位元組數。該函數主要用於UDP協議。

sk.settimeout(timeout)
  #設置套接字操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時期。一般,超時期應該在剛創建套接字時設置,因為它們可能用於連接的操作(如 client 連接最多等待5s )

sk.getpeername()
  #返回連接套接字的遠程地址。返回值通常是元組(ipaddr,port)。

sk.getsockname()
  #返回套接字自己的地址。通常是一個元組(ipaddr,port)

sk.fileno()
  #套接字的文件描述符

簡單實現兩端聊天

------------------伺服器端------------------
import socket

# 創建socket對象,socket 預設的參數為 family = AF_INET 、type = SOCK_STREAM
sk = socket.socket()

address = ('127.0.0.1',8000)
# 綁定IP地址與埠
sk.bind(address)

# 最大的等待數為5
sk.listen(5)

print('server is waiting...')
# 進行阻塞,等待客戶端來連接
conn,addr = sk.accept()

# conn 為客戶端的socket對象
inp = input('>>>')
conn.send(bytes(inp,'utf-8'))

# conn.close()
# 關閉與客戶端的鏈接
-------------------------------------------

-------------------客戶端-------------------
import socket

sk = socket.socket()

address = ('127.0.0.1',8000)
sk.connect(address)
# 連接進入服務端

# recv也會進行阻塞,recv一次接收的內容最大為1024k
data = sk.recv(1024)
print(str(data,'utf-8'))

  上述例子,我們實現了服務端與客戶端的連接,併進行了聊天;

  - 首先,我們需要先打開服務端,此時服務端會進行阻塞,等待客戶端的接入

  - 接著,我們就可以打開客戶端連入服務端,此時即可以開始聊天

  在往後,我們還會學到服務端的併發聊天、遠程操作、文件上傳等相關操作


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題意 "題目鏈接" 題目鏈接 一種做法是直接用歐拉降冪算出$2^p \pmod{p 1}$然後矩陣快速冪。 但是今天學習了一下二次剩餘,也可以用通項公式+二次剩餘做。 就是我們猜想$5$在這個模數下有二次剩餘,拉個板子發現真的有。 然求出來直接做就行了 cpp include define Pair ...
  • 前幾天工作忙得焦頭爛額時,同事問了一下關於Map的特性,剎那間懵了一下,緊接著就想起來了一些關於Map的一些知識,因為只要涉及到Collection集合類時,就會談及Map類,因此理解好Map相關的知識是灰常重要的。 Collection集合類 與 Map類的層次結構,如下圖: Map是用來存儲 K ...
  • Mybatis-持久層的框架,功能是非常強大的,對於移動互聯網的高併發 和 高性能是非常有利的,相對於Hibernate全自動的ORM框架,Mybatis簡單,易於學習,sql編寫在xml文件中,和代碼分離,易於維護,屬於半ORM框架,對於面向用戶層面的互聯網業務性能和併發,可以通過sql優化解決一 ...
  • 題目: 給定一個單鏈表 L​1​​→L​2​​→⋯→L​n−1​​→L​n​​,請編寫程式將鏈表重新排列為 L​n​​→L​1​​→L​n−1​​→L​2​​→⋯。例如:給定L為1→2→3→4→5→6,則輸出應該為6→1→5→2→4→3。 輸入格式: 每個輸入包含1個測試用例。每個測試用例第1行給出 ...
  • java方法返回值與參數 例: public void a(int c){ //void 說明此方法沒有返回值,括弧里的叫參數,有數據類型和變數名組成,在方法里叫做形式參數簡稱形參。 } public int a(){ //這裡說明返回值是int整型,4位元組。 //返回關鍵字是return retu ...
  • 一、分散式鎖背景 a、什麼是鎖? 從使用場景定義:當存在多個線程可以同時改變某個變數時,就需要對變數或代碼塊做同步,使其在修改這種變數時能夠線性執行消除併發修改變數。 鎖的實現方式有多種,只要能滿足所有線程都能看得到這個鎖標記即可。 Java中常見的鎖: synchronized Reentrant ...
  • 實現目的:為了存儲了公共字典表主鍵的其他表在查詢的時候不用關聯查詢(所以攔截位置位於mybaits語句查詢得出結果集後) 項目環境 :springboot+mybaits 實現步驟:自定義註解——自定義實現mybaits攔截器——註冊mybaits攔截器 一、自定義註解 1.1 代碼示例 @Targ ...
  • 註意:如果使用notepad++編碼,在cmd控制台編譯時報錯(編碼GBK的不可映射字元),可以參考如下鏈接進行設置:https://jingyan.baidu.com/article/e3c78d649a56233c4c85f502.html 1.編寫案例演示每種不同數據類型的變數定義 /* 變數 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...