1. 程式人生 > >網絡編程雜項2

網絡編程雜項2

while 否則 導入 進程 結果 erro 在一起 pri 套接字

import socket #模塊導入
import subprocess
sk = socket.socket() #創建套接字
sk.bind((‘127.0.0.1‘,8000)) #綁定ip 端口
sk.listen(5)

while True: #循環接受用戶請求
conn,addr = sk.accept() #接受用戶信息和ip地址
while True:
try:
cmd = str(conn.recv(1024),‘utf-8‘) #把用戶信息接受utf-8
if cmd: #判斷是否為空
print(‘>>>:‘,cmd) #服務端打印命令

obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
#調用Popen類相當於終端把,cmd命令,shell=True設置異常,最好為真,stdout或stderr標準正確輸出和錯誤輸出
if not obj.wait():#等待子進程返回0 或 不正常
cmd_result = obj.stdout.read()
#正常情況下接受執行結果

else:
print(‘錯誤:‘)#否則錯誤
cmd_result = obj.stderr.read()
#接受錯誤信息
print(str(cmd_result,‘gbk‘))
#在服務器端打印錯誤信息
result_len = bytes(str(len(cmd_result)),‘utf-8‘)
#獲取結果的長度

conn.send(result_len)#結果的長度發送給客戶端
conn.recv(1024) #防止黏包,一根面條剪一下,是不是就不會黏在一起了
conn.sendall(cmd_result)#把執行結果發送給客戶端
else:
conn.close() #客戶端退出,則關閉這個連接,退出循環等待下個連接
break

except ConnectionRefusedError as e: #防止客戶異常退出,打印異常退出循環,監聽下個
print(e)
break
import socket #模塊
sk = socket.socket() #套接字
sk.connect((‘127.0.0.1‘,8000)) #ip地址 端口
while True: #循環發送消息
cmd = input(‘>>>:‘).strip() #命令,.strip()去除換行空格
if cmd == ‘exit‘: #exit退出連接
sk.close()
break
sk.send(bytes(cmd,‘utf-8‘))#命令以utf-8字符格式並以二進制格式發送過去
result_len = int(str(sk.recv(1024),‘utf-8‘))
#接受服務器發送結果的長度
sk.send(bytes(‘ok‘,‘utf-8‘))
#防止數據粘連
print(result_len)
date = bytes() #二進制格式來接受執行結果
while len(date) != result_len: #循環接受結果
date += sk.recv(1024)
print(str(date,‘gbk‘)) #打印結果

網絡編程雜項2