python socket實戰(二)

2021-02-20 大話性能

每周一總結,準時為你充電

上周講了1和2部分,這周接著講3和4,希望給以後用到socket編程的同學一些參考。
在真正的項目工程中,如果是涉及到底層到消息交互,譬如和硬體設備通信,都會自定義協商好交互到消息頭欄位。這個在c語言編程中尤為常見。例如,有一個如下到結構體,python如何用socket進行通信傳遞該消息呢。

# struct header {    

#   int buf1;    

#   double buf2;    

#   char buf3[11];    

# }   

此刻,我們就需要用到struct模塊,可以很方便到解決該問題。struct模塊中最重要的三個函數是pack(), unpack(), calcsize()# 按照給定的格式化字符串,把數據封裝成字符串(實際上是類似於c結構體的字節流)string = struct.pack(fmt, v1, v2, ...)# 按照給定的格式(fmt)解析字節流string,返回解析出來的tuple,tuple = unpack(fmt, string)# 計算給定的格式(fmt)佔用多少字節的內存offset = calcsize(fmt)

msg = "我正在學習python的網絡編程。"

msg_bs = msg.encode("utf-8")  # 將數據編碼轉為字節

res = struct.pack("i", len(msg_bs))  # 將字節數據的長度打包成固定長度(4)

在struct模塊中,將一個整型數字、浮點型數字或字符流(字符數組)轉換為字節流(字節數組)時,需要使用格式化字符串fmt告訴struct模塊被轉換的對象是什麼類型,比如整型數字是'i',浮點型數字是'f',一個ascii碼字符是's'。下表是常見到python類型、字節和格式符號到對應表。

小端字節序:低字節存於內存低地址;高字節存於內存高地址大端字節序:高字節存於內存低地址;低字節存於內存高地址。在fomat前面添加如下到符號,代表用什麼字節順序打包成字節流。<little-endian(小字節序)standardnone>big-endian(大字節序)standardnone!network (= big-endian)standardnone

那麼上面開頭到那個自定義結構體,該如何打包呢,其實也很簡單。

# struct header {    

#   int buf1;    

#   double buf2;    

#   char buf3[11];    

# }    

bin_buf_all = struct.pack('id11s', buf1, buf2, buf3)    ret_all = struct.unpack('id11s', bin_buf_all)    打包後到字節流就可以直接通過socket的send或sendall函數發出。當然通過socket的recv接收的字節流,可以通過struct的unpack成功解包出來。 socket.socket(socket_family,socket_type,protocol=0)socket.AF_UNIX 只能夠用於單一的Unix系統進程間通信socket.SOCK_STREAM  流式socket , for TCP (默認)socket.SOCK_DGRAM   數據報式socket , for UDPsocket.SOCK_RAW 原始套接字,普通的套接字無法處理ICMP、IGMP等網絡報文,而SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報文;此外,利用原始套接字,可以通過IP_HDRINCL套接字選項由用戶構造IP頭。socket.SOCK_RDM 是一種可靠的UDP形式,即保證交付數據報但不保證順序。SOCK_RAM用來提供對原始協議的低級訪問,在需要執行某些特殊操作時使用,如發送ICMP報文。SOCK_RAM通常僅限於高級用戶或管理員運行的程序使用。socket.SOCK_SEQPACKET 可靠的連續數據包服務0 (默認)與特定的地址家族相關的協議,如果是0,則系統就會根據地址格式和套接類別,自動選擇一個合適的協議s.bind() 綁定地址(ip地址,埠)到套接字,參數必須是元組的格式例如:s.bind(('127.0.0.1',8009))s.listen(5)  開始監聽,5為最大掛起的連接數s.accept()  被動接受客戶端連接,阻塞,等待連接s.connect() 連接伺服器端,參數必須是元組格式例如:s.connect(('127,0.0.1',8009))s.recv(1024)  接收TCP數據,1024為一次數據接收的大小s.send(bytes)  發送TCP數據,python3發送數據的格式必須為bytes格式s.sendall()  完整發送數據,內部循環調用sendsocket.recv(bufsize[, flags])socket.send(bytes[, flags])參數:同send,返回值:如果發送成功則返回None   否則返回異常這2個收發函數比較特殊,之前也沒什麼注意他們的參數和返回值,因為這裡涉及到緩衝區到問題。如果建立的另一端連結被斷開, 則recv立即返回空字符串recv是從接受緩衝區取出內容,當緩衝區為空則阻塞recv如果一次接受不完緩衝區的內容,下次執行會自動接受如果發送的另一端不存在則會產生Pipe Broken異常send是從發送緩衝區發送內容,當緩衝區為滿則堵塞所以其實數據真正交互到方式如下。如果當你在寫代碼到時候,發現一些和預期不一樣到結果時候,可以想想是否因為緩衝區到緣故。

