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

Python socket 套接字實現(xiàn)通信詳解

 更新時間:2019年08月27日 11:55:26   作者:月下獨愁人  
這篇文章主要介紹了Python socket 套接字實現(xiàn)通信詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

首先:我們介紹一下socket什么是socket:

1. socket 在操作系統(tǒng)中它是處于應用層與傳輸層的抽象層,它是一組操作起來非常簡單的接口(接收數(shù)據(jù)的),此接口接受數(shù)據(jù)之后交個操作系統(tǒng)

那么為什么?直接給操作系統(tǒng)不是更方便嗎?那么你就想錯了

因為操作系統(tǒng)的接口遠比我們想象的要丑陋復雜,使用操作系統(tǒng)交換數(shù)據(jù),非誠繁瑣,,開發(fā)者們只能想辦法讓一個中間人和他們打交道,來簡單的實現(xiàn)數(shù)據(jù)交換,那么就是socket套接字.它的作用就是:與操作系統(tǒng)之間數(shù)據(jù)交換將這些繁瑣的操作,進行高度化封裝,和簡化,

2.我們能夠用它實現(xiàn)簡單的通信

在Python中有一個簡單的內(nèi)置socket 模塊我們可以用它實現(xiàn)簡單的基于TCP協(xié)議的通信

 #基于切換連接的循環(huán)通信
 import socket #首先我們在文件中導入socket 模塊
 phone = socket.socket() #實例化一個對象
 phone.bind(('127.0.01',8765))#bind是存放ip地址的(這里存放的是本地的IP地址)
 phone.listen(5)#可以設置連接的個數(shù),
 while 1:#循環(huán)等待連接
  conn,adds = phone.accept()
  while 1:#要循環(huán)聊天我們要重復接收發(fā)送
   try: #異常處理
    receives_commands = conn.recv(1024) #接收命令請求,最多接收1024字節(jié)當然你也可以調整
    receivse_commands = receives_commands.decode('utf-8')#網(wǎng)絡傳輸是以字節(jié)的形勢的所以我們要進行解碼
    print(f'來自客戶端的消息{receives_commands}') #打印消息
    if receives_commands.upper(0 == 'Q':break #正常結束
    dispatch_orders = inport('請輸入:').strip().encode('utf-8')
    conn.send(dispatch_orders)
   except ConnectionResetError:#客戶端異常結束
    print('客戶端終端')
    break
  conn.close() #關閉連接
 phone.close#關閉服務端
 #客戶端
 import socket
 phone = socket.socket()
 phone.connect(('127.0.01',8765))  #連接服務端地址   
 while 1:     
  dispatch_orders = inport('請輸入:').strip().encode('utf-8')#發(fā)送請求
  if not dispatch_orders:print('不能為空')#不能為空
  phone.send(dispatch_orders)  #發(fā)送      
  if dispatch_orders.upper() ==b'Q':#正常退出
   break
  receives_commands = phone.recv(1024)#接收服務端的回執(zhí)
  receives_commands = receives_commands.decode('utf-8')#解碼
  print(f'來自客戶端的消息{receives_commands}') #打印        
 phone.close()#關閉客戶端

那么我們就通過socket實現(xiàn)了一個簡單的通信鏈接循環(huán)

其中我們需要注意的是:

1.阻塞 accept 和recv 當服務器和客戶端都屬于同種類阻塞時,那么誰都是同步接受或同步發(fā)送的狀態(tài)那么是處于靜止的,這樣是不合理的(就是bug)

2.當我們設計時我們需要知道發(fā)送不能為空,不然服務端是接收不到消息的所以我們設置一個判斷
有時我們會發(fā)現(xiàn)當我們接受的超過1024字節(jié)會發(fā)生什么?

那么下面我們就來將回答下這個問題:

下面我們引入一個操作系統(tǒng)的模塊

Python中 subprocess 模塊就是用來和cmd 命令行進行交流的模塊

 obj = subprocess.Popen('dir',#實例化對象括號內(nèi)第一個參數(shù)就是我們的cmd命令行的命令,這里我們寫的是dir顯示文件夾中內(nèi)容
         shell=True,
         stdout=subprocess.PIPE,
         stderr=subprocess.PIPE,
         )
   print(obj.stdout.read().decode('gbk')) # 正確命令
   print(obj.stderr.read().decode('gbk')) # 錯誤命令

那么我們在這個基礎上建立一個服務端響應客戶端命令的機制

import socket
import subprocess
phone = socket.socket()
phone.bind(('127.0.01',8695))
phone.listen(5)
while 1:
 conn,adds = phone.accept()
 while 1:
  try:
   receives_commands = conn.recv(1024)
   if receiver_commands ==b'Q':break 
   #obj = subprocess.Popen(Receiving_instructiors,
         # shell= True,
       #stdout = subprocess.PIPE,
       #stderr = subprocess.PIPE
         )
  obj = subprocess.Popen(receives_commands.decode('utf-8')#動態(tài)的傳入命令
       shell = True
       stdout = subprocess.PIPE
       stderr = subprocess.PIPE 
       )
 # print(obj.stdout.read().decode('gbk')) # 正確命令
 # print(obj.stderr.read().decode('gbk')) # 錯誤命令
  ret = obj.stodut.read()+obj.stderr.read()#將產(chǎn)生的內(nèi)容進行拼接
  conn.send(ret)
 except ConnectionResetError:
   print('客戶端終端')
   break 
 conn.close()
