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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...