另外給大家一個可以支撐百萬socket連接的server端代碼,供大家調試參考,主要是利用了python的gevent模塊的高性能。
# encoding: utf-8
"""@python: v3.5.4@author: hutong@file: tcpserver.py@time: 2019/5/23 下午2:52"""import geventfrom gevent import monkey; monkey.patch_all()from gevent.server import StreamServer#from __future__ import print_function import json
"""測試socket可以支撐百萬連結的服務端demo""" def handle(socket, address): print(address) while True: data = socket.recv(1024) print(data.decode()) gevent.sleep(1) reback = {'msg':'ok'} socket.send(json.dumps(reback).encode())
if __name__ == "__main__":import sysport = 8088# default backlog is 256server = StreamServer(('127.0.0.1', port), handle, backlog=4096)server.serve_forever()

如果文章對你有幫助,

還請幫忙轉發轉發,謝謝。

問題交流/稿件投遞

免費領取例子腳本和代碼

免費入微信群交流

免費PMP考試諮詢

掃一掃,加小T

相關焦點

  • python socket實戰(一)
    每周一07:22,準時為你充電最近一直在用python編寫socket
  • python筆記28(TCP,UDP,socket協議)
    4、代碼部分:①介紹socket;②使用socket完成tcp協議的web通信;③使用socket完成udp協議的web通信。中文名:套接字python socket模塊 完成socket的功能工作在應用層和傳輸層 之間的抽象層 幫助我們完成了所有信息的組織和拼接socket對於程式設計師來說,已經是網絡操作的底層了。
  • Python入門基礎之socket多線程編程,TCP伺服器和客戶端通信
    在上一篇文章中,我介紹了一下python3 socket編程的基礎,包括TCP、UDP客戶端和伺服器的建立過程(連結在最下方)。不過那個只是單線程的,伺服器一次只能和一個客戶端會話,多個客戶端的話只能等待。我們平時的應用中,伺服器肯定是要並發的,所以,今天將介紹socket編程的多線程編程。
  • 用python編寫TCP Socket伺服器,C語言嵌入式工程師的玩法
    圖6、導入模塊與全局變量定義con_list列表保存連接的socket句柄;out_list列表保存有數據要發送的socket句柄;圖8、Tcp Socket線程Tcp Socket線程不斷地監聽設備的Tcp Client連接,然後將接收的數據傳送給data proc線程處理;同時,將data pro線程的需要發送的數據,通過socket
  • python socket編程的理解
    編寫server的步驟第一步創建socket對象。調用socket構造函數。如:socket = socket.socket( family, type )family參數代表地址家族,可為AF_INET或AF_UNIX。
  • 如何利用socket進行通信?
    什麼是socket在python中要相互通信,可以使用socket這個模塊來實現,socket是對TCP/IP協議的封裝,socket本身並不是協議,而是一個調用接口(API),通過socket,我們才能使用TCP/IP協議來發送數據和接收數據。
  • Python Socket 編程學習筆記
    Python中的Socket模塊2.1 Socket類型socket.AF_INET : 基於IPV4方式的網絡通信socket.AF_INET : 基於IPV6方式的網絡通信socket.SOCK_STREAM :基於TCP的流式socket通信socket.SOCK_DGRAM
  • Python基於Socket實現群聊
    1.1 socket模塊:要創建套接字,必須使用套接字模塊中的socket.socket()函數,該函數具有一般語法s = socket.socket (socket_family, socket_type, protocol = 0)1.2
  • 簡單說說Python Socket編程步驟?
    所以,我們無需深入理解tcp/udp協議,socket已經為我們封裝好了,我們只需要遵循socket的規定去編程,寫出的程序自然就是遵循tcp/udp標準的。Python 提供了兩個基本的 socket 模塊。第一個是 Socket,它提供了標準的 BSD Sockets API。第二個是 SocketServer, 它提供了伺服器中心類,可以簡化網絡伺服器的開發。
  • Linux系統下socket編程socket接口介紹(二)
    函數介紹- 發送和接收 -(1)send和write:首先說明的一點,之前介紹的socket這個函數,非常類似我們之前介紹的open函數,他們都會返回一下文件描述符>說明:         第一個參數sockfd就是socket函數返回的文件描述符;第二個參數指向發送的信息所在的緩衝區(內存);第三個參數指緩衝區的長度大小;第四個參數一般設置為0(如果不是這種情況,可以具體再查看)。
  • Python網絡編程socket模塊實例解析
    socket就是該模式的一個實現,socket即是一種特殊的文件,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉)。(1)利用socket進行簡單的連結Python裡面的socket支持UDP、TCP、以及進程間的通信,socket可以把我們想要發送的東西封裝起來,發送過去,然後反解成原來的樣子,事實上網路通信可以理解成都是建立在socket之上,下面的代碼是演示利用socket進行簡單的連結#要成一次通信,至少要有兩個人,也就是一個服務端
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    網絡爬蟲 26機器學習入門篇 27機器學習入門篇2 28機器學習提升篇 29數據挖掘篇 30深度學習必備原理與實戰 31深度學習必備原理與實戰2 32深度學習必備原理與實戰3 33深度學習必備原理與實戰4 34深度學習項目實戰 35深度學習項目實戰2
  • Python筆記
    安裝python安裝python解釋器
  • Python面試
    /usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2021-02-25 23:53"""1、文件操作時xreadlines和readlinesreadlines()是把文件的全部內容讀到內存中,並解析成一個list,當文件的體積很大時,需要佔用很多neicunxreadlines()則直接返回一個
  • 通信框架 smart-socket 1.4.10 發布,bug 修復與示例補充
    smart-socket 是一個 AIO 通信框架,可以快速、輕鬆地開發 Client/Server 網絡應用程式。
  • 20-python高級篇-如何實現client和server間的通信
    每天和小潭一起快樂的學習~    你好,我是在學python我們通過昨天的文章19-python高級篇-http,socket和tcp的關係認識了http,socket和tcp三者之間的區別和聯繫,今天我們將學習如何實現client和server間的通信。(一)socket編程流程    每一個應用程式佔用一個埠,埠號唯一。socket編程中需要首先綁定協議,地址和埠。
  • Python3 網絡編程|python|伺服器|應用程式|調用|tcp_網易訂閱
    s.makefile()  創建一個與該套接字相關連的文件  簡單實例  服務端  我們使用 socket 模塊的 socket 函數來創建一個 socket 對象。socket 對象可以通過調用其他函數來設置一個 socket 服務。
  • 如何入門Python之Python基礎教程詳解
    2的區別9.Python 2to3:自動將Python 2.x代碼轉換成Python3.x代碼10.Windows安裝Python11.Linux安裝Python12.Mac安裝Python環境13.python
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • 總結37題Python面試題,快收藏!
    點擊上方「Python人工智慧編程」,馬上關注1. python多線程(1)python下多線程的限制以及多進程中傳遞參數的方式python多線程有個全局解釋器鎖(global interpreter lock),這個鎖的意思是任一時間只能有一個線程使用解釋器,跟單cpu跑多個程序一個意思,大家都是輪著用的,這叫「並發」,不是「