phone.close()
import socket
phone = socket.socket()
phone.connect(('127.0.01',8695))
while 1:
 dispatch_orders = inport('請輸入命令:').strip().encode('utf-8')
 if not dispatch_orders:print('輸入不能為空')
 phone.send(dispatch_orders)
 if dispatch_orders.upper() ==b'Q':break
 receives_commands = phone.recv(1024)
 receives_commands = receives_commands.decode('utf-8')
 print(f'來自客戶端的消息{receives_commands}')
phone.close()  

那么我們就會發(fā)現(xiàn)一個問題,當我們輸入的help命令的時候超過了1024字節(jié)那么怎么辦

還發(fā)現(xiàn)一個問題那就是當我們輸入的下個命令時,還是出來help命令的未傳輸完成的那部分那么就是這就是粘包了

那么是什么造成的呢?

怎樣解決呢?

下次講解

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python隨機生成數(shù)模塊random使用實例

    Python隨機生成數(shù)模塊random使用實例

    這篇文章主要介紹了Python隨機生成數(shù)模塊random使用實例,本文直接給出示例代碼,需要的朋友可以參考下
    2015-04-04
  • Python3多線程操作簡單示例

    Python3多線程操作簡單示例

    這篇文章主要介紹了Python3多線程操作,結合實例形式分析了Python3兼容Python2使用_thread進行多線程操作的簡單實現(xiàn)技巧,需要的朋友可以參考下
    2018-05-05
  • tensorflow 獲取模型所有參數(shù)總和數(shù)量的方法

    tensorflow 獲取模型所有參數(shù)總和數(shù)量的方法

    今天小編就為大家分享一篇tensorflow 獲取模型所有參數(shù)總和數(shù)量的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Django 登錄注冊的實現(xiàn)示例

    Django 登錄注冊的實現(xiàn)示例

    本文主要介紹了Django 登錄注冊的實現(xiàn)示例,這是做網(wǎng)頁登錄和注冊基本上都是必要一步,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 詳解DeBug Python神級工具PySnooper

    詳解DeBug Python神級工具PySnooper

    這篇文章主要介紹了詳解DeBug Python神級工具PySnooper,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • Python文件讀寫及常用文件的打開方式

    Python文件讀寫及常用文件的打開方式

    這篇文章主要介紹了Python文件讀寫及常用文件的打開方式,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • 利用python實現(xiàn)數(shù)據(jù)分析

    利用python實現(xiàn)數(shù)據(jù)分析

    為什么要利用python進行數(shù)據(jù)分析?python擁有一個巨大的活躍的科學計算社區(qū),擁有不斷改良的庫,能夠輕松的集成C,C++,Fortran代碼(Cython項目),可以同時用于研究和原型的構建以及生產(chǎn)系統(tǒng)的構建。
    2017-01-01
  • python OpenCV學習筆記

    python OpenCV學習筆記

    這篇文章主要介紹了python OpenCV的相關資料,幫助大家更好的理解和學習使用python的opencv,感興趣的朋友可以了解下
    2021-03-03
  • Django集成celery發(fā)送異步郵件實例

    Django集成celery發(fā)送異步郵件實例

    今天小編就為大家分享一篇Django集成celery發(fā)送異步郵件實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python文件目錄操作常用模塊的使用詳解

    Python文件目錄操作常用模塊的使用詳解

    Python中用于文件目錄操作的常用模塊有os, shutil,pathlib等。os模塊提供的就是各種 Python 程序與操作系統(tǒng)進行交互的接口。shutil模塊是對os模塊的補充,主要針對文件的拷貝、刪除、移動、壓縮和解壓操作
    2022-07-07

最新評論