鏈結迴圈 模擬遠端執行命令 實現大檔案上傳

2022-07-29 15:36:22 字數 4499 閱讀 8590

迴圈鏈結

###服務端

import socket

server = socket.socket()

server.bind(('127.0.0.1',8080))

server.listen(5)

###要實現迴圈鏈結,也就是乙個鏈結段了之後,我們又可以繼續鏈結其他的

##服務端要提供持續不斷的服務

while true:

conn, addr = server.accept()

while true:

try:

data = conn.recv(1024)  # b''

if len(data) == 0:break  # 針對mac linux系統而言

print(data)

conn.send(data.upper())

except connectionreseterror:

break

conn.close()

server.close()

###這個**變成黃色,表示**永遠執行不到這裡,

###上面是乙個死迴圈,這個pycharm 自動檢測到後的提示

##客戶端

import socket

client = socket.socket()

client.connect(('127.0.0.1',8080))

while true:

msg = input('please input your msg>>>:').encode('utf-8')

if len(msg) == 0:continue

client.send(msg)

data = client.recv(1024)

print(data)

模擬遠端執行命令

##現在我們要寫乙個cs框架的程式,在之前的基礎上,

##實現模擬遠端輸入乙個命令,伺服器執行,並將執行的結果傳送給本地主機,並且列印出來

##但是因為執行的結果可能很長,所以會有粘包問題的產生 所以我們要重點解決粘包的問題

'''解決思路:

1,客戶端將命令傳送到服務端, 服務端接收命令,這個接收命令就直接接收1024位元組就可以  因為命令的長度一般不可能超過這個長度

2,服務端呼叫subprocess 模組,執行命令,然後得到執行的結果

3,因為執行得到的結果長度不確定,可能很大,也可能很小,所以我們需要將提前將結果的長度發過去

4,我們直接len() 得到需要傳過去的資料的長度,然後利用 struct 模組,將這個長度資料轉化成

##固定長度的資料 傳送過去

5,客戶端接收到這個資料長度之後,如果資料量很大,就迴圈接收拼接這個資料,然後將資料列印出來

'''###服務端

import socket

import subprocess

import struct

import json

server = socket.socket()

server.bind(('127.0.0.1',8080))

server.listen(5)

while true:

conn, addr = server.accept()

while true:

try:

cmd = conn.recv(1024).decode('utf-8')

if len(cmd) == 0:break

obj = subprocess.popen(cmd,shell=true,stdout=subprocess.pipe,stderr=subprocess.pipe)

stdout = obj.stdout.read()

stderr = obj.stderr.read()

print(len(stdout+stderr))

send_dic =

send_bytes = json.dumps(send_dic).encode('utf-8')

# 先製作字典的報頭

header = struct.pack('i',len(send_bytes))

# 傳送報頭

conn.send(header)

# 再發字典

conn.send(send_bytes)

# 最後再發真實資料

conn.send(stdout+stderr)

except connectionreseterror as e:

print(e)

break

conn.close()

server.close()

##客戶端

import socket

import struct

import json

client = socket.socket()

client.connect(('127.0.0.1',8080))

while true:

cmd = input('please input your cmd>>>:').encode('utf-8')

if len(cmd) == 0:continue

client.send(cmd)

# 先接收報頭

header = client.recv(4)

# 解析獲取字典的長度

dic_len = struct.unpack('i',header)[0]

dic_bytes = client.recv(dic_len)

real_dic = json.loads(dic_bytes.decode('utf-8'))

print(real_dic)

# 迴圈接收真實資料

data = b''

recv_size = 0

while recv_size < real_dic['total_size']:

info = client.recv(1024)

data += info

recv_size += len(info)

print(data.decode('gbk'))

實現大檔案上傳

###服務端

import socket

import struct

import json

from socket import sol_socket,so_reuseaddr

server = socket.socket()

server.setsockopt(sol_socket,so_reuseaddr,1)

server.bind(('127.0.0.1',8080))

server.listen(5)

conn,addr = server.accept()

# 先收4個長度報頭

header = conn.recv(4)

# 獲取字典長度

dic_len = struct.unpack('i',header)[0]

# 接收字典

dic_bytes = conn.recv(dic_len)

real_dic = json.loads(dic_bytes.decode('utf-8'))

# 獲取檔案相關資訊

file_name = real_dic.get('file_name')

total_size = real_dic.get("file_size")

with open(file_name,'wb') as f:

# 迴圈接收檔案

recv_size = 0

while recv_size < total_size:

data = conn.recv(1024)

f.write(data)

recv_size += len(data)

print('檔案上傳成功')

##客戶端

import socket

import struct

import json

import os

client = socket.socket()

client.connect(('127.0.0.1',8080))

file_path = r'd:\python週末四期\day11\1.時間模組.mp4'

file_size = os.path.getsize(file_path)  # 獲取檔案大小

send_dic =

send_bytes = json.dumps(send_dic).encode('utf-8')

# 製作報頭

head = struct.pack('i',len(send_bytes))

# 傳送報頭

client.send(head)

# 發字典

client.send(send_bytes)

# 發檔案

with open(file_path,'rb') as f:

for line in f:

client.send(line)

模擬遠端SSH執行命令的編譯碼說明

模擬乙個ssh 遠端 執行命令並獲取命令結果的乙個程式 1 在c s架構下,當客戶端與伺服器建立連線 這裡以tcp為例 後,二者可以不斷的進行資料互動。ssh遠端可以實現的效果是客戶端輸入命令可以在伺服器中執行並且可以將結果返回給客戶端。但是需要注意的一點事 客戶端的 命令 在計算機看來僅僅是 字串...

模擬ssh遠端執行命令

目錄python從入門到放棄完整教程目錄 from socket import import subprocess server socket af inet,sock stream server.bind 127.0.0.1 8000 server.listen 5 print start.whi...

模擬ssh遠端執行命令

from socket import import subprocess server socket af inet,sock stream server.bind 127.0.0.1 8000 server.listen 5 print start.while true conn,client a...