溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

補(bǔ)充subprocess模塊和粘包現(xiàn)象及解決辦法是什么

發(fā)布時間:2021-12-08 14:26:36 來源:億速云 閱讀:124 作者:柒染 欄目:編程語言

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)補(bǔ)充subprocess模塊和粘包現(xiàn)象及解決辦法是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

  遠(yuǎn)程執(zhí)行命令,補(bǔ)充subprocess模塊,粘包現(xiàn)象及解決辦法

  1.subprocess模塊

  shell參數(shù):

  如果把shell設(shè)置成True,指定的命令會在shell里解釋執(zhí)行。

  subprocess.PIPE

  一個可以被用于Popen的stdin 、stdout 和stderr 3個參數(shù)的特輸值,表示需要創(chuàng)建一個新的管道。

  例:

  #author: wylkjj

  #date:2019/4/18

  import subprocess

  # b=subprocess.Popen('dir',shell=True)

  # print(b)

  #stdout=subprocess.PIPE把子進(jìn)程封裝到a里面去了

  a=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)

  # print(a)#多進(jìn)程,子進(jìn)程,父進(jìn)程同時進(jìn)行,誰快誰先打印

  print(str(a.stdout.read(),'gbk'))#把執(zhí)行結(jié)果從子進(jìn)程里面取出來

  2.遠(yuǎn)程執(zhí)行命令

  #author: wylkjj

  #date:2019/4/18

  #服務(wù)端

  import subprocess

  import socket

  sk=socket.socket()

  address=('127.0.0.1',8000)

  sk.bind(address)

  sk.listen(2)

  print('waiting')

  while 1:

  conn,addr=sk.accept()

  print(addr)

  while 1:

  data=conn.recv(4024)

  print('......'+str(data, 'utf8'))

  if not data:break

  obj = subprocess.Popen(str(data,'utf8'), shell=True, stdout=subprocess.PIPE)

  cmd_result = obj.stdout.read()

  # 獲取發(fā)送數(shù)據(jù)的大小 為int類型,int類型無法與bytes類型相互轉(zhuǎn)換,所以int要先轉(zhuǎn)換成str然后再轉(zhuǎn)換為bytes類型

  result_len=bytes(str(len(cmd_result)),'utf8')

  conn.sendall(result_len)

  conn.send(cmd_result)

  sk.close()

  #author: wylkjj

  #date:2019/4/18

  #客戶端

  import subprocess

  import socket

  sk=socket.socket()

  address=('127.0.0.1',8000)

  sk.connect(address)

  while True:

  inp = input('>>>')

  if inp=='exit':

  break

  sk.send(bytes(inp,'utf8'))

  result_len=int(str(sk.recv(1024),'utf8'))

  print(result_len)

  # 接收數(shù)據(jù),是bytes類型,數(shù)據(jù)量超過8k就不會接收,所以可以設(shè)置多次接收

  data = bytes()

  while len(data) != result_len: #判斷data的長度是否與server端傳來的長度相符

  recv = sk.recv(1024)

  data += recv

  print(str(data,'gbk'))

  sk.close()

  3.粘包現(xiàn)象及解決辦法

  #author: wylkjj

  #date:2019/4/18

  #服務(wù)端

  import subprocess

  import socket

  sk=socket.socket()

  address=('127.0.0.1',8000)

  sk.bind(address)

  sk.listen(2)

  print('waiting')

  while 1:

  conn,addr=sk.accept()

  print(addr)

  while 1:

  data=conn.recv(4024)

  print('......'+str(data, 'utf8'))

  if not data:break鄭州人流價格 http://www.zzzykdfk.com/

  obj = subprocess.Popen(str(data,'utf8'), shell=True, stdout=subprocess.PIPE)

  cmd_result = obj.stdout.read()

  # 獲取發(fā)送數(shù)據(jù)的大小 為int類型,int類型無法與bytes類型相互轉(zhuǎn)換,所以int要先轉(zhuǎn)換成str然后再轉(zhuǎn)換為bytes類型

  result_len=bytes(str(len(cmd_result)),'utf8')

  conn.sendall(result_len)

  conn.recv(1024) #因為兩個sand連一起發(fā)送會出現(xiàn)粘包現(xiàn)象,所以recv一下(利用recv的阻塞原理)

  conn.send(cmd_result)

  sk.close()

  #author: wylkjj

  #date:2019/4/18

  #客戶端

  import subprocess

  import socket

  sk=socket.socket()

  address=('127.0.0.1',8000)

  sk.connect(address)

  while True:

  inp = input('>>>')

  if inp=='exit':

  break

  sk.send(bytes(inp,'utf8'))

  result_len=int(str(sk.recv(1024),'utf8'))

  sk.sendall("ok")

  print(result_len)

  # 接收數(shù)據(jù),是bytes類型,數(shù)據(jù)量超過8k就不會接收,所以可以設(shè)置多次接收

  data = bytes()

  while len(data) != result_len: #判斷data的長度是否與server端傳來的長度相符

  recv = sk.recv(1024)

  data += recv

  print(str(data,'gbk'))

  sk.close()

上述就是小編為大家分享的補(bǔ)充subprocess模塊和粘包現(xiàn)象及解決辦法是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI